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