package net.tuis.ubench;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.IntFunction;
import java.util.function.Supplier;
class ScaleControl<T> {
private final Map<Integer, Supplier<T>> sources = new HashMap<>(32);
private final boolean reusedata;
private final IntFunction<T> scaler;
private final Consumer<T> function;
public ScaleControl(Consumer<T> function, IntFunction<T> scaler, boolean reusedata) {
this.function = function;
this.reusedata = reusedata;
this.scaler = scaler;
}
private Supplier<T> getStaticData(final T data) {
return () -> data;
}
private Supplier<T> dataSupply(final int scale) {
return sources.computeIfAbsent(scale, key -> reusedata ? getStaticData(scaler.apply(scale)) : () -> scaler.apply(scale));
}
public TaskRunner buildTask(final String name, final int scale) {
Task task = () -> {
T data = dataSupply(scale).get();
long start = System.nanoTime();
function.accept(data);
long time = System.nanoTime() - start;
return time;
};
return new TaskRunner(name, task, scale, 1000000, 0, 0, TimeUnit.SECONDS.toNanos(1));
}
}