blob: daad847afb352b2a2f9feaacfd70cb868f3848c9 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===------------------------- hash_set ------------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_HASH_SET
12#define _LIBCPP_HASH_SET
13
14/*
15
16 hash_set synopsis
17
18namespace __gnu_cxx
19{
20
21template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
22 class Alloc = allocator<Value>>
23class hash_set
24{
25public:
26 // types
27 typedef Value key_type;
28 typedef key_type value_type;
29 typedef Hash hasher;
30 typedef Pred key_equal;
31 typedef Alloc allocator_type;
32 typedef value_type& reference;
33 typedef const value_type& const_reference;
34 typedef typename allocator_traits<allocator_type>::pointer pointer;
35 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
36 typedef typename allocator_traits<allocator_type>::size_type size_type;
37 typedef typename allocator_traits<allocator_type>::difference_type difference_type;
38
39 typedef /unspecified/ iterator;
40 typedef /unspecified/ const_iterator;
41
42 explicit hash_set(size_type n = 193, const hasher& hf = hasher(),
43 const key_equal& eql = key_equal(),
44 const allocator_type& a = allocator_type());
45 template <class InputIterator>
46 hash_set(InputIterator f, InputIterator l,
47 size_type n = 193, const hasher& hf = hasher(),
48 const key_equal& eql = key_equal(),
49 const allocator_type& a = allocator_type());
50 hash_set(const hash_set&);
51 ~hash_set();
52 hash_set& operator=(const hash_set&);
53
54 allocator_type get_allocator() const;
55
56 bool empty() const;
57 size_type size() const;
58 size_type max_size() const;
59
60 iterator begin();
61 iterator end();
62 const_iterator begin() const;
63 const_iterator end() const;
64
65 pair<iterator, bool> insert(const value_type& obj);
66 template <class InputIterator>
67 void insert(InputIterator first, InputIterator last);
68
69 void erase(const_iterator position);
70 size_type erase(const key_type& k);
71 void erase(const_iterator first, const_iterator last);
72 void clear();
73
74 void swap(hash_set&);
75
76 hasher hash_funct() const;
77 key_equal key_eq() const;
78
79 iterator find(const key_type& k);
80 const_iterator find(const key_type& k) const;
81 size_type count(const key_type& k) const;
82 pair<iterator, iterator> equal_range(const key_type& k);
83 pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
84
85 size_type bucket_count() const;
86 size_type max_bucket_count() const;
87
88 size_type elems_in_bucket(size_type n) const;
89
90 void resize(size_type n);
91};
92
93template <class Value, class Hash, class Pred, class Alloc>
94 void swap(hash_set<Value, Hash, Pred, Alloc>& x,
95 hash_set<Value, Hash, Pred, Alloc>& y);
96
97template <class Value, class Hash, class Pred, class Alloc>
98 bool
99 operator==(const hash_set<Value, Hash, Pred, Alloc>& x,
100 const hash_set<Value, Hash, Pred, Alloc>& y);
101
102template <class Value, class Hash, class Pred, class Alloc>
103 bool
104 operator!=(const hash_set<Value, Hash, Pred, Alloc>& x,
105 const hash_set<Value, Hash, Pred, Alloc>& y);
106
107template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
108 class Alloc = allocator<Value>>
109class hash_multiset
110{
111public:
112 // types
113 typedef Value key_type;
114 typedef key_type value_type;
115 typedef Hash hasher;
116 typedef Pred key_equal;
117 typedef Alloc allocator_type;
118 typedef value_type& reference;
119 typedef const value_type& const_reference;
120 typedef typename allocator_traits<allocator_type>::pointer pointer;
121 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
122 typedef typename allocator_traits<allocator_type>::size_type size_type;
123 typedef typename allocator_traits<allocator_type>::difference_type difference_type;
124
125 typedef /unspecified/ iterator;
126 typedef /unspecified/ const_iterator;
127
128 explicit hash_multiset(size_type n = 193, const hasher& hf = hasher(),
129 const key_equal& eql = key_equal(),
130 const allocator_type& a = allocator_type());
131 template <class InputIterator>
132 hash_multiset(InputIterator f, InputIterator l,
133 size_type n = 193, const hasher& hf = hasher(),
134 const key_equal& eql = key_equal(),
135 const allocator_type& a = allocator_type());
136 hash_multiset(const hash_multiset&);
137 ~hash_multiset();
138 hash_multiset& operator=(const hash_multiset&);
139
140 allocator_type get_allocator() const;
141
142 bool empty() const;
143 size_type size() const;
144 size_type max_size() const;
145
146 iterator begin();
147 iterator end();
148 const_iterator begin() const;
149 const_iterator end() const;
150
151 iterator insert(const value_type& obj);
152 template <class InputIterator>
153 void insert(InputIterator first, InputIterator last);
154
155 void erase(const_iterator position);
156 size_type erase(const key_type& k);
157 void erase(const_iterator first, const_iterator last);
158 void clear();
159
160 void swap(hash_multiset&);
161
162 hasher hash_funct() const;
163 key_equal key_eq() const;
164
165 iterator find(const key_type& k);
166 const_iterator find(const key_type& k) const;
167 size_type count(const key_type& k) const;
168 pair<iterator, iterator> equal_range(const key_type& k);
169 pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
170
171 size_type bucket_count() const;
172 size_type max_bucket_count() const;
173
174 size_type elems_in_bucket(size_type n) const;
175
176 void resize(size_type n);
177};
178
179template <class Value, class Hash, class Pred, class Alloc>
180 void swap(hash_multiset<Value, Hash, Pred, Alloc>& x,
181 hash_multiset<Value, Hash, Pred, Alloc>& y);
182
183template <class Value, class Hash, class Pred, class Alloc>
184 bool
185 operator==(const hash_multiset<Value, Hash, Pred, Alloc>& x,
186 const hash_multiset<Value, Hash, Pred, Alloc>& y);
187
188template <class Value, class Hash, class Pred, class Alloc>
189 bool
190 operator!=(const hash_multiset<Value, Hash, Pred, Alloc>& x,
191 const hash_multiset<Value, Hash, Pred, Alloc>& y);
192} // __gnu_cxx
193
194*/
195
196#include <__config>
197#include <__hash_table>
198#include <functional>
199
Howard Hinnant4f598032011-07-24 23:59:50 +0000200#if __DEPRECATED
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000201#warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>
Howard Hinnant4f598032011-07-24 23:59:50 +0000202#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000203
204namespace __gnu_cxx {
205
206using namespace std;
207
208template <class _Value, class _Hash = std::hash<_Value>, class _Pred = equal_to<_Value>,
209 class _Alloc = allocator<_Value> >
Howard Hinnant422a53f2010-09-21 21:28:23 +0000210class _LIBCPP_VISIBLE hash_set
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000211{
212public:
213 // types
214 typedef _Value key_type;
215 typedef key_type value_type;
216 typedef _Hash hasher;
217 typedef _Pred key_equal;
218 typedef _Alloc allocator_type;
219 typedef value_type& reference;
220 typedef const value_type& const_reference;
221
222private:
223 typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
224
225 __table __table_;
226
227public:
228 typedef typename __table::pointer pointer;
229 typedef typename __table::const_pointer const_pointer;
230 typedef typename __table::size_type size_type;
231 typedef typename __table::difference_type difference_type;
232
233 typedef typename __table::const_iterator iterator;
234 typedef typename __table::const_iterator const_iterator;
235
Howard Hinnant422a53f2010-09-21 21:28:23 +0000236 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000237 hash_set() {__table_.rehash(193);}
238 explicit hash_set(size_type __n, const hasher& __hf = hasher(),
239 const key_equal& __eql = key_equal());
240 hash_set(size_type __n, const hasher& __hf, const key_equal& __eql,
241 const allocator_type& __a);
242 template <class _InputIterator>
243 hash_set(_InputIterator __first, _InputIterator __last);
244 template <class _InputIterator>
245 hash_set(_InputIterator __first, _InputIterator __last,
246 size_type __n, const hasher& __hf = hasher(),
247 const key_equal& __eql = key_equal());
248 template <class _InputIterator>
249 hash_set(_InputIterator __first, _InputIterator __last,
250 size_type __n, const hasher& __hf, const key_equal& __eql,
251 const allocator_type& __a);
252 hash_set(const hash_set& __u);
253
Howard Hinnant422a53f2010-09-21 21:28:23 +0000254 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000255 allocator_type get_allocator() const
256 {return allocator_type(__table_.__node_alloc());}
257
Howard Hinnant422a53f2010-09-21 21:28:23 +0000258 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000259 bool empty() const {return __table_.size() == 0;}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000260 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000261 size_type size() const {return __table_.size();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000262 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000263 size_type max_size() const {return __table_.max_size();}
264
Howard Hinnant422a53f2010-09-21 21:28:23 +0000265 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000266 iterator begin() {return __table_.begin();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000267 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000268 iterator end() {return __table_.end();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000269 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000270 const_iterator begin() const {return __table_.begin();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000271 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000272 const_iterator end() const {return __table_.end();}
273
Howard Hinnant422a53f2010-09-21 21:28:23 +0000274 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000275 pair<iterator, bool> insert(const value_type& __x)
276 {return __table_.__insert_unique(__x);}
Sean Hunte36a1962011-07-29 23:31:53 +0000277 _LIBCPP_INLINE_VISIBILITY
278 iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000279 template <class _InputIterator>
280 void insert(_InputIterator __first, _InputIterator __last);
281
Howard Hinnant422a53f2010-09-21 21:28:23 +0000282 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000283 void erase(const_iterator __p) {__table_.erase(__p);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000284 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000285 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000286 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000287 void erase(const_iterator __first, const_iterator __last)
288 {__table_.erase(__first, __last);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000289 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000290 void clear() {__table_.clear();}
291
Howard Hinnant422a53f2010-09-21 21:28:23 +0000292 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000293 void swap(hash_set& __u) {__table_.swap(__u.__table_);}
294
Howard Hinnant422a53f2010-09-21 21:28:23 +0000295 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000296 hasher hash_funct() const {return __table_.hash_function();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000297 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000298 key_equal key_eq() const {return __table_.key_eq();}
299
Howard Hinnant422a53f2010-09-21 21:28:23 +0000300 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000301 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000302 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000303 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000304 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000305 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000306 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000307 pair<iterator, iterator> equal_range(const key_type& __k)
308 {return __table_.__equal_range_unique(__k);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000309 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000310 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
311 {return __table_.__equal_range_unique(__k);}
312
Howard Hinnant422a53f2010-09-21 21:28:23 +0000313 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000314 size_type bucket_count() const {return __table_.bucket_count();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000315 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000316 size_type max_bucket_count() const {return __table_.max_bucket_count();}
317
Howard Hinnant422a53f2010-09-21 21:28:23 +0000318 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000319 size_type elems_in_bucket(size_type __n) const {return __table_.bucket_size(__n);}
320
Howard Hinnant422a53f2010-09-21 21:28:23 +0000321 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000322 void resize(size_type __n) {__table_.rehash(__n);}
323};
324
325template <class _Value, class _Hash, class _Pred, class _Alloc>
326hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(size_type __n,
327 const hasher& __hf, const key_equal& __eql)
328 : __table_(__hf, __eql)
329{
330 __table_.rehash(__n);
331}
332
333template <class _Value, class _Hash, class _Pred, class _Alloc>
334hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(size_type __n,
335 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
336 : __table_(__hf, __eql, __a)
337{
338 __table_.rehash(__n);
339}
340
341template <class _Value, class _Hash, class _Pred, class _Alloc>
342template <class _InputIterator>
343hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
344 _InputIterator __first, _InputIterator __last)
345{
346 __table_.rehash(193);
347 insert(__first, __last);
348}
349
350template <class _Value, class _Hash, class _Pred, class _Alloc>
351template <class _InputIterator>
352hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
353 _InputIterator __first, _InputIterator __last, size_type __n,
354 const hasher& __hf, const key_equal& __eql)
355 : __table_(__hf, __eql)
356{
357 __table_.rehash(__n);
358 insert(__first, __last);
359}
360
361template <class _Value, class _Hash, class _Pred, class _Alloc>
362template <class _InputIterator>
363hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
364 _InputIterator __first, _InputIterator __last, size_type __n,
365 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
366 : __table_(__hf, __eql, __a)
367{
368 __table_.rehash(__n);
369 insert(__first, __last);
370}
371
372template <class _Value, class _Hash, class _Pred, class _Alloc>
373hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(
374 const hash_set& __u)
375 : __table_(__u.__table_)
376{
377 __table_.rehash(__u.bucket_count());
378 insert(__u.begin(), __u.end());
379}
380
381template <class _Value, class _Hash, class _Pred, class _Alloc>
382template <class _InputIterator>
Howard Hinnant422a53f2010-09-21 21:28:23 +0000383inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000384void
385hash_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
386 _InputIterator __last)
387{
388 for (; __first != __last; ++__first)
389 __table_.__insert_unique(*__first);
390}
391
392template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnant422a53f2010-09-21 21:28:23 +0000393inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000394void
395swap(hash_set<_Value, _Hash, _Pred, _Alloc>& __x,
396 hash_set<_Value, _Hash, _Pred, _Alloc>& __y)
397{
398 __x.swap(__y);
399}
400
401template <class _Value, class _Hash, class _Pred, class _Alloc>
402bool
403operator==(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x,
404 const hash_set<_Value, _Hash, _Pred, _Alloc>& __y)
405{
406 if (__x.size() != __y.size())
407 return false;
408 typedef typename hash_set<_Value, _Hash, _Pred, _Alloc>::const_iterator
409 const_iterator;
410 for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
411 __i != __ex; ++__i)
412 {
413 const_iterator __j = __y.find(*__i);
414 if (__j == __ey || !(*__i == *__j))
415 return false;
416 }
417 return true;
418}
419
420template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnant422a53f2010-09-21 21:28:23 +0000421inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000422bool
423operator!=(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x,
424 const hash_set<_Value, _Hash, _Pred, _Alloc>& __y)
425{
426 return !(__x == __y);
427}
428
429template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
430 class _Alloc = allocator<_Value> >
Howard Hinnant422a53f2010-09-21 21:28:23 +0000431class _LIBCPP_VISIBLE hash_multiset
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000432{
433public:
434 // types
435 typedef _Value key_type;
436 typedef key_type value_type;
437 typedef _Hash hasher;
438 typedef _Pred key_equal;
439 typedef _Alloc allocator_type;
440 typedef value_type& reference;
441 typedef const value_type& const_reference;
442
443private:
444 typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
445
446 __table __table_;
447
448public:
449 typedef typename __table::pointer pointer;
450 typedef typename __table::const_pointer const_pointer;
451 typedef typename __table::size_type size_type;
452 typedef typename __table::difference_type difference_type;
453
454 typedef typename __table::const_iterator iterator;
455 typedef typename __table::const_iterator const_iterator;
456
Howard Hinnant422a53f2010-09-21 21:28:23 +0000457 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000458 hash_multiset() {__table_.rehash(193);}
459 explicit hash_multiset(size_type __n, const hasher& __hf = hasher(),
460 const key_equal& __eql = key_equal());
461 hash_multiset(size_type __n, const hasher& __hf,
462 const key_equal& __eql, const allocator_type& __a);
463 template <class _InputIterator>
464 hash_multiset(_InputIterator __first, _InputIterator __last);
465 template <class _InputIterator>
466 hash_multiset(_InputIterator __first, _InputIterator __last,
467 size_type __n, const hasher& __hf = hasher(),
468 const key_equal& __eql = key_equal());
469 template <class _InputIterator>
470 hash_multiset(_InputIterator __first, _InputIterator __last,
471 size_type __n , const hasher& __hf,
472 const key_equal& __eql, const allocator_type& __a);
473 hash_multiset(const hash_multiset& __u);
474
Howard Hinnant422a53f2010-09-21 21:28:23 +0000475 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000476 allocator_type get_allocator() const
477 {return allocator_type(__table_.__node_alloc());}
478
Howard Hinnant422a53f2010-09-21 21:28:23 +0000479 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000480 bool empty() const {return __table_.size() == 0;}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000481 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000482 size_type size() const {return __table_.size();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000483 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000484 size_type max_size() const {return __table_.max_size();}
485
Howard Hinnant422a53f2010-09-21 21:28:23 +0000486 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000487 iterator begin() {return __table_.begin();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000488 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000489 iterator end() {return __table_.end();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000490 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000491 const_iterator begin() const {return __table_.begin();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000493 const_iterator end() const {return __table_.end();}
494
Howard Hinnant422a53f2010-09-21 21:28:23 +0000495 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000496 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
Sean Hunte36a1962011-07-29 23:31:53 +0000497 _LIBCPP_INLINE_VISIBILITY
498 iterator insert(const_iterator, const value_type& __x) {return insert(__x);}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000499 template <class _InputIterator>
500 void insert(_InputIterator __first, _InputIterator __last);
501
Howard Hinnant422a53f2010-09-21 21:28:23 +0000502 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000503 void erase(const_iterator __p) {__table_.erase(__p);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000504 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000505 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000506 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000507 void erase(const_iterator __first, const_iterator __last)
508 {__table_.erase(__first, __last);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000509 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000510 void clear() {__table_.clear();}
511
Howard Hinnant422a53f2010-09-21 21:28:23 +0000512 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000513 void swap(hash_multiset& __u) {__table_.swap(__u.__table_);}
514
Howard Hinnant422a53f2010-09-21 21:28:23 +0000515 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000516 hasher hash_funct() const {return __table_.hash_function();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000517 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000518 key_equal key_eq() const {return __table_.key_eq();}
519
Howard Hinnant422a53f2010-09-21 21:28:23 +0000520 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000521 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000522 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000523 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000524 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000525 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000526 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000527 pair<iterator, iterator> equal_range(const key_type& __k)
528 {return __table_.__equal_range_multi(__k);}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000529 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000530 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
531 {return __table_.__equal_range_multi(__k);}
532
Howard Hinnant422a53f2010-09-21 21:28:23 +0000533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000534 size_type bucket_count() const {return __table_.bucket_count();}
Howard Hinnant422a53f2010-09-21 21:28:23 +0000535 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000536 size_type max_bucket_count() const {return __table_.max_bucket_count();}
537
Howard Hinnant422a53f2010-09-21 21:28:23 +0000538 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000539 size_type elems_in_bucket(size_type __n) const {return __table_.bucket_size(__n);}
540
Howard Hinnant422a53f2010-09-21 21:28:23 +0000541 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000542 void resize(size_type __n) {__table_.rehash(__n);}
543};
544
545template <class _Value, class _Hash, class _Pred, class _Alloc>
546hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
547 size_type __n, const hasher& __hf, const key_equal& __eql)
548 : __table_(__hf, __eql)
549{
550 __table_.rehash(__n);
551}
552
553template <class _Value, class _Hash, class _Pred, class _Alloc>
554hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
555 size_type __n, const hasher& __hf, const key_equal& __eql,
556 const allocator_type& __a)
557 : __table_(__hf, __eql, __a)
558{
559 __table_.rehash(__n);
560}
561
562template <class _Value, class _Hash, class _Pred, class _Alloc>
563template <class _InputIterator>
564hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
565 _InputIterator __first, _InputIterator __last)
566{
567 __table_.rehash(193);
568 insert(__first, __last);
569}
570
571template <class _Value, class _Hash, class _Pred, class _Alloc>
572template <class _InputIterator>
573hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
574 _InputIterator __first, _InputIterator __last, size_type __n,
575 const hasher& __hf, const key_equal& __eql)
576 : __table_(__hf, __eql)
577{
578 __table_.rehash(__n);
579 insert(__first, __last);
580}
581
582template <class _Value, class _Hash, class _Pred, class _Alloc>
583template <class _InputIterator>
584hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
585 _InputIterator __first, _InputIterator __last, size_type __n,
586 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
587 : __table_(__hf, __eql, __a)
588{
589 __table_.rehash(__n);
590 insert(__first, __last);
591}
592
593template <class _Value, class _Hash, class _Pred, class _Alloc>
594hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset(
595 const hash_multiset& __u)
596 : __table_(__u.__table_)
597{
598 __table_.rehash(__u.bucket_count());
599 insert(__u.begin(), __u.end());
600}
601
602template <class _Value, class _Hash, class _Pred, class _Alloc>
603template <class _InputIterator>
Howard Hinnant422a53f2010-09-21 21:28:23 +0000604inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000605void
606hash_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
607 _InputIterator __last)
608{
609 for (; __first != __last; ++__first)
610 __table_.__insert_multi(*__first);
611}
612
613template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnant422a53f2010-09-21 21:28:23 +0000614inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000615void
616swap(hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
617 hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
618{
619 __x.swap(__y);
620}
621
622template <class _Value, class _Hash, class _Pred, class _Alloc>
623bool
624operator==(const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
625 const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
626{
627 if (__x.size() != __y.size())
628 return false;
629 typedef typename hash_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator
630 const_iterator;
631 typedef pair<const_iterator, const_iterator> _EqRng;
632 for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
633 {
634 _EqRng __xeq = __x.equal_range(*__i);
635 _EqRng __yeq = __y.equal_range(*__i);
Howard Hinnant0949eed2011-06-30 21:18:19 +0000636 if (_VSTD::distance(__xeq.first, __xeq.second) !=
637 _VSTD::distance(__yeq.first, __yeq.second) ||
638 !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000639 return false;
640 __i = __xeq.second;
641 }
642 return true;
643}
644
645template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnant422a53f2010-09-21 21:28:23 +0000646inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000647bool
648operator!=(const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
649 const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
650{
651 return !(__x == __y);
652}
653
654} // __gnu_cxx
655
656#endif // _LIBCPP_HASH_SET