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