root / lab4 / .minix-src / include / c++ / ext / hash_set
History | View | Annotate | Download (24.3 KB)
1 |
// -*- C++ -*- |
---|---|
2 |
//===------------------------- hash_set ------------------------------------===// |
3 |
// |
4 |
// The LLVM Compiler Infrastructure |
5 |
// |
6 |
// This file is dual licensed under the MIT and the University of Illinois Open |
7 |
// Source Licenses. See LICENSE.TXT for details. |
8 |
// |
9 |
//===----------------------------------------------------------------------===// |
10 | |
11 |
#ifndef _LIBCPP_HASH_SET |
12 |
#define _LIBCPP_HASH_SET |
13 | |
14 |
/* |
15 | |
16 |
hash_set synopsis |
17 | |
18 |
namespace __gnu_cxx |
19 |
{ |
20 | |
21 |
template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, |
22 |
class Alloc = allocator<Value>> |
23 |
class hash_set |
24 |
{ |
25 |
public: |
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 | |
93 |
template <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 | |
97 |
template <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 | |
102 |
template <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 | |
107 |
template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>, |
108 |
class Alloc = allocator<Value>> |
109 |
class hash_multiset |
110 |
{ |
111 |
public: |
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 | |
179 |
template <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 | |
183 |
template <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 | |
188 |
template <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 |
#include <ext/__hash> |
200 | |
201 |
#if __DEPRECATED |
202 |
#if defined(_MSC_VER) && ! defined(__clang__) |
203 |
_LIBCPP_WARNING("Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set>") |
204 |
#else |
205 |
# warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set> |
206 |
#endif |
207 |
#endif |
208 | |
209 |
namespace __gnu_cxx { |
210 | |
211 |
using namespace std; |
212 | |
213 |
template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, |
214 |
class _Alloc = allocator<_Value> > |
215 |
class _LIBCPP_TYPE_VIS_ONLY hash_set |
216 |
{ |
217 |
public: |
218 |
// types |
219 |
typedef _Value key_type; |
220 |
typedef key_type value_type; |
221 |
typedef _Hash hasher; |
222 |
typedef _Pred key_equal; |
223 |
typedef _Alloc allocator_type; |
224 |
typedef value_type& reference; |
225 |
typedef const value_type& const_reference; |
226 | |
227 |
private: |
228 |
typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; |
229 | |
230 |
__table __table_; |
231 | |
232 |
public: |
233 |
typedef typename __table::pointer pointer; |
234 |
typedef typename __table::const_pointer const_pointer; |
235 |
typedef typename __table::size_type size_type; |
236 |
typedef typename __table::difference_type difference_type; |
237 | |
238 |
typedef typename __table::const_iterator iterator; |
239 |
typedef typename __table::const_iterator const_iterator; |
240 | |
241 |
_LIBCPP_INLINE_VISIBILITY |
242 |
hash_set() {__table_.rehash(193);} |
243 |
explicit hash_set(size_type __n, const hasher& __hf = hasher(), |
244 |
const key_equal& __eql = key_equal()); |
245 |
hash_set(size_type __n, const hasher& __hf, const key_equal& __eql, |
246 |
const allocator_type& __a); |
247 |
template <class _InputIterator> |
248 |
hash_set(_InputIterator __first, _InputIterator __last); |
249 |
template <class _InputIterator> |
250 |
hash_set(_InputIterator __first, _InputIterator __last, |
251 |
size_type __n, const hasher& __hf = hasher(), |
252 |
const key_equal& __eql = key_equal()); |
253 |
template <class _InputIterator> |
254 |
hash_set(_InputIterator __first, _InputIterator __last, |
255 |
size_type __n, const hasher& __hf, const key_equal& __eql, |
256 |
const allocator_type& __a); |
257 |
hash_set(const hash_set& __u); |
258 | |
259 |
_LIBCPP_INLINE_VISIBILITY |
260 |
allocator_type get_allocator() const |
261 |
{return allocator_type(__table_.__node_alloc());} |
262 | |
263 |
_LIBCPP_INLINE_VISIBILITY |
264 |
bool empty() const {return __table_.size() == 0;} |
265 |
_LIBCPP_INLINE_VISIBILITY |
266 |
size_type size() const {return __table_.size();} |
267 |
_LIBCPP_INLINE_VISIBILITY |
268 |
size_type max_size() const {return __table_.max_size();} |
269 | |
270 |
_LIBCPP_INLINE_VISIBILITY |
271 |
iterator begin() {return __table_.begin();} |
272 |
_LIBCPP_INLINE_VISIBILITY |
273 |
iterator end() {return __table_.end();} |
274 |
_LIBCPP_INLINE_VISIBILITY |
275 |
const_iterator begin() const {return __table_.begin();} |
276 |
_LIBCPP_INLINE_VISIBILITY |
277 |
const_iterator end() const {return __table_.end();} |
278 | |
279 |
_LIBCPP_INLINE_VISIBILITY |
280 |
pair<iterator, bool> insert(const value_type& __x) |
281 |
{return __table_.__insert_unique(__x);} |
282 |
_LIBCPP_INLINE_VISIBILITY |
283 |
iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;} |
284 |
template <class _InputIterator> |
285 |
void insert(_InputIterator __first, _InputIterator __last); |
286 | |
287 |
_LIBCPP_INLINE_VISIBILITY |
288 |
void erase(const_iterator __p) {__table_.erase(__p);} |
289 |
_LIBCPP_INLINE_VISIBILITY |
290 |
size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} |
291 |
_LIBCPP_INLINE_VISIBILITY |
292 |
void erase(const_iterator __first, const_iterator __last) |
293 |
{__table_.erase(__first, __last);} |
294 |
_LIBCPP_INLINE_VISIBILITY |
295 |
void clear() {__table_.clear();} |
296 | |
297 |
_LIBCPP_INLINE_VISIBILITY |
298 |
void swap(hash_set& __u) {__table_.swap(__u.__table_);} |
299 | |
300 |
_LIBCPP_INLINE_VISIBILITY |
301 |
hasher hash_funct() const {return __table_.hash_function();} |
302 |
_LIBCPP_INLINE_VISIBILITY |
303 |
key_equal key_eq() const {return __table_.key_eq();} |
304 | |
305 |
_LIBCPP_INLINE_VISIBILITY |
306 |
iterator find(const key_type& __k) {return __table_.find(__k);} |
307 |
_LIBCPP_INLINE_VISIBILITY |
308 |
const_iterator find(const key_type& __k) const {return __table_.find(__k);} |
309 |
_LIBCPP_INLINE_VISIBILITY |
310 |
size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} |
311 |
_LIBCPP_INLINE_VISIBILITY |
312 |
pair<iterator, iterator> equal_range(const key_type& __k) |
313 |
{return __table_.__equal_range_unique(__k);} |
314 |
_LIBCPP_INLINE_VISIBILITY |
315 |
pair<const_iterator, const_iterator> equal_range(const key_type& __k) const |
316 |
{return __table_.__equal_range_unique(__k);} |
317 | |
318 |
_LIBCPP_INLINE_VISIBILITY |
319 |
size_type bucket_count() const {return __table_.bucket_count();} |
320 |
_LIBCPP_INLINE_VISIBILITY |
321 |
size_type max_bucket_count() const {return __table_.max_bucket_count();} |
322 | |
323 |
_LIBCPP_INLINE_VISIBILITY |
324 |
size_type elems_in_bucket(size_type __n) const {return __table_.bucket_size(__n);} |
325 | |
326 |
_LIBCPP_INLINE_VISIBILITY |
327 |
void resize(size_type __n) {__table_.rehash(__n);} |
328 |
}; |
329 | |
330 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
331 |
hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(size_type __n, |
332 |
const hasher& __hf, const key_equal& __eql) |
333 |
: __table_(__hf, __eql) |
334 |
{ |
335 |
__table_.rehash(__n); |
336 |
} |
337 | |
338 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
339 |
hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set(size_type __n, |
340 |
const hasher& __hf, const key_equal& __eql, const allocator_type& __a) |
341 |
: __table_(__hf, __eql, __a) |
342 |
{ |
343 |
__table_.rehash(__n); |
344 |
} |
345 | |
346 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
347 |
template <class _InputIterator> |
348 |
hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set( |
349 |
_InputIterator __first, _InputIterator __last) |
350 |
{ |
351 |
__table_.rehash(193); |
352 |
insert(__first, __last); |
353 |
} |
354 | |
355 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
356 |
template <class _InputIterator> |
357 |
hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set( |
358 |
_InputIterator __first, _InputIterator __last, size_type __n, |
359 |
const hasher& __hf, const key_equal& __eql) |
360 |
: __table_(__hf, __eql) |
361 |
{ |
362 |
__table_.rehash(__n); |
363 |
insert(__first, __last); |
364 |
} |
365 | |
366 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
367 |
template <class _InputIterator> |
368 |
hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set( |
369 |
_InputIterator __first, _InputIterator __last, size_type __n, |
370 |
const hasher& __hf, const key_equal& __eql, const allocator_type& __a) |
371 |
: __table_(__hf, __eql, __a) |
372 |
{ |
373 |
__table_.rehash(__n); |
374 |
insert(__first, __last); |
375 |
} |
376 | |
377 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
378 |
hash_set<_Value, _Hash, _Pred, _Alloc>::hash_set( |
379 |
const hash_set& __u) |
380 |
: __table_(__u.__table_) |
381 |
{ |
382 |
__table_.rehash(__u.bucket_count()); |
383 |
insert(__u.begin(), __u.end()); |
384 |
} |
385 | |
386 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
387 |
template <class _InputIterator> |
388 |
inline _LIBCPP_INLINE_VISIBILITY |
389 |
void |
390 |
hash_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, |
391 |
_InputIterator __last) |
392 |
{ |
393 |
for (; __first != __last; ++__first) |
394 |
__table_.__insert_unique(*__first); |
395 |
} |
396 | |
397 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
398 |
inline _LIBCPP_INLINE_VISIBILITY |
399 |
void |
400 |
swap(hash_set<_Value, _Hash, _Pred, _Alloc>& __x, |
401 |
hash_set<_Value, _Hash, _Pred, _Alloc>& __y) |
402 |
{ |
403 |
__x.swap(__y); |
404 |
} |
405 | |
406 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
407 |
bool |
408 |
operator==(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x, |
409 |
const hash_set<_Value, _Hash, _Pred, _Alloc>& __y) |
410 |
{ |
411 |
if (__x.size() != __y.size()) |
412 |
return false; |
413 |
typedef typename hash_set<_Value, _Hash, _Pred, _Alloc>::const_iterator |
414 |
const_iterator; |
415 |
for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); |
416 |
__i != __ex; ++__i) |
417 |
{ |
418 |
const_iterator __j = __y.find(*__i); |
419 |
if (__j == __ey || !(*__i == *__j)) |
420 |
return false; |
421 |
} |
422 |
return true; |
423 |
} |
424 | |
425 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
426 |
inline _LIBCPP_INLINE_VISIBILITY |
427 |
bool |
428 |
operator!=(const hash_set<_Value, _Hash, _Pred, _Alloc>& __x, |
429 |
const hash_set<_Value, _Hash, _Pred, _Alloc>& __y) |
430 |
{ |
431 |
return !(__x == __y); |
432 |
} |
433 | |
434 |
template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>, |
435 |
class _Alloc = allocator<_Value> > |
436 |
class _LIBCPP_TYPE_VIS_ONLY hash_multiset |
437 |
{ |
438 |
public: |
439 |
// types |
440 |
typedef _Value key_type; |
441 |
typedef key_type value_type; |
442 |
typedef _Hash hasher; |
443 |
typedef _Pred key_equal; |
444 |
typedef _Alloc allocator_type; |
445 |
typedef value_type& reference; |
446 |
typedef const value_type& const_reference; |
447 | |
448 |
private: |
449 |
typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table; |
450 | |
451 |
__table __table_; |
452 | |
453 |
public: |
454 |
typedef typename __table::pointer pointer; |
455 |
typedef typename __table::const_pointer const_pointer; |
456 |
typedef typename __table::size_type size_type; |
457 |
typedef typename __table::difference_type difference_type; |
458 | |
459 |
typedef typename __table::const_iterator iterator; |
460 |
typedef typename __table::const_iterator const_iterator; |
461 | |
462 |
_LIBCPP_INLINE_VISIBILITY |
463 |
hash_multiset() {__table_.rehash(193);} |
464 |
explicit hash_multiset(size_type __n, const hasher& __hf = hasher(), |
465 |
const key_equal& __eql = key_equal()); |
466 |
hash_multiset(size_type __n, const hasher& __hf, |
467 |
const key_equal& __eql, const allocator_type& __a); |
468 |
template <class _InputIterator> |
469 |
hash_multiset(_InputIterator __first, _InputIterator __last); |
470 |
template <class _InputIterator> |
471 |
hash_multiset(_InputIterator __first, _InputIterator __last, |
472 |
size_type __n, const hasher& __hf = hasher(), |
473 |
const key_equal& __eql = key_equal()); |
474 |
template <class _InputIterator> |
475 |
hash_multiset(_InputIterator __first, _InputIterator __last, |
476 |
size_type __n , const hasher& __hf, |
477 |
const key_equal& __eql, const allocator_type& __a); |
478 |
hash_multiset(const hash_multiset& __u); |
479 | |
480 |
_LIBCPP_INLINE_VISIBILITY |
481 |
allocator_type get_allocator() const |
482 |
{return allocator_type(__table_.__node_alloc());} |
483 | |
484 |
_LIBCPP_INLINE_VISIBILITY |
485 |
bool empty() const {return __table_.size() == 0;} |
486 |
_LIBCPP_INLINE_VISIBILITY |
487 |
size_type size() const {return __table_.size();} |
488 |
_LIBCPP_INLINE_VISIBILITY |
489 |
size_type max_size() const {return __table_.max_size();} |
490 | |
491 |
_LIBCPP_INLINE_VISIBILITY |
492 |
iterator begin() {return __table_.begin();} |
493 |
_LIBCPP_INLINE_VISIBILITY |
494 |
iterator end() {return __table_.end();} |
495 |
_LIBCPP_INLINE_VISIBILITY |
496 |
const_iterator begin() const {return __table_.begin();} |
497 |
_LIBCPP_INLINE_VISIBILITY |
498 |
const_iterator end() const {return __table_.end();} |
499 | |
500 |
_LIBCPP_INLINE_VISIBILITY |
501 |
iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} |
502 |
_LIBCPP_INLINE_VISIBILITY |
503 |
iterator insert(const_iterator, const value_type& __x) {return insert(__x);} |
504 |
template <class _InputIterator> |
505 |
void insert(_InputIterator __first, _InputIterator __last); |
506 | |
507 |
_LIBCPP_INLINE_VISIBILITY |
508 |
void erase(const_iterator __p) {__table_.erase(__p);} |
509 |
_LIBCPP_INLINE_VISIBILITY |
510 |
size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} |
511 |
_LIBCPP_INLINE_VISIBILITY |
512 |
void erase(const_iterator __first, const_iterator __last) |
513 |
{__table_.erase(__first, __last);} |
514 |
_LIBCPP_INLINE_VISIBILITY |
515 |
void clear() {__table_.clear();} |
516 | |
517 |
_LIBCPP_INLINE_VISIBILITY |
518 |
void swap(hash_multiset& __u) {__table_.swap(__u.__table_);} |
519 | |
520 |
_LIBCPP_INLINE_VISIBILITY |
521 |
hasher hash_funct() const {return __table_.hash_function();} |
522 |
_LIBCPP_INLINE_VISIBILITY |
523 |
key_equal key_eq() const {return __table_.key_eq();} |
524 | |
525 |
_LIBCPP_INLINE_VISIBILITY |
526 |
iterator find(const key_type& __k) {return __table_.find(__k);} |
527 |
_LIBCPP_INLINE_VISIBILITY |
528 |
const_iterator find(const key_type& __k) const {return __table_.find(__k);} |
529 |
_LIBCPP_INLINE_VISIBILITY |
530 |
size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} |
531 |
_LIBCPP_INLINE_VISIBILITY |
532 |
pair<iterator, iterator> equal_range(const key_type& __k) |
533 |
{return __table_.__equal_range_multi(__k);} |
534 |
_LIBCPP_INLINE_VISIBILITY |
535 |
pair<const_iterator, const_iterator> equal_range(const key_type& __k) const |
536 |
{return __table_.__equal_range_multi(__k);} |
537 | |
538 |
_LIBCPP_INLINE_VISIBILITY |
539 |
size_type bucket_count() const {return __table_.bucket_count();} |
540 |
_LIBCPP_INLINE_VISIBILITY |
541 |
size_type max_bucket_count() const {return __table_.max_bucket_count();} |
542 | |
543 |
_LIBCPP_INLINE_VISIBILITY |
544 |
size_type elems_in_bucket(size_type __n) const {return __table_.bucket_size(__n);} |
545 | |
546 |
_LIBCPP_INLINE_VISIBILITY |
547 |
void resize(size_type __n) {__table_.rehash(__n);} |
548 |
}; |
549 | |
550 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
551 |
hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( |
552 |
size_type __n, const hasher& __hf, const key_equal& __eql) |
553 |
: __table_(__hf, __eql) |
554 |
{ |
555 |
__table_.rehash(__n); |
556 |
} |
557 | |
558 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
559 |
hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( |
560 |
size_type __n, const hasher& __hf, const key_equal& __eql, |
561 |
const allocator_type& __a) |
562 |
: __table_(__hf, __eql, __a) |
563 |
{ |
564 |
__table_.rehash(__n); |
565 |
} |
566 | |
567 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
568 |
template <class _InputIterator> |
569 |
hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( |
570 |
_InputIterator __first, _InputIterator __last) |
571 |
{ |
572 |
__table_.rehash(193); |
573 |
insert(__first, __last); |
574 |
} |
575 | |
576 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
577 |
template <class _InputIterator> |
578 |
hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( |
579 |
_InputIterator __first, _InputIterator __last, size_type __n, |
580 |
const hasher& __hf, const key_equal& __eql) |
581 |
: __table_(__hf, __eql) |
582 |
{ |
583 |
__table_.rehash(__n); |
584 |
insert(__first, __last); |
585 |
} |
586 | |
587 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
588 |
template <class _InputIterator> |
589 |
hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( |
590 |
_InputIterator __first, _InputIterator __last, size_type __n, |
591 |
const hasher& __hf, const key_equal& __eql, const allocator_type& __a) |
592 |
: __table_(__hf, __eql, __a) |
593 |
{ |
594 |
__table_.rehash(__n); |
595 |
insert(__first, __last); |
596 |
} |
597 | |
598 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
599 |
hash_multiset<_Value, _Hash, _Pred, _Alloc>::hash_multiset( |
600 |
const hash_multiset& __u) |
601 |
: __table_(__u.__table_) |
602 |
{ |
603 |
__table_.rehash(__u.bucket_count()); |
604 |
insert(__u.begin(), __u.end()); |
605 |
} |
606 | |
607 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
608 |
template <class _InputIterator> |
609 |
inline _LIBCPP_INLINE_VISIBILITY |
610 |
void |
611 |
hash_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, |
612 |
_InputIterator __last) |
613 |
{ |
614 |
for (; __first != __last; ++__first) |
615 |
__table_.__insert_multi(*__first); |
616 |
} |
617 | |
618 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
619 |
inline _LIBCPP_INLINE_VISIBILITY |
620 |
void |
621 |
swap(hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x, |
622 |
hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y) |
623 |
{ |
624 |
__x.swap(__y); |
625 |
} |
626 | |
627 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
628 |
bool |
629 |
operator==(const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x, |
630 |
const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y) |
631 |
{ |
632 |
if (__x.size() != __y.size()) |
633 |
return false; |
634 |
typedef typename hash_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator |
635 |
const_iterator; |
636 |
typedef pair<const_iterator, const_iterator> _EqRng; |
637 |
for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) |
638 |
{ |
639 |
_EqRng __xeq = __x.equal_range(*__i); |
640 |
_EqRng __yeq = __y.equal_range(*__i); |
641 |
if (_VSTD::distance(__xeq.first, __xeq.second) != |
642 |
_VSTD::distance(__yeq.first, __yeq.second) || |
643 |
!_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) |
644 |
return false; |
645 |
__i = __xeq.second; |
646 |
} |
647 |
return true; |
648 |
} |
649 | |
650 |
template <class _Value, class _Hash, class _Pred, class _Alloc> |
651 |
inline _LIBCPP_INLINE_VISIBILITY |
652 |
bool |
653 |
operator!=(const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __x, |
654 |
const hash_multiset<_Value, _Hash, _Pred, _Alloc>& __y) |
655 |
{ |
656 |
return !(__x == __y); |
657 |
} |
658 | |
659 |
} // __gnu_cxx |
660 | |
661 |
#endif // _LIBCPP_HASH_SET |