You are here

ALRSRACFactory.java

15 January, 2016 - 09:02
Available under Creative Commons-ShareAlike 4.0 International License. Download for free at http://cnx.org/contents/402b20ad-c01f-45f1-9743-05eadb1f710e@37.6
    package rac;

import listFW.*; 
import listFW.factory.*; 
import lrs.*; 

/**   * Implements a factory for restricted access containers. These  * restricted access containers are implemented using an LRStruct to               * hold the data objects. */  public abstract class ALRSRACFactory implements IRACFactory {     /**      * Implements a general-purpose restricted access container using      * an LRStruct. How?      *      * The next item to remove is always at the front of the list of      * contained objects. This is invariant!     *      * Insertion is, however, delegated to a strategy routine; and      * this strategy is provided to the container. This strategy      * varies to implement the desired kind of container, e.g., queue      * vs. stack.      *      * This nested static class is protected so that classes derived from its      * factory can reuse it to create other kinds of restricted access      * container.      */     protected static class LRSRAContainer implements IRAContainer {         private IAlgo _insertStrategy;         private LRStruct _lrs;         public LRSRAContainer(IAlgo strategy) {             _insertStrategy = strategy;             _lrs = new LRStruct();         } 

        /**         * Empty the container.         */         public void clear() {            _lrs = new LRStruct();         } 
        /**          * Return TRUE if the container is empty; otherwise, return          * FALSE.          */        public boolean isEmpty() {             return (Boolean)_lrs.execute(CheckEmpty.Singleton);        } 

       /**         * Return TRUE if the container is full; otherwise, return         * FALSE.         *         * This implementation can hold an arbitrary number of         * objects. Thus, always return false.         */        public boolean isFull() {             return false;        }
 
       /** 
        * Return an immutable list of all elements in the container.         */        public IList elements(final IListFactory fact) {            return (IList) lrs.execute(new IAlgo() {                public Object emptyCase(LRStruct host, Object... nu) {                    return fact.makeEmptyList();                }                public Object nonEmptyCase(LRStruct host, Object... nu) {                    return fact.makeNEList(host.getFirst(),                        (IList)host.getRest().execute(this));                }             });        } 

       /**         * Remove the next item from the container and return it.         */         public Object get() {             return _lrs.removeFront();         } 

        /**          * Add an item to the container.          */         public void put(Object input) {             _lrs.execute( insertStrategy, input);         }         public Object peek() {         return _lrs.getFirst();         }     } } 

/** * Package private class used by ALRSRACFactory to check for emptiness of its internal LRStruct. */ class CheckEmpty implements IAlgo {     public static final CheckEmpty Singleton= new CheckEmpty();     private CheckEmpty() {     } 
    public Object emptyCase(LRStruct host, Object... input) {         return Boolean.TRUE;     } 
    public Object nonEmptyCase(LRStruct host, Object... input) {         return Boolean.FALSE;     } }