package net.sourceforge.pain.db; import java.util.*; /** * PAiN Date: 30.03.2003 Time: 20:59:37 */ final class DbExtentIterator implements Iterator { private final DbClassImpl dbClass; private DbObject current; private int modCount; private final boolean weak; private boolean currentRemoved; DbExtentIterator(final DbClassImpl dbClass, boolean weak) { this.weak = weak; this.dbClass = dbClass; current = null; modCount = dbClass.modCount; currentRemoved = false; } public boolean hasNext() { checkState(); return (current==null && dbClass.firstInExtent!=null) || (current!=null && current.next != null); } private void checkState() { dbClass.checkDbState(); if (!weak && dbClass.modCount != modCount) { throw new ConcurrentModificationException(); } } public Object next() { checkState(); if (current == null) { if (dbClass.firstInExtent == null) { throw new NoSuchElementException(); } current = dbClass.firstInExtent; } else { if (current.next == null) { throw new NoSuchElementException(); } current = current.next; } if (weak) { dbClass.weakIteratorReassign(this, current); } return current; } public void remove() { checkState(); if (current == null) { //its possible if weak == true and currentRemoved is also true throw new IllegalStateException(); } final DbObject victim = current; current = current.prev; if (weak) { dbClass.weakIteratorReassign(this, current); } victim.delete(); modCount = dbClass.modCount; } protected void onCurrentDelete() { assert weak; if (current!=null) { //possible if currentRemoved is true current = current.next; } dbClass.weakIteratorReassign(this, current); currentRemoved = true; } }