package jrummikub.ai.fdsolver; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; public class Var { private Solver solver; private HashSet range; public Var(Solver solver, Collection range) { this.solver = solver; this.range = new HashSet(range); } public T getValue() { if (range.size() != 1) return null; return range.iterator().next(); } public HashSet getRange() { return range; } public void choose(T value) { for (Iterator i = this.iterator(); i.hasNext();) { if (i.next() != value) { i.remove(); } } } public void makeDirty() { this.solver.dirtyVars.add(this); } public void invalidate(T value) { range.remove(value); solver.logInvalidation(this, value); makeDirty(); } public Iterator iterator() { final Iterator iterator = range.iterator(); return new Iterator() { T lastValue; @Override public boolean hasNext() { return iterator.hasNext(); } @Override public T next() { lastValue = iterator.next(); return lastValue; } @Override public void remove() { // TODO logging iterator.remove(); solver.logInvalidation(Var.this, lastValue); makeDirty(); if (range.size() == 0) { solver.contradiction = true; } } }; } @Override public String toString() { return "Var" + range; } }