/** * Mutable quasi-functional linear recursive structure. * @author Dung X. Nguyen - Copyright 1999 - All rights reserved. * @since 10/01/99 * @dependency IAlgo */ public class QFList { /** @SBGen Variable (,head,,128) */ private IState _head; /** @SBGen Constructor */ public QFList() { _head = NullNode.singleton; } /** * @param dat data to insert at this node */ public final void insertFront(Object dat) { _head.insertFront(dat, this); } /** * @return Returns this node's first */ public final Object removeFront() { return _head.removeFront(this); } /** * @return Gets the data from this node */ public final Object getFirst() { return _head.getFirst(this); } /** * @param dat new data for this node */ public final void setFirst(Object dat) { _head.setFirst(dat, this); } /** * @return gets the rest of the structure */ public final QFList getRest() { return _head.getRest(this); } /** * @param tail sets a new tail for this node */ public final void setRest(QFList tail) { _head.setRest(tail, this); } public final Object execute(IAlgo visitor, Object param) { return _head.execute(visitor, param, this); } /** * @param head */ private final void setHead(IState head) { _head = head; } /** * @return */ private final IState getHead() { return(_head); } /** * null list node. singleton pattern. */ private static class NullNode implements IState { public final static NullNode singleton = new NullNode(); private NullNode() { } /** * @param owner * @return null */ public QFList getRest(QFList owner) { throw new java.util.NoSuchElementException ("Empty list has no first."); } /** * @param owner * @return null */ public Object getFirst(QFList owner) { throw new java.util.NoSuchElementException ("Empty list has no first."); } /** * @param tail * @param owner */ public void setRest(QFList tail, QFList owner) { throw new java.util.NoSuchElementException ("Empty list has no tail."); } /** * @param dat * @param owner */ public void setFirst(Object dat, QFList owner) { throw new java.util.NoSuchElementException ("Empty list has no first."); } /** * @param dat * @param owner */ public void insertFront(Object dat, QFList owner) { owner.setHead(new NonNullNode(dat)); } /** * @param owner * @return */ public Object removeFront(QFList owner) { throw new java.util.NoSuchElementException ("Empty list has no front."); } public Object execute(IAlgo visitor, Object param, QFList owner) { return visitor.nullCase(owner, param); } public String toString() { return ""; } } /** * non-null list node */ private static class NonNullNode implements IState { /** @SBGen Variable (,tail,,64) */ private Object _dat; /** @SBGen Variable (,tail,,64) */ private QFList _tail; /** * @param _dat */ public NonNullNode(Object dat) { _dat = dat; _tail = new QFList(); } /** * @param owner * @return n */ public QFList getRest(QFList owner) { return(_tail); } /** * @param owner * @return n */ public Object getFirst(QFList owner) { return(_dat); } /** * @param tail * @param owner */ public void setRest(QFList tail, QFList owner) { _tail = tail; } /** * @param first * @param owner */ public void setFirst(Object first, QFList owner) { _dat = first; } /** * @param dat * @param owner */ public void insertFront (Object dat, QFList owner) { NonNullNode newNode = new NonNullNode (dat); IState tmpHead = owner.getHead(); // tmpHead = owner._head owner.setHead(newNode); // owner._head = newNode owner.getRest().setHead(tmpHead); // newNode._tail._head = tmpHead } /** * @param owner * @return the front data. */ public Object removeFront(QFList owner) { Object dat = owner.getFirst(); // dat = _dat owner.setHead(owner.getRest().getHead()); // owner._head = _tail._head return(dat); } /** * @returns the output object resulting from executing the visitor. */ public Object execute(IAlgo visitor, Object input, QFList owner) { return visitor.nonNullCase(owner, input); } public String toString() { return _dat.toString () + " " + _tail.toString (); } } public String toString() { return _head.toString (); } }