abstract class MeteredSorter<T extends Comparable<T>>
extends Sorter<T> implements IMetered {
private Meter meter;
private long startReading, endReading;
private long startTime, endTime;
// Constructors
public MeteredSorter() {
meter = new Meter();
}
public MeteredSorter(Meter m) {
meter = m;
}
// Private metering methods
private void startMetering() {
startReading = meter.reading();
startTime = System.nanoTime();
}
private void stopMetering() {
endTime = System.nanoTime();
endReading = meter.reading();
}
// IMetered methods
public boolean tick() {
meter.tick();
return true;
}
public long unitsCounted() {
return endReading - startReading;
}
public long timeConsumed() {
return endTime - startTime;
}
// ISort methods
public T[] sort(T[] seq)
throws IllegalArgumentException {
startMetering();
super.sort(seq);
stopMetering();
return seq;
}
public T[] sort(T[] seq, int from, int to)
throws IllegalArgumentException, IndexOutOfBoundsException {
startMetering();
super.sort(seq, from, to);
stopMetering();
return seq;
}
}