Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(976)

Side by Side Diff: third_party/libc++/include/ext/hash_set

Issue 75213003: Add libc++ and libc++abi to third-party. (Closed) Base URL: https://src.chromium.org/chrome/trunk/src/
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libc++/include/ext/hash_map ('k') | third_party/libc++/include/forward_list » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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_typ e;
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_ref erence;
34 typedef typename allocator_traits<allocator_type>::pointer pointer;
35 typedef typename allocator_traits<allocator_type>::const_pointer const_poi nter;
36 typedef typename allocator_traits<allocator_type>::size_type size_type ;
37 typedef typename allocator_traits<allocator_type>::difference_type differenc e_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_typ e;
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_ref erence;
120 typedef typename allocator_traits<allocator_type>::pointer pointer;
121 typedef typename allocator_traits<allocator_type>::const_pointer const_poi nter;
122 typedef typename allocator_traits<allocator_type>::size_type size_type ;
123 typedef typename allocator_traits<allocator_type>::difference_type differenc e_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 <unorder ed_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<_Valu e>,
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_typ e;
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_ref erence;
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).f irst;}
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<_Valu e>,
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_typ e;
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_ref erence;
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
OLDNEW
« no previous file with comments | « third_party/libc++/include/ext/hash_map ('k') | third_party/libc++/include/forward_list » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698