/* * ElemPair.java 2004-11-18 * * Dirk Ansorge FernUniversitaet Hagen * */ package twodsack.setelement; import twodsack.setelement.datatype.*; import java.io.Serializable; /** * This class implements a pair of objects which must implement the interface {@link Element}. These objects * are stored in fields {@link #first} and {@link #second}. Provided in this class are methods {@link #equal(ElemPair)} * and {@link #equalOrInvertedEqual(ElemPair)}, which can be used to check for equality. Note, that both objects * stored in the fields must be of the same type (e.g. Segment) when using methods like {@link #equal(ElemPair)} or * {@link #compX(ElemPair)} etc. */ public class ElemPair implements Serializable { /* * fields */ /** * The first element of the pair. */ public Element first; /** * The second element of the pair. */ public Element second; /* * constructors */ /** * Standard constructor which fills in default values. */ public ElemPair(){ first = null; second = null; } /** * Sets {@link #first} and {@link #second} to the passed values. No elements are copied, just pointers are set. * * @param e1 the first element * @param e2 the second element */ public ElemPair(Element e1, Element e2) { first = e1; second = e2; } /* * methods */ /** * Makes a 'deep' copy of ElemPair, i.e. copies all fields. * * @return the copy of this */ public ElemPair copy(){ ElemPair copy = new ElemPair(); copy.first = (Element)first.copy(); copy.second = (Element)second.copy(); return copy; }//end method copy /** * Checks for equality of inEl and this. * Returns true for (a,b) and (a,b) but not for (a,b) and (b,a). * * @param inEl the object to compare with * @return true if equal, false otherwise * @see #equalOrInvertedEqual(ElemPair) */ public boolean equal(ElemPair inEl) { if (this.first.getClass() != inEl.first.getClass() || this.second.getClass() != inEl.second.getClass()) { return false; }//if else { if (this.first.equal(inEl.first) && this.second.equal(inEl.second)) { return true; }//if }//else return false; }//end method equal /** * Checks for equality of inEl and this. * Returns true for (a,b) and (a,b) and (a,b) and (b,a). * * @param inEl the object to compare with * @return true if equal, false otherwise * @see #equal(ElemPair) */ public boolean equalOrInvertedEqual (ElemPair inEl) { if (this.equal(inEl)) { return true; } else { if (this.first.getClass() != inEl.second.getClass() || this.second.getClass() != inEl.first.getClass()) { return false; }//if else { if (this.first.equal(inEl.second) && this.second.equal(inEl.first)) { return true; }//if }//else }//else return false; }//end method equalOrInvertedEqual /** * Prints {@link #first} and {@link #second} to standard output. * */ public void print () { System.out.println("first:"); first.print(); System.out.println("second:"); second.print(); }//end method print /** * Returns a value {-1,0,1} depending on the mutual position of two ElemPair instances. * Note, that the stored objectsin ElemPair must be of the same type, otherwise * a {@link WrongTypeException} is thrown. Both objects are compared by their x-coordinates in this * method. * * @param inPair the object to compare with * @return one of {-1,0,1} depending on the mutual position of both objects * @see #compY(ElemPair) * @see #compare(ElemPair) */ public byte compX (ElemPair inPair) throws WrongTypeException { byte res = this.first.compX(inPair.first); if (res == 0) { res = this.second.compX(inPair.second); } return res; }//end method compX /** * Returns a value {-1,0,1} depending on the mutual position of two ElemPair instances. * Note, that the stored objects in ElemPair must be of the same type, otherwise a * {@link WrongTypeException} is thrown. Both objects are compared by their y-coordinates in this * method. * * @param inPair the object to compare with * @return one of {-1,0,1} depending on the mutual position of both objects * @see #compX(ElemPair) * @see #compare(ElemPair) */ public byte compY (ElemPair inPair) throws WrongTypeException { byte res = this.first.compY(inPair.first); if (res == 0) { res = this.second.compY(inPair.second); } return res; }//end method compY /** * Returns a value {-1,0,1} depending on the mutual position of two ElemPair instances. * Note, that the stored objectsin ElemPair must be of the same type, otherwise * {@link WrongTypeException} is thrown. Both objects are compared by their x- and y-coordinates in this * method. * * @param inPair the object to compare with * @return one of {-1,0,1} depending on the mutual position of both objects * @see #compX(ElemPair) * @see #compY(ElemPair) */ public int compare (ElemPair inPair) throws WrongTypeException { int res = this.first.compare(inPair.first); if (res == 0) res = this.second.compare(inPair.second); return res; }//end method compare /** * Swaps the elements in both fields. * If (a,b) is twisted, (b,a) is the result. */ public void twist () { Element swap = this.first; this.first = this.second; this.second = swap; }//end method twist }//end class ElemPair