package annotations.util.coll; import java.util.Set; /*>>> import org.checkerframework.checker.nullness.qual.*; */ /** * A <code>KeyedSet</code> is a set whose members have distinct <em>keys</em> * and can be looked up by key. A {@link Keyer} provides keys for the elements. * It is forbidden for an element's key to change while the element is in the * set. */ public interface KeyedSet<K, V> extends Set<V> { /** * Returns the <code>Keyer</code> that this <code>KeyedSet</code> uses * to obtain keys for elements. * * @return the <code>Keyer</code> that this <code>KeyedSet</code> uses * to obtain keys for elements */ public abstract Keyer<? extends K, ? super V> getKeyer(); /** * Calls * * @{link #add(V, int, int) add(v, THROW_EXCEPTION, IGNORE)} and returns * true if <code>v</code> was added. * @param v * the object to be added * @return <code>true</code> if <code>v</code> was added */ // public abstract boolean add(V v); // causes "ambiguities" for some // strange reason /** * Conflict/equal behavior that does nothing. */ public static final int IGNORE = -1; /** * Conflict/equal behavior that throws an {@link IllegalStateException}. */ public static final int THROW_EXCEPTION = 0; /** * Conflict/equal behavior that removes the existing object and then adds * the new object. */ public static final int REPLACE = 1; /** * Adds <code>v</code> to this <code>KeyedSet</code>; this set's * <code>Keyer</code> will be called once to fetch <code>v</code>'s * key. If an object equal to <code>v</code> is already present in this * <code>KeyedSet</code>, then this method carries out the * <code>equalBehavior</code> and returns the existing object. Otherwise, * if an object having a key equal to <code>v</code>'s is already present * in this <code>KeyedSet</code>, then this method carries out the * <code>conflictBehavior</code> and returns the existing object. * Otherwise, this method adds <code>v</code> to this * <code>KeyedSet</code> and returns null. * * @param v * the object to be added * @param conflictBehavior * specifies what to do if <code>v</code>'s key equals an * existing object's key * @param equalBehavior * specifies what to do if <code>v</code> equals an existing * object * @return the existing object whose key matched <code>v</code>'s, if any */ public abstract V add(V v, int conflictBehavior, int equalBehavior); /** * Adds <code>v</code> to this <code>KeyedSet</code>, replacing and * returning an existing object with the same key as <code>v</code> (if * any). The existing object is replaced with <code>v</code> even if it * equals <code>v</code>. If no existing object is replaced, null is * returned. */ public abstract V replace(V v); /** * Looks for and returns an element with key <code>k</code>, or * <code>null</code> if none. * * @return the element with key <code>k</code>, or <code>null</code> if * none */ public abstract V lookup(K k); }