001 package lrs; 002 003 004 /** 005 * Mutable linear recursive structure. 006 * <p/> 007 * <pre> 008 * <p/> 009 * Visitor Pattern: Serves as a host capable of executing algorithms which are 010 * <p/> 011 * visitors. 012 * <p/> 013 * </pre> 014 * 015 * @author Dung X. Nguyen Copyright 2001 - All rights reserved. 016 * @since 10/09/01 017 */ 018 019 public class LRStruct { 020 021 /** 022 * The state of of this <code>LRStruct</code>. 023 */ 024 025 private ANode _head; 026 027 028 /** 029 * Initializes this <code>LRStruct</code> to the empty state. 030 */ 031 032 public LRStruct() { 033 034 _head = EmptyNode.Singleton; 035 036 } 037 038 039 /** 040 * Returns "()" if empty, otherwise returns the contents of this 041 * <p/> 042 * <code>LRStruct</code> enclosed in parentheses. 043 */ 044 045 public String toString() { 046 047 return _head.toString(this); 048 049 } 050 051 052 /** 053 * Inserts dat to the front of this LRStruct.<br> 054 * <p/> 055 * post condition: <code>getFirst()</code> now returns dat. 056 * 057 * @param dat data to be inserted. 058 * 059 * @return this <code>LRStruct</code> 060 */ 061 062 public final LRStruct insertFront(Object dat) { 063 064 return _head.insertFront(dat, this); 065 066 } 067 068 069 /** 070 * Removes and returns this <code>LRStruct</code>'s first. 071 */ 072 073 public final Object removeFront() { 074 075 return _head.removeFront(this); 076 077 } 078 079 080 /** 081 * Gets the first data element from this <code>LRStruct</code> 082 */ 083 084 public final Object getFirst() { 085 086 return _head.getFirst(this); 087 088 } 089 090 091 /** 092 * Sets first data element to a new value. 093 * 094 * @param dat replaces the existing first for this <code>LRStruct</code>. 095 * 096 * @return this <code>LRStruct</code> 097 * 098 * @throws NoSuchElementException if this <code>LRStruct</code> is empty. 099 */ 100 101 public final LRStruct setFirst(Object dat) { 102 103 return _head.setFirst(dat, this); 104 105 } 106 107 108 /** 109 * Gets the rest of this <code>LRStruct</code>. 110 * 111 * @throws NoSuchElementException if this <code>LRStruct</code> is empty. 112 */ 113 114 public final LRStruct getRest() { 115 116 return _head.getRest(this); 117 118 } 119 120 121 /** 122 * Sets a new tail for this <code>LRStruct</code>.<br> 123 * <p/> 124 * post condition: <code>getRest()</code> now returns tail. 125 * 126 * @return this <code>LRStruct</code> 127 * 128 * @throws NoSuchElementException if this <code>LRStruct</code> is empty. 129 */ 130 131 public final LRStruct setRest(LRStruct tail) { 132 133 return _head.setRest(tail, this); 134 135 } 136 137 138 /** 139 * Hook method to execute an algorithm with a given input and return 140 * <p/> 141 * an appropriate output object. 142 * 143 * @param algo an algorithm (!= null) that operates on this LRStruct. 144 * @param inp input object needed by visitor algo. 145 * 146 * @return output object resulting from the execution of algo. 147 */ 148 149 public final Object execute(IAlgo algo, Object inp) { 150 151 return _head.execute(algo, inp, this); 152 153 } 154 155 156 157 /* Package access only: */ 158 159 160 161 /** 162 * Initiazes this <code>LRStruct</code> with a given head node. 163 * 164 * @param node != null. 165 */ 166 167 LRStruct(ANode node) { 168 169 _head = node; 170 171 } 172 173 174 /** 175 * Changes the head node (i.e. state) of this <code>LRStruct</code>. 176 * 177 * @param head replaces the existing state of this <code>LRStruct</code>. 178 * 179 * @return this <code>LRStruct</code> 180 */ 181 182 final LRStruct setHead(ANode head) { 183 184 _head = head; 185 186 return this; 187 188 } 189 190 191 /** 192 * Gets the head node (i.e. state) of this <code>LRStruct</code>. 193 * 194 * @return the head node. 195 */ 196 197 final ANode getHead() { 198 199 return _head; 200 201 } 202 203 } 204 205 206