73e2ccecbe2eca25d097b9b72d5af8af4fa1309c
[sbp.git] / src / edu / berkeley / sbp / util / HashMapBag.java
1 package edu.berkeley.sbp.util;
2 import java.util.*;
3
4 /** a mapping from keys of type <tt>K</tt> to <i>sets</i> of values of type <tt>T</tt> */
5 public final class HashMapBag<K,V> implements MapBag<K,V> {
6
7     private final HashMap<K,HashSet<V>> hm = new HashMap<K,HashSet<V>>();
8
9     public void add(K k, V v) {
10         HashSet<V> hs = hm.get(k);
11         if (hs==null) hm.put(k, hs = new HashSet<V>());
12         size -= hs.size();
13         hs.add(v);
14         size += hs.size();
15     }
16
17     public void addAll(K k, Iterable<V> iv) {
18         for(V v : iv) add(k, v);
19     }
20
21     public HashSet<V> getAll(K k) {
22         HashSet<V> ret = hm.get(k);
23         if (ret==null) return new HashSet<V>();
24         return ret;
25     }
26
27     public void remove(K k, V v) {
28         if (hm.get(k)==null) return;
29         HashSet<V> hs = hm.get(k);
30         if (hs==null) return;
31         size -= hs.size();
32         hs.remove(v);
33         size += hs.size();
34     }
35
36     public void removeAll(K k, Iterable<V> iv) {
37         for(V v : iv) remove(k, v);
38     }
39
40     public void clear() { hm.clear(); }
41
42     public boolean contains(K k, V v) {
43         return hm.get(k)!=null && hm.get(k).contains(v);
44     }
45
46     public void addAll(HashMapBag<K,V> hmb) {
47         for(K k : hmb) addAll(k, hmb.getAll(k));
48     }
49     public void removeAll(HashMapBag<K,V> hmb) {
50         for(K k : hmb) removeAll(k, hmb.getAll(k));
51     }
52
53     public Iterator<K> iterator() { return hm.keySet().iterator(); }
54     public int size() { return size; }
55     private int size = 0;
56 }