001 package lrs; 002 003 import java.util.NoSuchElementException; 004 005 006 /** 007 * Represents the abstract list state. Has a concrete toString () method that 008 * <p/> 009 * uses anynomous inner classes to compute the String representation of the 010 * <p/> 011 * LRStruct owner. 012 * 013 * @author Dung X. Nguyen Copyright 2001 - All rights reserved. 014 * @since 10/09/01 015 */ 016 017 abstract class ANode { 018 019 /** 020 * Uses anonymous visitor class to compute a String representation. 021 * <p/> 022 * Anonymous inner classes will be discussed soon! 023 */ 024 025 String toString(LRStruct owner) { 026 027 return (String)owner.execute(new IAlgo() { 028 029 public Object emptyCase(LRStruct host, Object inp) { 030 031 return "()"; 032 033 } 034 035 036 public Object nonEmptyCase(LRStruct host, Object inp) { 037 038 return "(" + host.getFirst() + host.getRest().execute(new IAlgo() { 039 040 public Object emptyCase(LRStruct h, Object i) { 041 042 return ")"; 043 044 } 045 046 047 public Object nonEmptyCase(LRStruct h, Object i) { 048 049 return " " + h.getFirst() + h.getRest().execute(this, null); 050 051 } 052 053 } 054 055 , null); 056 057 } 058 059 } 060 061 , null); 062 063 } 064 065 066 /** 067 * Returns the rest LRStruct of the referencing LRStruct. 068 * 069 * @param owner the LRStruct referencing this ANode. 070 * 071 * @return the rest LRStruct of owner. 072 * 073 * @throws NoSuchElementException if empty. 074 */ 075 076 abstract LRStruct getRest(LRStruct owner); 077 078 079 /** 080 * Returns the first data object of the referencing LRStruct. 081 * 082 * @param owner the LRStruct referencing this ANode. 083 * 084 * @return the rest LRStruct of owner. 085 * 086 * @throws NoSuchElementException if empty. 087 */ 088 089 abstract Object getFirst(LRStruct owner); 090 091 092 /** 093 * Sets a new rest for the referencing LRStruct. 094 * 095 * @param tail the new rest for the owner LRStruct. 096 * @param owner the LRS referencing this ANode. 097 * 098 * @return <code>LRStruct</code> owner 099 * 100 * @throws NoSuchElementException if empty. 101 */ 102 103 abstract LRStruct setRest(LRStruct tail, LRStruct owner); 104 105 106 /** 107 * Sets a new first data object for the referencing LRStruct. 108 * 109 * @param dat the new data object for this ANode. 110 * @param owner the LRS referencing this ANode. 111 * 112 * @return <code>LRStruct</code> owner 113 * 114 * @throws NoSuchElementException if empty. 115 */ 116 117 abstract LRStruct setFirst(Object dat, LRStruct owner); 118 119 120 /** 121 * Inserts a data object at the front of the LRStruct owner. 122 * 123 * @param dat the object to be inserted at the front. 124 * @param owner the LRS referencing this ANode. 125 * 126 * @return <code>LRStruct</code> owner 127 */ 128 129 abstract LRStruct insertFront(Object dat, LRStruct owner); 130 131 132 /** 133 * Removes and returns the first data object for the referencing LRStruct. 134 * 135 * @param owner the LRS referencing this ANode. 136 * 137 * @return the front data of the LRStruct owner. 138 */ 139 140 abstract Object removeFront(LRStruct owner); 141 142 143 /** 144 * Executes a visitor algorithm and returns the output. 145 * 146 * @param algo the visitor algorithm to be executed. 147 * @param inp the input needed by the algorithm. 148 * @param owner the LRStruct referencing this ANode. 149 */ 150 151 abstract Object execute(IAlgo algo, Object inp, LRStruct owner); 152 153 } 154 155 156