/*
* ModeShape (http://www.modeshape.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.modeshape.common.collection;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
/**
* A collection similar to {@link Map}, but which may associate multiple values with any single key.
* <p>
* Some implementation may not allow duplicate key-value pairs. In such implementations, calling #pu
* </p>
*
* @param <K> the key type
* @param <V> the value type
*/
public interface Multimap<K, V> {
/**
* Return the number of key-value pairs in this multimap.
*
* @return the size of this multimap.
*/
int size();
boolean isEmpty();
/**
* Associate the supplied value with the given key, returning true if the size of this multimap was increased.
* <p>
* Some implementations allow duplicate key-value pairs, and in these cases this method will always increase the size of the
* multimap and will thus always return true. Other implementations will not allow duplicate key-value pairs, and may return
* false if the multimap already contains the supplied key-value pair.
* </p>
*
* @param key the key
* @param value the value
* @return {@code true} if the size of this multimap was increased as a result of this call, or {@code false} if the multimap
* already contained the key-value pair and doesn't allow duplicates
*/
boolean put( K key,
V value );
/**
* Remove the supplied key-value pair from this multi-map.
*
* @param key the key
* @param value the value
* @return {@code true} if the size of this multimap was decreased as a result of this call, or {@code false} if the multimap
* did not contain the key-value pair
*/
boolean remove( K key,
V value );
/**
* Remove all of the key-value pairs that use the supplied key, returning the collection of values. The resulting collection
* may be modifiable, but changing it will have no effect on this multimap.
*
* @param key the key
* @return the collection of values that were removed, or an empty collection if there were none; never null
*/
Collection<V> removeAll( K key );
/**
* Get the collection of values that are associated with the supplied key.
* <p>
* Changes to the returned collection will update the values that this multimap associates with the key.
* </p>
*
* @param key the key
* @return the collection of values, or an empty collection if the supplied key was not associated with any values
*/
Collection<V> get( K key );
/**
* Determine whether this multimap associates any values with the supplied key.
*
* @param key the key
* @return {@code true} if there is at least one value associated with the supplied key, or {@code false} otherwise
*/
boolean containsKey( K key );
/**
* Determine whether this multimap associates at least one key with the supplied value.
*
* @param value the value
* @return {@code true} if there is at least one key associated with the supplied value, or {@code false} otherwise
*/
boolean containsValue( Object value );
/**
* Determine whether this multimap contains the supplied key-value pair.
*
* @param key the key
* @param value the value
* @return {@code true} if this multimap contains an entry with the supplied key and value, or {@code false} otherwise
*/
boolean containsEntry( Object key,
Object value );
/**
* Return the set of keys in this multimap.
*
* @return the set of keys; never null but possible empty
*/
Set<K> keySet();
/**
* Return a collection of all values in this multimap. Changes to the returned collection will update the underlying multimap,
* and vice versa.
*
* @return the collection of values, which may include the same value multiple times if it occurs in multiple mappings; never
* null but possibly empty
*/
Collection<V> values();
/**
* Return a collection of all key-value pairs. Changes to the returned collection will update the underlying multimap, and
* vice versa. The entries collection does not support the {@code add} or {@code addAll} operations.
*
* @return the collection of map entries consisting of key-value pairs; never null but possibly empty
*/
Collection<Map.Entry<K, V>> entries();
/**
* Return a map view that associates each key with the corresponding values in the multimap. Changes to the returned map, such
* as element removal, will update the underlying multimap. The map does not support {@code setValue()} on its entries,
* {@code put}, or {@code putAll}.
* <p>
* The collections returned by {@code asMap().get(Object)} have the same behavior as those returned by {@link #get}.
*
* @return a map view from a key to its collection of values
*/
Map<K, Collection<V>> asMap();
/**
* Remove all key-value pairs from this multimap.
*/
void clear();
}