/* $RCSfile$
* $Author$
* $Date$
* $Revision$
*
* Copyright (C) 2002-2007 The Chemistry Development Kit (CDK) Project
*
* Contact: cdk-devel@lists.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
* All we ask is that proper credit is given for our work, which includes
* - but is not limited to - adding the above copyright notice to the beginning
* of your source code files, and to any copyright notice that you may distribute
* with programs based on this work.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
* */
package org.openscience.cdk.smiles;
import org.openscience.cdk.annotations.TestClass;
import org.openscience.cdk.annotations.TestMethod;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.math.Primes;
/**
* This is used to hold the invariance numbers for the canonical labeling of
* {@link IAtomContainer}s.
*
* @cdk.module standard
* @cdk.githash
*/
@TestClass("org.openscience.cdk.smiles.InvPairTest")
public class InvPair implements java.io.Serializable{
private static final long serialVersionUID = -1397634098919863122L;
/** The description used to set the invariance numbers in the atom's property*/
public final static String INVARIANCE_PAIR = "InvariancePair";
public final static String CANONICAL_LABEL = "CanonicalLable";
private long last = 0;
private long curr = 0;
private IAtom atom;
private int prime;
public InvPair() {
}
public InvPair(long c, IAtom a){
curr = c;
atom = a;
a.setProperty(INVARIANCE_PAIR, this);
}
@TestMethod("testGetLast")
public long getLast() {
return last;
}
/**
* Set the value of the seed.
* <p/>
* Note that use of this method implies that a new prime number is desired.
* If so, make sure to call {@link #setPrime()} to ensure that a new prime
* number is obtained using the new seed.
* <p/>
* Todo make the following robust!
*
* @see #getCurr()
* @see #setPrime()
*/
@TestMethod("testSetCurr_long")
public void setCurr(long newCurr) {
curr = newCurr;
}
/**
* Get the current seed.
*
* @return The seed
* @see #setCurr(long)
* @see #setPrime()
* @see #getPrime()
*/
@TestMethod("testGetCurr")
public long getCurr() {
return curr;
}
/**
* Check whether this instance equals another instance.
*
* @param e An instance of InvPair
* @return true if they are equal, false otherwise
*/
@TestMethod("testEquals_Object")
public boolean equals(Object e) {
if (e instanceof InvPair) {
InvPair o = (InvPair) e;
// logger.debug("Last " + last + "o.last " + o.getLast() + " curr " + curr + " o.curr " + o.getCurr() + " equals " +(last == o.getLast() && curr == o.getCurr()));
return (last == o.getLast() && curr == o.getCurr());
} else {
return false;
}
}
@TestMethod("testSetLast_long")
public void setLast(long newLast) {
last = newLast;
}
@TestMethod("testSetAtom_IAtom")
public void setAtom(IAtom newAtom) {
atom = newAtom;
}
@TestMethod("testGetAtom")
public IAtom getAtom() {
return atom;
}
@TestMethod("testCommit")
public void commit() {
atom.setProperty(CANONICAL_LABEL, Long.valueOf(curr));
}
/**
* String representation.
*
* @return The string representation of the class.
*/
@TestMethod("testToString")
public String toString() {
StringBuffer buff = new StringBuffer();
buff.append(curr);
buff.append("\t");
return buff.toString();
}
/**
* Get the current prime number.
*
* @return The current prime number
* @see #setPrime()
*/
@TestMethod("testGetPrime")
public int getPrime() {
return prime;
}
/**
* Sets the prime number based on the current seed.
* <p/>
* Note that if you change the seed via {@link #setCurr(long)}, you should make
* sure to call this method so that a new prime number is available via
* {@link #getPrime()}
*
* @see #setCurr(long)
* @see #getPrime()
*/
@TestMethod("testSetPrime")
public void setPrime() {
prime = Primes.getPrimeAt((int) curr - 1);
}
}