package lbms.plugins.mldht.kad.tasks;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.stream.Collectors;
final class TaskStats implements Cloneable {
private final int[] counters;
public TaskStats() {
counters = new int[CountedStat.values().length];
}
private TaskStats(int[] c) {
counters = c;
}
void invariants() {
assert(get(CountedStat.SENT) >= get(CountedStat.STALLED) + get(CountedStat.FAILED) + get(CountedStat.RECEIVED));
assert(Arrays.stream(counters).noneMatch(i -> i < 0));
}
public TaskStats update(EnumSet<CountedStat> inc, EnumSet<CountedStat> dec, EnumSet<CountedStat> zero) {
TaskStats p = this.clone();
for (CountedStat counter : inc) {
p.counters[counter.ordinal()]++;
}
for (CountedStat counter : dec) {
p.counters[counter.ordinal()]--;
}
for (CountedStat counter : zero) {
p.counters[counter.ordinal()]=0;
}
p.invariants();
return p;
}
public int get(CountedStat c) {
return counters[c.ordinal()];
}
@Override
protected TaskStats clone() {
return new TaskStats(counters.clone());
}
public int done() {
return get(CountedStat.FAILED) + get(CountedStat.RECEIVED);
}
public int activeOnly() {
return unanswered() - currentStalled();
}
public int currentStalled() {
return get(CountedStat.STALLED);
}
public int unanswered() {
return get(CountedStat.SENT) - done();
}
@Override
public String toString() {
String coreVals = Arrays.stream(CountedStat.values()).map(st -> st.toString() + ":" + get(st)).collect(Collectors.joining(" "));
return coreVals + " activeOnly:" + activeOnly() + " unanswered:" + unanswered();
}
}