| 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); |
| } |