package jalview.datamodel; /** * An immutable object representing one or more residue and corresponding * alignment column positions for a sequence */ public class SequenceCursor { /** * the aligned sequence this cursor applies to */ public final SequenceI sequence; /** * residue position in sequence (start...), 0 if undefined */ public final int residuePosition; /** * column position (1...) corresponding to residuePosition, or 0 if undefined */ public final int columnPosition; /** * a token which may be used to check whether this cursor is still valid for * its sequence (allowing it to be ignored if the sequence has changed) */ public final int token; /** * Constructor * * @param seq * sequence this cursor applies to * @param resPos * residue position in sequence (start..) * @param column * column position in alignment (1..) * @param tok * a token that may be validated by the sequence to check the cursor * is not stale */ public SequenceCursor(SequenceI seq, int resPos, int column, int tok) { sequence = seq; residuePosition = resPos; columnPosition = column; token = tok; } @Override public int hashCode() { int hash = 31 * residuePosition; hash = 31 * hash + columnPosition; hash = 31 * hash + token; if (sequence != null) { hash += sequence.hashCode(); } return hash; } /** * Two cursors are equal if they refer to the same sequence object and have * the same residue position, column position and token value */ @Override public boolean equals(Object obj) { if (!(obj instanceof SequenceCursor)) { return false; } SequenceCursor sc = (SequenceCursor) obj; return sequence == sc.sequence && residuePosition == sc.residuePosition && columnPosition == sc.columnPosition && token == sc.token; } @Override public String toString() { return (sequence == null ? "" : sequence.getName()) + ":Pos" + residuePosition + ":Col" + columnPosition + ":tok" + token; } }