gatk-3.8/java/src/org/broadinstitute/sting/playground/utils/CountedObject.java

60 lines
2.2 KiB
Java
Executable File

package org.broadinstitute.sting.playground.utils;
/** Utility class that makes working with counted objects slightly easier (and faster).
* Consider a "generic" counter representation as Map<Object,Integer>: updating the counter would require
* int i = map.get(obj).intValue(); i++; map.set(obj,i) - cumbersome, and also inefficient due to extra invocations of Integer
* constructor. This ObjectCounter class can increment its internally kept counter without the need to rebuild any objects,
* so one can use, e.g. "Set<CountedObject> myset;" and then "myset.get(obj).increment()". Note that equals() method
* defines counted objects to be the same iff the underlying objects are equal, regardless of the
* counter value. Should the counters be compared, one has to use the getters on the two counted objects
* and compare the results.
* @author asivache
*
*/
public class CountedObject<T> {
private T mObject;
int mCounter;
/** Creates new counter associated with the passed object and assigns the default count of 1
*
* @param o object to start counting for
*/
public CountedObject(T o) {
assert o!=null : "Can not create counted object over null";
mObject = o;
mCounter = 1;
}
/** Creates new counter associated with the object o and assigns specified initial count to it
*
* @param o object to start counting for
* @param n initial count
*/
public CountedObject(T o, int n) {
assert o!=null : "Can not create counted object over null";
mObject = o;
mCounter = n;
}
public T getObject() { return mObject; }
public int getCount() { return mCounter; }
public void increment() { mCounter++;}
public void increment(int n) { mCounter+=n; }
public void decrement() { mCounter--; }
public void decrement(int n) { mCounter -= n; }
@Override
public boolean equals(Object o) {
if ( this == o ) return true;
if ( ! ( o instanceof CountedObject ) ) return false;
if ( ((CountedObject)o).mObject.getClass() != this.mObject.getClass() ) return false;
return mObject.equals(((CountedObject<T>)o).getObject());
}
@Override
public int hashCode() {
return mObject.hashCode();
}
}