1 package org.eclipse.jetty.util;
2
3 import java.util.AbstractSet;
4 import java.util.Collection;
5 import java.util.Iterator;
6 import java.util.Map;
7 import java.util.Set;
8 import java.util.concurrent.ConcurrentHashMap;
9
10 public class ConcurrentHashSet<E> extends AbstractSet<E> implements Set<E>
11 {
12 private final Map<E, Boolean> _map = new ConcurrentHashMap<E, Boolean>();
13 private transient Set<E> _keys = _map.keySet();
14
15 public ConcurrentHashSet()
16 {
17 }
18
19 @Override
20 public boolean add(E e)
21 {
22 return _map.put(e,Boolean.TRUE) == null;
23 }
24
25 @Override
26 public void clear()
27 {
28 _map.clear();
29 }
30
31 @Override
32 public boolean contains(Object o)
33 {
34 return _map.containsKey(o);
35 }
36
37 @Override
38 public boolean containsAll(Collection<?> c)
39 {
40 return _keys.containsAll(c);
41 }
42
43 @Override
44 public boolean equals(Object o)
45 {
46 return o == this || _keys.equals(o);
47 }
48
49 @Override
50 public int hashCode()
51 {
52 return _keys.hashCode();
53 }
54
55 @Override
56 public boolean isEmpty()
57 {
58 return _map.isEmpty();
59 }
60
61 @Override
62 public Iterator<E> iterator()
63 {
64 return _keys.iterator();
65 }
66
67 @Override
68 public boolean remove(Object o)
69 {
70 return _map.remove(o) != null;
71 }
72
73 @Override
74 public boolean removeAll(Collection<?> c)
75 {
76 return _keys.removeAll(c);
77 }
78
79 @Override
80 public boolean retainAll(Collection<?> c)
81 {
82 return _keys.retainAll(c);
83 }
84
85 @Override
86 public int size()
87 {
88 return _map.size();
89 }
90
91 @Override
92 public Object[] toArray()
93 {
94 return _keys.toArray();
95 }
96
97 @Override
98 public <T> T[] toArray(T[] a)
99 {
100 return _keys.toArray(a);
101 }
102
103 @Override
104 public String toString()
105 {
106 return _keys.toString();
107 }
108 }