001: ///////////////////////////////////////////////////////////////////////////////
002: // Copyright (c) 2001, Eric D. Friedman All Rights Reserved.
003: //
004: // This library is free software; you can redistribute it and/or
005: // modify it under the terms of the GNU Lesser General Public
006: // License as published by the Free Software Foundation; either
007: // version 2.1 of the License, or (at your option) any later version.
008: //
009: // This library is distributed in the hope that it will be useful,
010: // but WITHOUT ANY WARRANTY; without even the implied warranty of
011: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: // GNU General Public License for more details.
013: //
014: // You should have received a copy of the GNU Lesser General Public
015: // License along with this program; if not, write to the Free Software
016: // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
017: ///////////////////////////////////////////////////////////////////////////////
018:
019: package gnu.trove;
020:
021: import java.util.ConcurrentModificationException;
022: import java.util.Iterator;
023: import java.util.NoSuchElementException;
024:
025: /**
026: * Implements all iterator functions for the hashed object set.
027: * Subclasses may override objectAtIndex to vary the object
028: * returned by calls to next() (e.g. for values, and Map.Entry
029: * objects).
030: *
031: * <p> Note that iteration is fastest if you forego the calls to
032: * <tt>hasNext</tt> in favor of checking the size of the structure
033: * yourself and then call next() that many times:
034: *
035: * <pre>
036: * Iterator i = collection.iterator();
037: * for (int size = collection.size(); size-- > 0;) {
038: * Object o = i.next();
039: * }
040: * </pre>
041: *
042: * <p>You may, of course, use the hasNext(), next() idiom too if
043: * you aren't in a performance critical spot.</p>
044: *
045: */
046: abstract class THashIterator<V> extends TIterator implements
047: Iterator<V> {
048: private final TObjectHash _object_hash;
049:
050: /**
051: * Create an instance of THashIterator over the values of the TObjectHash
052: */
053: public THashIterator(TObjectHash hash) {
054: super (hash);
055: _object_hash = hash;
056: }
057:
058: /**
059: * Moves the iterator to the next Object and returns it.
060: *
061: * @return an <code>Object</code> value
062: * @exception ConcurrentModificationException if the structure
063: * was changed using a method that isn't on this iterator.
064: * @exception NoSuchElementException if this is called on an
065: * exhausted iterator.
066: */
067: public V next() {
068: moveToNextIndex();
069: return objectAtIndex(_index);
070: }
071:
072: /**
073: * Returns the index of the next value in the data structure
074: * or a negative value if the iterator is exhausted.
075: *
076: * @return an <code>int</code> value
077: * @exception ConcurrentModificationException if the underlying
078: * collection's size has been modified since the iterator was
079: * created.
080: */
081: protected final int nextIndex() {
082: if (_expectedSize != _hash.size()) {
083: throw new ConcurrentModificationException();
084: }
085:
086: Object[] set = _object_hash._set;
087: int i = _index;
088: while (i-- > 0
089: && (set[i] == TObjectHash.FREE || set[i] == TObjectHash.REMOVED))
090: ;
091: return i;
092: }
093:
094: /**
095: * Returns the object at the specified index. Subclasses should
096: * implement this to return the appropriate object for the given
097: * index.
098: *
099: * @param index the index of the value to return.
100: * @return an <code>Object</code> value
101: */
102: abstract protected V objectAtIndex(int index);
103: } // THashIterator
|