1 33 package net.sf.jga.util; 34 35 import java.lang.reflect.Array ; 36 import java.util.ArrayList ; 37 import java.util.NoSuchElementException ; 38 import java.util.Iterator ; 39 40 48 49 public class LookAheadIterator<T> implements Iterator <T>, Iterable <T> { 50 private Iterator <? extends T> _base; 52 53 private Object [] _buffer; 56 57 private int _readptr = 0; 59 60 private int _writeptr = 0; 62 63 private int _cnt = 0; 65 66 private int _size; 68 69 72 73 public LookAheadIterator (Iterator <? extends T> base) { 74 this(base, 1); 75 } 76 77 83 84 public LookAheadIterator (Iterator <? extends T> base, int max) { 85 if (max <= 0) 86 throw new IllegalArgumentException (); 87 88 _base = (base != null) ? base : new EmptyIterator<T>(); 89 _size = max; 90 91 _buffer = new Object [_size]; 92 } 93 94 103 104 public boolean hasNextPlus(int n) { 105 if (n < 0 || n > _size) 106 throw new IllegalArgumentException (); 107 108 if (n == 0) 109 return hasNext(); 110 111 return readAhead(n); 112 } 113 114 124 125 public T peek(int n) { 126 if (n < 0 || n > _size) 127 throw new IllegalArgumentException (); 128 129 if (!readAhead(n)) { 130 throw new NoSuchElementException (); 131 } 132 133 int offset = (_readptr + n - 1) % _size; 134 135 140 return (T) _buffer[offset]; 141 } 142 143 146 public int getMaxPeekSize() { 147 return _size; 148 } 149 150 154 public Iterator <T> iterator() { return this; } 155 156 160 public boolean hasNext() { 161 if (_cnt > 0) 162 return true; 163 else 164 return _base.hasNext(); 165 } 166 167 public T next() { 168 if (_cnt == 0) 169 return _base.next(); 170 171 176 T value = (T) _buffer[_readptr]; 177 _readptr = advance(_readptr); 178 _cnt--; 179 180 return value; 181 } 182 183 185 public void remove() { throw new UnsupportedOperationException (); } 186 187 private boolean readAhead(int n) { 188 if (n <= _cnt) 189 return true; 190 191 while (n > _cnt &&_base.hasNext()) { 192 _buffer[_writeptr] = (T) _base.next(); 196 197 _cnt++; 198 _writeptr = advance(_writeptr); 199 } 200 201 return n == _cnt; 202 } 203 204 private int advance(int n) { 205 return ++n % _size; 206 } 207 } 208 | Popular Tags |