/**
* The utillib library.
* More information is available at http://www.jinchess.com/.
* Copyright (C) 2003 Alexander Maryanovsky.
* All rights reserved.
*
* The utillib library is free software; you can redistribute
* it and/or modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* The utillib library is distributed in the hope that it will
* be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with utillib library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
import java.util.Enumeration;
import java.util.NoSuchElementException;
/**
* An implementation of the <code>Enumeration</code> interface which delegates
* to another <code>Enumeration</code>, but only returns elements which pass
* the {@link #accept(Object)} method.
*/
public abstract class FilteringEnumeration implements Enumeration{
/**
* The delegate enumeration.
*/
private final Enumeration delegate;
/**
* The next element we'll return. This is set by the <code>findNext</code>
* method.
*/
private Object next = null;
/**
* Creates a new <code>FilteringEnumeration</code> object with the specified
* delegate.
*/
public FilteringEnumeration(Enumeration delegate){
this.delegate = delegate;
}
/**
* Finds the next element in the delegate enumeration which passes
* <code>accept</code> and puts it in <code>next</code>.
*/
private void findNext(){
if (next != null)
return;
while (delegate.hasMoreElements()){
Object element = delegate.nextElement();
if (accept(element)){
next = element;
break;
}
}
}
/**
* Returns whether there are more elements in this <code>Enumeration</code>.
*/
public boolean hasMoreElements(){
findNext();
return next != null;
}
/**
* Returns the next element in the delegate enumeration which passes the
* <code>accept</code> method.
*/
public Object nextElement() throws NoSuchElementException{
findNext();
if (next == null)
throw new NoSuchElementException();
Object result = next;
next = null;
return result;
}
/**
* Returns whether the specified object passes the filter.
*/
public abstract boolean accept(Object element);
}
|