package explicit; import java.util.BitSet; import java.util.Objects; /** * An AccumulationState contains a reference to an AccumulationTracker, * a pointer to the latest restart and the numberOfTracks in the tracker. * It can optionally contain a BitSet marking the goodTracks. * * @author Sascha Wunderlich * */ public class AccumulationState { protected final int trackerId; protected int lastRestartNr; protected int numberOfTracks; protected BitSet goodTracks; public AccumulationState(int trackerId, int lastRestartNr, int numberOfTracks, BitSet goodTracks) { this(trackerId, lastRestartNr, numberOfTracks); this.goodTracks = goodTracks; } public AccumulationState(int trackerId, int lastRestartNr, int numberOfTracks) { super(); this.trackerId = trackerId; this.lastRestartNr = lastRestartNr; this.numberOfTracks = numberOfTracks; this.goodTracks = new BitSet(); } public int getTrackerId() { return trackerId; } public AccumulationTracker getTracker(StoragePool> trackers) { return trackers.getById(trackerId); } public int getNextRestartNr() { return (lastRestartNr + 1) % numberOfTracks; } public boolean importantTrackIsGood() { return goodTracks.get(getNextRestartNr()); } public BitSet getGoodTracks() { return goodTracks; } @Override public int hashCode() { return Objects.hash(goodTracks, lastRestartNr, numberOfTracks, trackerId); } @SuppressWarnings("rawtypes") @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; AccumulationState other = (AccumulationState) obj; return Objects.equals(goodTracks, other.goodTracks) && lastRestartNr == other.lastRestartNr && numberOfTracks == other.numberOfTracks && trackerId == other.trackerId; } @Override public String toString() { StringBuffer result = new StringBuffer(); result.append("S"); result.append(trackerId); return result.toString(); } }