public void addOp(T o) { TraceElement<T> op = new TraceElement<T>(o); if (lastElement == null) { lastElement = op; } else { assert lastElement.stateId == 0; op.prevElement = lastElement; lastElement = op; } }
public T getLastOp() { if (lastElement != null) { return lastElement.getOp(); } return null; }
@Override public void stateAdvanced(Search search) { if (search.isNewState() && (lastElement != null)) { int stateId = search.getStateId(); for (TraceElement<T> op = lastElement; op != null; op = op.prevElement) { assert op.stateId == 0; op.stateId = stateId; } lastElement.prevTransition = lastTransition; lastTransition = lastElement; } lastElement = null; }
public List<T> getOps() { // this is a rather braindead way around the limitation that we can't explicitly // create an T[] array object ArrayList<T> list = new ArrayList<T>(); for (TraceElement<T> te = lastElement; te != null; te = te.prevElement) { list.add(te.getOp()); } // reverse for (int i = 0, j = list.size() - 1; i < j; i++, j--) { T tmp = list.get(j); list.set(j, list.get(i)); list.set(i, tmp); } return list; }
@Override public Trace clone() { TraceElement<T> e0 = null, eLast = null; for (TraceElement<T> e = lastElement; e != null; e = e.prevElement) { TraceElement<T> ec = e.clone(); if (eLast != null) { eLast.prevElement = ec; eLast = ec; } else { e0 = eLast = ec; } } Trace<T> t = new Trace<T>(); t.lastElement = e0; return t; }