001    /*
002     * $Id: Coefficients.java 3336 2010-09-27 20:14:44Z kredel $
003     */
004    
005    package edu.jas.ps;
006    
007    
008    import java.util.HashMap;
009    
010    import edu.jas.structure.RingElem;
011    
012    
013    /**
014     * Abstract class for generating functions for coefficients of power series. Was
015     * an interface, now this class handles the caching itself.
016     * @param <C> ring element type
017     * @author Heinz Kredel
018     */
019    
020    public abstract class Coefficients<C extends RingElem<C>> {
021    
022    
023        /**
024         * Cache for already computed coefficients.
025         */
026        public final HashMap<Integer, C> coeffCache;
027    
028    
029        /**
030         * Public no arguments constructor.
031         */
032        public Coefficients() {
033            this(new HashMap<Integer, C>());
034        }
035    
036    
037        /**
038         * Public constructor with pre-filled cache.
039         * @param cache pre-filled coefficient cache.
040         */
041        public Coefficients(HashMap<Integer, C> cache) {
042            coeffCache = cache;
043        }
044    
045    
046        /**
047         * Get cached coefficient or generate coefficient.
048         * @param index of requested coefficient.
049         * @return coefficient at index.
050         */
051        public C get(int index) {
052            if (coeffCache == null) {
053                return generate(index);
054            }
055            Integer i = index;
056            C c = coeffCache.get(i);
057            if (c != null) {
058                return c;
059            }
060            c = generate(index);
061            coeffCache.put(i, c);
062            return c;
063        }
064    
065    
066        /**
067         * Generate coefficient.
068         * @param index of requested coefficient.
069         * @return coefficient at index.
070         */
071        protected abstract C generate(int index);
072    
073    }