// Copyright 2015 Thomas Müller // This file is part of MarMoT, which is licensed under GPLv3. package marmot.util.edit; import marmot.util.Counter; public class ReplaceNode implements EditTree { private static final long serialVersionUID = 1L; private String input_; private String output_; public ReplaceNode(String input, String output) { input_ = input; output_ = output; } @Override public String toString() { return String.format("r(%s, %s)", input_, output_); } @Override public double getCost(EditTreeBuilder builder) { double count = builder.getCounter().count(toString()) + 1; double cost = (input_.length() + output_.length()) / count; return cost; } @Override public void increment(Counter<String> counter) { counter.increment(toString(), 1.0); } @Override public String apply(String input, int start, int end) { assert start >= 0; assert end <= input.length(); int length = end - start; if (length != input_.length()) { return null; } if (!input.substring(start, end).equals(input_)) { return null; } return output_; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((input_ == null) ? 0 : input_.hashCode()); result = prime * result + ((output_ == null) ? 0 : output_.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ReplaceNode other = (ReplaceNode) obj; if (input_ == null) { if (other.input_ != null) return false; } else if (!input_.equals(other.input_)) return false; if (output_ == null) { if (other.output_ != null) return false; } else if (!output_.equals(other.output_)) return false; return true; } @Override public int getFixedInputLength() { return input_.length(); } @Override public int getFixedOutputLength() { return output_.length(); } }