001    /*
002     * LAPIS lightweight structured text processing system
003     *
004     * Copyright (C) 2003 Massachusetts Institute of Technology.
005     * All rights reserved.
006     *
007     * This library is free software; you can redistribute it
008     * and/or modify it under the terms of the GNU General
009     * Public License as published by the Free Software
010     * Foundation, version 2.
011     *
012     * LAPIS homepage: http://graphics.lcs.mit.edu/lapis/
013     */
014    
015    package lapisx.iterator;
016    
017    import java.util.*;
018    
019    /**
020     * Concatenates two or more Iterators.
021     */
022    public class ConcatIterator implements Iterator {
023        Iterator g;
024        Iterator otherIterators;
025        
026        private static Iterator EMPTY = Collections.EMPTY_LIST.iterator ();
027        
028        /**
029         * Make a concatenation of two iterators. 
030         * @param g1 First iterator
031         * @param g2 Second iterator
032         */
033        public ConcatIterator (Iterator g1, Iterator g2) {
034            g = g1;
035            otherIterators = Collections.singleton (g2).iterator ();
036        }
037        
038        /**
039         * Make a concatenation of a collection of iterators.
040         * @param iterators collection of iterators to concatenate
041         * @throws ClassCastException if the first element of iterators doesn't implement Iterator
042         */
043        public ConcatIterator (Collection iterators) {
044            otherIterators = iterators.iterator ();
045            if (otherIterators.hasNext ())
046                g = (Iterator) otherIterators.next ();
047            else
048                g = EMPTY;
049        }
050        
051        public boolean hasNext() {
052            if (g.hasNext ())
053                return true;
054            while (otherIterators.hasNext ()) {
055                g = (Iterator) otherIterators.next ();
056                if (g.hasNext ())
057                    return true;
058            }
059            return false;
060        }
061    
062       public Object next() {
063            while (true) {
064                try {
065                    return g.next();
066                } catch (NoSuchElementException e) {
067                    if (otherIterators.hasNext ())
068                        g = (Iterator) otherIterators.next ();
069                    else
070                        throw e;
071                }
072            }
073        }
074        
075        public void remove () {
076            g.remove ();
077        }
078    }