Sunday, February 12, 2017

MeteredSearcher

abstract class MeteredSearcher<T extends Comparable<T>>
extends Searcher<T> implements IMetered {

  private Meter meter;
  private long startReading, endReading;
  private long startTime, endTime;

  // Constructors

  public MeteredSearcher() {
    meter = new Meter();
  }
  public MeteredSearcher(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;
  }

  // ISearch methods

  public int find(T[] seq, T key)
  throws IllegalArgumentException {
    int result;
    startMetering();
    result = super.find(seq, key);
    stopMetering();
    return result;
  }

  public int find(T[] seq, T key, int from, int to)
  throws IllegalArgumentException, IndexOutOfBoundsException {
    int result;
    startMetering();
    result = super.find(seq, key, from, to);
    stopMetering();
    return result;
  }
}