001 package lrs; 002 003 /** 004 * Represents the abstract list state. Has a concrete toString () method that 005 * uses anynomous inner classes to compute the String representation of the 006 * LRStruct owner. 007 * @author Dung X. Nguyen and Stephen Wong Copyright 2005 - All rights reserved. 008 * @since 8/25/05 009 * @stereotype abstract state 010 */ 011 abstract class ANode { 012 /** 013 * Uses anonymous visitor class to compute a String representation. 014 */ 015 public static final IAlgo ToStringAlgo = new IAlgo() { 016 private final IAlgo Helper = new IAlgo() { 017 public Object emptyCase(LRStruct h, Object... i) { 018 return ")"; 019 } 020 021 public Object nonEmptyCase(LRStruct h, Object... i) { 022 return " " + h.getFirst() + h.getRest().execute (this); 023 } 024 }; 025 026 public Object emptyCase(LRStruct host, Object... inp) { 027 return "()"; 028 } 029 030 public Object nonEmptyCase(LRStruct host, Object... inp) { 031 return "(" + host.getFirst() + host.getRest().execute(Helper); 032 } 033 }; 034 035 String toString(LRStruct owner) { 036 return (String)owner.execute (ToStringAlgo); 037 } 038 039 /** 040 * Returns the tail LRStruct of the referencing LRStruct. 041 * @param owner the LRStruct referencing this ANode. 042 * @return the tail LRStruct of owner. 043 * @throw java.util.NoSuchElementException if empty. 044 */ 045 abstract LRStruct getRest(LRStruct owner); 046 047 /** 048 * Returns the first data object of the referencing LRStruct. 049 * @param owner the LRStruct referencing this ANode. 050 * @return the tail LRStruct of owner. 051 * @throw java.util.NoSuchElementException if empty. 052 */ 053 abstract Object getFirst(LRStruct owner); 054 055 /** 056 * Sets a new tail for the referencing LRStruct. 057 * @param tail the new tail for the owner LRStruct. 058 * @param owner the LRS referencing this ANode. 059 * @throw java.util.NoSuchElementException if empty. 060 * @return <code>LRStruct</code> owner 061 */ 062 abstract LRStruct setRest(LRStruct tail, LRStruct owner); 063 064 /** 065 * Sets a new first data object for the referencing LRStruct. 066 * @param first the new data object for this ANode. 067 * @param owner the LRS referencing this ANode. 068 * @throw java.util.NoSuchElementException if empty. 069 * @return <code>LRStruct</code> owner 070 */ 071 abstract LRStruct setFirst(Object dat, LRStruct owner); 072 073 /** 074 * Inserts a data object at the front of the LRStruct owner. 075 * @param dat the object to be inserted at the front. 076 * @param owner the LRS referencing this ANode. 077 * @return <code>LRStruct</code> owner 078 */ 079 abstract LRStruct insertFront(Object dat, LRStruct owner); 080 081 /** 082 * Removes and returns the first data object for the referencing LRStruct. 083 * @param owner the LRS referencing this ANode. 084 * @return the front data of the LRStruct owner. 085 */ 086 abstract Object removeFront(LRStruct owner); 087 088 /** 089 * Executes a visitor algorithm and returns the output. 090 * @param owner the LRStruct referencing this ANode. 091 * @param algo the visitor algorithm to be executed. 092 * @param inp the inputs needed by the algorithm. 093 */ 094 abstract Object execute(LRStruct owner, IAlgo algo, Object... inp); 095 } 096