View Javadoc

1   package sharin.unlinq;
2   
3   import java.util.Iterator;
4   import java.util.LinkedList;
5   import java.util.NoSuchElementException;
6   import java.util.Queue;
7   
8   public abstract class QueuedIterator<T, E, R> implements Iterator<R> {
9   
10      private final Iterator<T> iterator;
11  
12      private Queue<E> queue = new LinkedList<E>();
13  
14      public QueuedIterator(Iterator<T> iterator) {
15          this.iterator = iterator;
16      }
17  
18      protected abstract void addElement(Queue<E> queue, T t);
19  
20      protected abstract R toResult(E e);
21  
22      public boolean hasNext() {
23  
24          // if done
25          if (queue == null) {
26              return false;
27          }
28  
29          // if reserved
30          if (!queue.isEmpty()) {
31              return true;
32          }
33  
34          while (iterator.hasNext()) {
35              addElement(queue, iterator.next());
36  
37              if (!queue.isEmpty()) {
38                  return true;
39              }
40          }
41  
42          // done
43          queue = null;
44          return false;
45      }
46  
47      public R next() {
48  
49          // done
50          if (queue == null) {
51              throw new NoSuchElementException();
52          }
53  
54          // unreserved
55          if (queue.isEmpty()) {
56  
57              if (!hasNext()) {
58                  throw new NoSuchElementException();
59              }
60          }
61  
62          return toResult(queue.remove());
63      }
64  
65      public void remove() {
66          throw new UnsupportedOperationException();
67      }
68  }