001    package lrs;
002    
003    /**
004     * Represents the non-empty state of a LStruct.
005     * @author Dung X. Nguyen and Stephen Wong  Copyright 2005 - All rights reserved.
006     * @author Mathias Ricken - Copyright 2008 - All rights reserved.
007     * @since 8/25/05
008     */
009    class NENode<T> extends ANode<T> {
010        private T _dat;
011        private LRStruct<T> _tail;
012        
013        /**
014         * Initializes this NENode to contain dat and a given tail list.
015         * @param dat the data object to be stored in this NENode.
016         * @param tail the LRStruct tail of this NENode.
017         */
018        NENode(T dat, LRStruct<T> tail) {
019            _dat = dat;
020            _tail = tail;
021        }
022        
023        LRStruct<T> getRest(LRStruct<T> owner) {
024            return _tail;
025        }
026        
027        T getFirst(LRStruct<T> owner) {
028            return _dat;
029        }
030        
031        LRStruct<T> setRest(LRStruct<T> tail, LRStruct<T> owner) {
032            _tail = tail;
033            return owner;
034        }
035        
036        LRStruct<T> setFirst(T first, LRStruct<T> owner) {
037            _dat = first;
038            return owner;
039        }
040        
041        /**
042         * Inserts a data object at the front of the LRStruct owner.
043         * @param dat the object to be inserted at the front.
044         * @param owner the LRS referencing this NENode.
045         */
046        LRStruct<T> insertFront(T dat, LRStruct<T> owner) {
047            return owner.setHead(new NENode<T>(dat, new LRStruct<T>(this)));
048            /* Details:
049             // LRStruct coOwner = new LRStruct (this);
050             // NENode newNode = new NENode (dat, coOwner);
051             // owner.setHead (newNode);
052             // "old" style: owner._head = newNode - cannot be done here.
053             */
054        }
055        
056        T removeFront(LRStruct<T> owner) {
057            owner.setHead(_tail.getHead()); // owner._head = _tail._head
058            return _dat;
059        }
060        
061        /**
062         * Calls the visitor's non-empty case.
063         */
064        <R,P> R execute(LRStruct<T> owner, IAlgo<T, R, P> algo, P ... input) {
065            return algo.nonEmptyCase(owner, input);
066        }
067    }
068