package sk.stuba.fiit.perconik.utilities.time;
import java.util.concurrent.TimeUnit;
import com.google.common.base.Ticker;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* A time source; returns a time value representing the number of milliseconds
* elapsed since some fixed but arbitrary point in time.
*
* <p><b>Note:</b> this interface can be used to measure both wall time or elapsed time.
*/
public abstract class TimeSource {
private static final TimeSource SYSTEM_TIME_SOURCE = new TimeSource() {
@Override
public long read() {
return System.currentTimeMillis();
}
};
/**
* Constructor for use by subclasses.
*/
protected TimeSource() {}
public static final TimeSource fromTicker(final Ticker ticker) {
if (ticker instanceof TimeSourceTicker) {
return ((TimeSourceTicker) ticker).source;
}
return new TickerTimeSource(ticker);
}
public static final Ticker toTicker(final TimeSource source) {
if (source instanceof TickerTimeSource) {
return ((TickerTimeSource) source).ticker;
}
return new TimeSourceTicker(source);
}
private static final class TickerTimeSource extends TimeSource {
final Ticker ticker;
TickerTimeSource(final Ticker ticker) {
this.ticker = checkNotNull(ticker);
}
@Override
public long read() {
return TimeUnit.NANOSECONDS.toMillis(this.ticker.read());
}
}
private static final class TimeSourceTicker extends Ticker {
final TimeSource source;
TimeSourceTicker(final TimeSource source) {
this.source = checkNotNull(source);
}
@Override
public long read() {
return TimeUnit.MILLISECONDS.toNanos(this.source.read());
}
}
/**
* A ticker that reads the current time using {@link System#currentTimeMillis}.
*/
public static final TimeSource systemTimeSource() {
return SYSTEM_TIME_SOURCE;
}
/**
* Returns the number of milliseconds elapsed since this ticker's fixed point of reference.
*/
public abstract long read();
}