EMMA Coverage Report (generated Sat May 17 10:56:07 GMT 2008)
[all classes][spiffy.core.util]

COVERAGE SUMMARY FOR SOURCE FILE [PushBackIterator.java]

nameclass, %method, %block, %line, %
PushBackIterator.java100% (1/1)100% (5/5)100% (68/68)100% (18/18)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class PushBackIterator100% (1/1)100% (5/5)100% (68/68)100% (18/18)
PushBackIterator (Iterator): void 100% (1/1)100% (12/12)100% (5/5)
hasNext (): boolean 100% (1/1)100% (11/11)100% (1/1)
next (): Object 100% (1/1)100% (19/19)100% (5/5)
pushBack (): void 100% (1/1)100% (21/21)100% (6/6)
remove (): void 100% (1/1)100% (5/5)100% (1/1)

1package spiffy.core.util;
2 
3import java.util.Iterator;
4 
5/**
6 * The PushBackIterator enables you to iterate and push back elements should you find that "you have come to far". You
7 * can push elements back in the iterator which then will be re-visited upon the subsequent call to <tt>next()</tt>
8 * 
9 * @author Kasper B. Graversen
10 */
11public class PushBackIterator<T> implements Iterator<T> {
12        /** the iterator we wrap */
13        private final Iterator<T> iterator;
14        
15        /** when pushing back, fill this cache */
16        private T pushBackCache = null;
17        
18        /** record last fetched element such that we know what to push back */
19        private T lastFetchedElement = null;
20        
21        /**
22         * @param iterator
23         *            the iterator to wrap in order to get the push back functionality.
24         */
25        public PushBackIterator(final Iterator<T> iterator) {
26                this.iterator = iterator;
27        }
28        
29        /**
30         * Returns true if the iteration has more elements. (In other words, returns true if next would return an element rather
31         * than throwing an exception.)
32         * 
33         * @return true if the iterator has more elements.
34         */
35        public boolean hasNext() {
36                return iterator.hasNext() || pushBackCache != null;
37        }
38        
39        /**
40         * Returns the next element in the iteration. Calling this method repeatedly until the hasNext() method returns false
41         * will return each element in the underlying collection exactly once.
42         * 
43         * @return the next element in the iteration.
44         */
45        public T next() {
46                // if we have something in the cache.. use that
47                if( pushBackCache != null ) {
48                        lastFetchedElement = pushBackCache;
49                        pushBackCache = null;
50                } else {
51                        lastFetchedElement = iterator.next();
52                }
53                return lastFetchedElement;
54        }
55        
56        /**
57         * Push back the last fetched element
58         */
59        public void pushBack() {
60                if( lastFetchedElement == null )
61                        throw new IllegalStateException(
62                                        "next() must be called before pushBack(). Cannot push back non-existing element...");
63                if( pushBackCache != null )
64                        throw new IllegalStateException("Cannot push back more than one object!");
65                pushBackCache = lastFetchedElement;
66        }
67        
68        /**
69         * Operation currently not supported
70         */
71        public void remove() {
72                throw new RuntimeException("Operation not supported yet...");
73        }
74}

[all classes][spiffy.core.util]
EMMA 2.0.5312 (C) Vladimir Roubtsov