1 22 23 24 package com.mchange.v1.util; 25 26 import java.util.*; 27 import com.mchange.v1.util.DebugUtils; 28 29 33 public abstract class WrapperIterator implements Iterator 34 { 35 protected final static Object SKIP_TOKEN = new Object (); 36 37 final static boolean DEBUG = true; 38 39 Iterator inner; 40 boolean supports_remove; 41 Object lastOut = null; 42 Object nextOut = SKIP_TOKEN; 43 44 public WrapperIterator(Iterator inner, boolean supports_remove) 45 { 46 this.inner = inner; 47 this.supports_remove = supports_remove; 48 } 49 50 public WrapperIterator(Iterator inner) 51 { this( inner, false ); } 52 53 public boolean hasNext() 54 { 55 findNext(); 56 return nextOut != SKIP_TOKEN; 57 } 58 59 private void findNext() 60 { 61 if (nextOut == SKIP_TOKEN) 62 { 63 while (inner.hasNext() && nextOut == SKIP_TOKEN) 64 this.nextOut = transformObject( inner.next() ); 65 } 66 } 67 68 public Object next() 69 { 70 findNext(); 71 if (nextOut != SKIP_TOKEN) 72 { 73 lastOut = nextOut; 74 nextOut = SKIP_TOKEN; 75 } 76 else 77 throw new NoSuchElementException(); 78 79 if (DEBUG) 81 DebugUtils.myAssert( nextOut == SKIP_TOKEN && lastOut != SKIP_TOKEN ); 82 return lastOut; 83 } 84 85 public void remove() 86 { 87 if (supports_remove) 88 { 89 if (nextOut != SKIP_TOKEN) 90 throw new UnsupportedOperationException (this.getClass().getName() + 91 " cannot support remove after" + 92 " hasNext() has been called!"); 93 if (lastOut != SKIP_TOKEN) 94 inner.remove(); 95 else 96 throw new NoSuchElementException(); 97 } 98 else 99 throw new UnsupportedOperationException (); 100 } 101 102 108 protected abstract Object transformObject(Object o); 109 } 110 111 112 113 114 115 116 | Popular Tags |