All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ggp.base.util.symbol.grammar.SymbolPool Maven / Gradle / Ivy

There is a newer version: 0.0.15
Show newest version
package org.ggp.base.util.symbol.grammar;

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public final class SymbolPool
{

    private static final ConcurrentMap atomPool = new ConcurrentHashMap();
    private static final ConcurrentMap, SymbolList> listPool = new ConcurrentHashMap, SymbolList>();

    /**
     * If the pool does not have a mapping for the given key, adds a mapping from key to value
     * to the pool.
     *
     * Note that even if you've checked to make sure that the pool doesn't contain the key,
     * you still shouldn't assume that this method actually inserts the given value, since
     * this class is accessed by multiple threads simultaneously.
     *
     * @return the value mapped to by key in the pool
     */
    private static  V addToPool(K key, V value, ConcurrentMap pool) {
        V prevValue = pool.putIfAbsent(key, value);
        if(prevValue == null)
            return value;
        else
            return prevValue;
    }

    public static SymbolAtom getAtom(String value)
    {
        SymbolAtom ret = atomPool.get(value);
        if(ret == null)
            ret = addToPool(value, new SymbolAtom(value), atomPool);

        return ret;
    }

    public static SymbolList getList(List contents)
    {
        SymbolList ret = listPool.get(contents);
        if(ret == null)
            ret = addToPool(contents, new SymbolList(contents), listPool);

        return ret;
    }

    public static SymbolList getList(Symbol[] contents)
    {
        return getList(Arrays.asList(contents));
    }

    /**
     * Drains the contents of the SymbolPool. Useful to control memory usage
     * once you have finished playing a large game. This should be safe to call
     * any time during gameplay, but according to my experiments the SymbolPool
     * has a 97% cache hit rate during a game, so you likely only want to call
     * this between games (since the symbols from an old game are unlikely to
     * reappear in another unrelated game).
     */
    public static void drainPool() {
        atomPool.clear();
        listPool.clear();
    }
}





© 2015 - 2024 Weber Informatics LLC | Privacy Policy