package org.incava.util.diff;
import com.google.common.base.Objects;
/**
* Represents a difference, as used in <code>Diff</code>. A difference consists of two
* pairs of starting and ending points, each pair representing either the "from" or the
* "to" collection passed to <code>Diff</code>. If an ending point is -1, then the
* difference was either a deletion or an addition. For example, if
* <code>getDeletedEnd()</code> returns -1, then the difference represents an addition.
*/
public class Difference {
public static final int NONE = -1;
/**
* The point at which the deletion starts.
*/
private int delStart = NONE;
/**
* The point at which the deletion ends.
*/
private int delEnd = NONE;
/**
* The point at which the addition starts.
*/
private int addStart = NONE;
/**
* The point at which the addition ends.
*/
private int addEnd = NONE;
/**
* Creates the difference for the given start and end points for the deletion and
* addition.
*/
public Difference(final int delStart, final int delEnd, final int addStart,
final int addEnd) {
this.delStart = delStart;
this.delEnd = delEnd;
this.addStart = addStart;
this.addEnd = addEnd;
}
/**
* The point at which the deletion starts, if any. A value equal to <code>NONE</code>
* means this is an addition.
*/
public int getDeletedStart() {
return delStart;
}
/**
* The point at which the deletion ends, if any. A value equal to <code>NONE</code>
* means this is an addition.
*/
public int getDeletedEnd() {
return delEnd;
}
/**
* The point at which the addition starts, if any. A value equal to <code>NONE</code>
* means this must be an addition.
*/
public int getAddedStart() {
return addStart;
}
/**
* The point at which the addition ends, if any. A value equal to <code>NONE</code>
* means this must be an addition.
*/
public int getAddedEnd() {
return addEnd;
}
/**
* Sets the point as deleted. The start and end points will be modified to include the
* given line.
*/
public void setDeleted(final int line) {
delStart = Math.min(line, delStart);
delEnd = Math.max(line, delEnd);
}
/**
* Sets the point as added. The start and end points will be modified to include the
* given line.
*/
public void setAdded(final int line) {
addStart = Math.min(line, addStart);
addEnd = Math.max(line, addEnd);
}
/**
* Compares this object to the other for equality. Both objects must be of type
* Difference, with the same starting and ending points.
*/
@Override
public boolean equals(final Object obj) {
if (obj instanceof Difference) {
final Difference other = (Difference) obj;
return delStart == other.delStart && delEnd == other.delEnd
&& addStart == other.addStart && addEnd == other.addEnd;
}
return false;
}
@Override
public int hashCode() {
return Objects.hashCode(delStart, delEnd, addStart, addEnd);
}
/**
* Returns a string representation of this difference.
*/
@Override
public String toString() {
final StringBuffer buf = new StringBuffer();
buf.append("del: [" + delStart + ", " + delEnd + "]");
buf.append(" ");
buf.append("add: [" + addStart + ", " + addEnd + "]");
return buf.toString();
}
}