001 package lrs; 002 003 /** 004 * Mutable linear recursive structure. 005 <pre> 006 * Visitor Pattern: Serves as a host capable of executing algorithms which are 007 * visitors. 008 </pre> 009 * @author Dung X. Nguyen and Stephen Wong Copyright 2005 - All rights reserved. 010 * @author Mathias Ricken - Copyright 2008 - All rights reserved. 011 * @since 8/25/05 012 */ 013 public class LRStruct<T> { 014 /** 015 * The state of of this <code>LRStruct</code>. 016 */ 017 private ANode<T> _head; 018 019 /** 020 * Initializes this <code>LRStruct</code> to the empty state. 021 */ 022 public LRStruct() { 023 _head = new EmptyNode<T>(); 024 } 025 026 /** 027 * Returns "()" if empty, otherwise returns the contents of this 028 * <code>LRStruct</code> enclosed in parentheses. 029 */ 030 public String toString() { 031 return _head.toString(this); 032 } 033 034 /** 035 * Inserts dat to the front of this LRStruct.<br> 036 * post condition: <code>getFirst()</code> now returns dat. 037 * @param dat data to be inserted. 038 * @return this <code>LRStruct</code> 039 */ 040 public final LRStruct<T> insertFront(T dat) { 041 return _head.insertFront(dat, this); 042 } 043 044 /** 045 * Removes and returns this <code>LRStruct</code>'s first. 046 */ 047 public final T removeFront() { 048 return _head.removeFront(this); 049 } 050 051 /** 052 * Gets the first data element from this <code>LRStruct</code> 053 */ 054 public final T getFirst() { 055 return _head.getFirst (this); 056 } 057 058 /** 059 * Sets first data element to a new value. 060 * @param dat replaces the existing first for this <code>LRStruct</code>. 061 * @throws NoSuchElementException if this <code>LRStruct</code> is empty. 062 * @return this <code>LRStruct</code> 063 */ 064 public final LRStruct<T> setFirst(T dat) { 065 return _head.setFirst (dat, this); 066 } 067 068 /** 069 * Gets the rest of this <code>LRStruct</code>. 070 * @throws NoSuchElementException if this <code>LRStruct</code> is empty. 071 */ 072 public final LRStruct<T> getRest() { 073 return _head.getRest(this); 074 } 075 076 /** 077 * Sets a new tail for this <code>LRStruct</code>.<br> 078 * post condition: <code>getRest()</code> now returns tail. 079 * @throws NoSuchElementException if this <code>LRStruct</code> is empty. 080 * @return this <code>LRStruct</code> 081 */ 082 public final LRStruct<T> setRest(LRStruct<T> tail) { 083 return _head.setRest(tail, this); 084 } 085 086 /** 087 * Hook method to execute an algorithm with a given input and return 088 * an appropriate output object. 089 * @param algo an algorithm (!= null) that operates on this LRStruct. 090 * @param inp input variable argument list of objects needed by visitor algo. 091 * @return output object resulting from the execution of algo. 092 */ 093 public final <R,P> R execute(IAlgo<T, R, P> algo, P ... inp) { 094 return _head.execute(this, algo, inp); 095 } 096 097 /* Package access only: */ 098 099 /** 100 * Initiazes this <code>LRStruct</code> with a given head node. 101 * @param node != null. 102 */ 103 LRStruct(ANode<T> node) { 104 _head = node; 105 } 106 107 /** 108 * Changes the head node (i.e. state) of this <code>LRStruct</code>. 109 * @param head replaces the exisiting state of this <code>LRStruct</code>. 110 * @return this <code>LRStruct</code> 111 */ 112 final LRStruct<T> setHead (ANode<T> head) { 113 _head = head; 114 return this; 115 } 116 117 /** 118 * Gets the head node (i.e. state) of this <code>LRStruct</code>. 119 * @return the head node. 120 */ 121 final ANode<T> getHead () { 122 return _head; 123 } 124 } 125