1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
package structures;
import java.util.Arrays;
import dna.AminoAcid;
import shared.Tools;
public class SeqCount implements Comparable<SeqCount>, Cloneable {
/*--------------------------------------------------------------*/
/*---------------- Constructors ----------------*/
/*--------------------------------------------------------------*/
public SeqCount(byte[] s, int start, int stop) {
synchronized(this) {
bases=Arrays.copyOfRange(s, start, stop);
synchronized(bases) {
Tools.canonize(bases);
hashcode=Tools.hash(bases, 22);
}
}
}
public SeqCount(byte[] bases_) {
synchronized(this) {
bases=bases_;
synchronized(bases) {
Tools.canonize(bases);
hashcode=Tools.hash(bases, 22);
}
}
}
@Override
public SeqCount clone() {
synchronized(this) {
try {
SeqCount clone=(SeqCount) super.clone();
// assert(clone.equals(this));
return clone;
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
}
/*--------------------------------------------------------------*/
/*---------------- Methods ----------------*/
/*--------------------------------------------------------------*/
// public void add(SeqCount s) {
// throw new RuntimeException("This class is immutable.");
// }
//
// public void increment(int x) {
// throw new RuntimeException("This class is immutable.");
// }
public int count() {return 1;}
/*--------------------------------------------------------------*/
/*---------------- Inherited Methods ----------------*/
/*--------------------------------------------------------------*/
@Override
public final boolean equals(Object s) {
return equals((SeqCount)s);
}
public final boolean equals(SeqCount s) {
if(s==null) {return false;}
// synchronized(this) {
// synchronized(s) {
// synchronized(bases) {
// synchronized(s.bases) {
if(hashcode!=s.hashcode) {
// assert(!Tools.equals(bases, s.bases)) : new String(bases)+", "+new String(s.bases)+", "+hashcode+", "+s.hashcode;
return false;
}
return Tools.equals(bases, s.bases);
// }
// }
// }
// }
}
@Override
public int compareTo(SeqCount s) {
if(count()!=s.count()) {return count()-s.count();}
if(bases.length!=s.bases.length) {return bases.length-s.bases.length;}
return Tools.compare(bases, s.bases);
}
@Override
public final int hashCode() {
return hashcode;
}
@Override
public String toString() {
return getClass()+"@"+super.hashCode()+"="+Integer.toString(count());
}
/*--------------------------------------------------------------*/
/*---------------- Fields ----------------*/
/*--------------------------------------------------------------*/
public final byte[] bases;
public final int hashcode;
/*--------------------------------------------------------------*/
/*---------------- Static Fields ----------------*/
/*--------------------------------------------------------------*/
public static final byte[] symbolToNumber=AminoAcid.baseToNumber;
public static final byte[] symbolToComplementNumber=AminoAcid.baseToComplementNumber;
public static final byte[] symbolToNumber0=AminoAcid.baseToNumber0;
}
|