package org.codehaus.groovy.runtime.memoize;

/**
 * Represents a memoize cache with its essential methods
 * @param <K> type of the keys
 * @param <V> type of the values
 *
 * @author Vaclav Pech
 */
interface MemoizeCache<K, V> {

    V put(K key, V value);

    V get(K key);

    /**
     * Invoked when some of the held SoftReferences have been evicted by the garbage collector and so should be removed from the cache.
     * The implementation must ensure that concurrent invocations of all methods on the cache may occur from other threads
     * and thus should protect any shared resources.
     */
    void cleanUpNullReferences();
}

package org.codehaus.groovy.runtime.memoize;

/**
 * Represents a memoize cache with its essential methods
 * @param <K> type of the keys
 * @param <V> type of the values
 *
 * @author Vaclav Pech
 */
public interface MemoizeCache<K, V> {

    V put(K key, V value);

    V get(K key);

    /**
     * Invoked when some of the held SoftReferences have been evicted by the garbage collector and so should be removed from the cache.
     * The implementation must ensure that concurrent invocations of all methods on the cache may occur from other threads
     * and thus should protect any shared resources.
     */
    void cleanUpNullReferences();
}

make MemoizeCache public to avoid class casting problems