001 /*
002 * LAPIS lightweight structured text processing system
003 *
004 * Copyright (C) 1998-2002 Carnegie Mellon University,
005 * Copyright (C) 2003 Massachusetts Institute of Technology.
006 * All rights reserved.
007 *
008 * This library is free software; you can redistribute it
009 * and/or modify it under the terms of the GNU General
010 * Public License as published by the Free Software
011 * Foundation, version 2.
012 *
013 * LAPIS homepage: http://graphics.lcs.mit.edu/lapis/
014 */
015
016
017 package lapisx.enum;
018 import java.util.Enumeration;
019 import java.util.NoSuchElementException;
020 import java.util.Vector;
021
022 /**
023 * Enumeration which transforms the elements of another enumeration.
024 */
025 public abstract class FilteredEnumeration implements Enumeration {
026 Enumeration e;
027 Object o; // first object waiting to be returned, or null if none
028 Vector v; // other objects yielded and waiting to be returned
029 int i; // next object to return from v
030
031 public FilteredEnumeration (Enumeration e) {
032 this.e = e;
033 }
034
035 public boolean hasMoreElements () {
036 next ();
037 return o != null;
038 }
039
040 public Object nextElement () {
041 next ();
042 if (o == null)
043 throw new NoSuchElementException ();
044 Object result = o;
045 o = null;
046 return result;
047 }
048
049 void next () {
050 // check if yielded element is waiting to be returned
051 if (o != null)
052 return;
053
054 // check in v for other yielded elements
055 if (v != null) {
056 if (i < v.size ()) {
057 o = v.elementAt (i);
058 v.setElementAt (null, i);
059 ++i;
060 } else {
061 v.setSize (0);
062 i = 0;
063 }
064 }
065
066 // transform elements until an element is yielded
067 while (o == null && e.hasMoreElements ())
068 transform (e.nextElement ());
069 }
070
071 public void yield (Object obj) {
072 if (o == null)
073 o = obj;
074 else {
075 if (v == null)
076 v = new Vector ();
077 v.addElement (obj);
078 }
079 }
080
081 public abstract void transform (Object o);
082 }