001    package lrs;
002    
003    /**
004     * Represents the empty state of a mutable list LRStruct. Uses the
005     * Singleton pattern.
006     * @author Dung X. Nguyen and Stephen Wong  Copyright 2005 - All rights reserved.
007     * @author Mathias Ricken - Copyright 2008 - All rights reserved.
008     * @since 8/25/05
009     */
010    class EmptyNode<T> extends ANode<T> {
011        /**
012         * Throws java.util.NoSuchElementException.
013         */
014        LRStruct<T> getRest(LRStruct<T> owner) {
015            throw new java.util.NoSuchElementException ("Empty list has no first.");
016        }
017    
018        /**
019         * Throws java.util.NoSuchElementException.
020         */
021        T getFirst(LRStruct<T> owner) {
022            throw new java.util.NoSuchElementException ("Empty list has no first.");
023        }
024    
025        /**
026         * Throws java.util.NoSuchElementException.
027         */
028        LRStruct<T> setRest(LRStruct<T> tail, LRStruct<T> owner) {
029            throw new java.util.NoSuchElementException ("Empty list has no tail.");
030        }
031    
032        /**
033         * Throws java.util.NoSuchElementException.
034         */
035        LRStruct<T> setFirst(T dat, LRStruct<T> owner) {
036            throw new java.util.NoSuchElementException ("Empty list has no first.");
037        }
038    
039        /**
040         * The owner becomes non-empty and has dat as its first element.
041         */
042        LRStruct<T> insertFront(T dat, LRStruct<T> owner) {
043            return owner.setHead(new NENode<T>(dat, new LRStruct<T>(this)));
044        }
045    
046        /**
047         * Throws java.util.NoSuchElementException.
048         */
049        T removeFront(LRStruct<T> owner) {
050            throw new java.util.NoSuchElementException ("Empty list has no front.");
051        }
052    
053        /**
054        * Calls the <code>IAlgo</code> visitor's empty case.
055        */
056        <R,P> R execute(LRStruct<T> owner, IAlgo<T, R, P> algo, P ... inp) {
057            return algo.emptyCase(owner, inp);
058        }
059    }
060