litesoft
@ 821
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
// This Source Code is in the Public Domain per: http://litesoft.org/License.txt package org.litesoft.core.util; import java.util.*; import org.litesoft.core.typeutils.*; public class SizedIterator<T> extends AbstractReadOnlyIterator<T> implements Disposable { private final Long mSize; private Iterator<T> mIterator; // Note this is neither Volatile nor properly syncronized. If properly used, an old reference should not harm anything! public SizedIterator( long pSize ) { mSize = Longs.assertNonNegative( "Size", pSize ); mIterator = NullIterator.getInstance(); } public SizedIterator( Iterator<T> pIterator ) { mSize = null; if ( pIterator != null ) { mIterator = pIterator; } else { mIterator = NullIterator.getInstance(); } } /** * @return May be Null... */ public Long size() { return mSize; } @Override public boolean hasNext() { return mIterator.hasNext(); } @Override public T next() { return mIterator.next(); } private synchronized Iterator<T> replace( Iterator<T> pIterator ) { Iterator<T> rv = mIterator; mIterator = pIterator; return rv; } @Override public void dispose() { Iterator<T> zIterator = NullIterator.getInstance(); zIterator = replace( zIterator ); if ( zIterator instanceof Disposable ) { ((Disposable) zIterator).dispose(); } } @Override protected void finalize() throws Throwable { dispose(); super.finalize(); } } |