blob: 119251dc3f8409389c4cdda600845719fd893f21 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:161// -*- C++ -*-
2//===-------------------------- unordered_set -----------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:014// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:165//
Howard Hinnantb64f8b02010-11-16 22:09:026// 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:168//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_UNORDERED_SET
12#define _LIBCPP_UNORDERED_SET
13
14/*
15
16 unordered_set synopsis
17
18#include <initializer_list>
19
20namespace std
21{
22
23template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
24 class Alloc = allocator<Value>>
25class unordered_set
26{
27public:
28 // types
29 typedef Value key_type;
30 typedef key_type value_type;
31 typedef Hash hasher;
32 typedef Pred key_equal;
33 typedef Alloc allocator_type;
34 typedef value_type& reference;
35 typedef const value_type& const_reference;
36 typedef typename allocator_traits<allocator_type>::pointer pointer;
37 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
38 typedef typename allocator_traits<allocator_type>::size_type size_type;
39 typedef typename allocator_traits<allocator_type>::difference_type difference_type;
40
41 typedef /unspecified/ iterator;
42 typedef /unspecified/ const_iterator;
43 typedef /unspecified/ local_iterator;
44 typedef /unspecified/ const_local_iterator;
45
Howard Hinnant04dae1d2011-06-04 20:18:3746 unordered_set()
47 noexcept(
48 is_nothrow_default_constructible<hasher>::value &&
49 is_nothrow_default_constructible<key_equal>::value &&
50 is_nothrow_default_constructible<allocator_type>::value);
51 explicit unordered_set(size_type n, const hasher& hf = hasher(),
Howard Hinnantbc8d3f92010-05-11 19:42:1652 const key_equal& eql = key_equal(),
53 const allocator_type& a = allocator_type());
54 template <class InputIterator>
55 unordered_set(InputIterator f, InputIterator l,
56 size_type n = 0, const hasher& hf = hasher(),
57 const key_equal& eql = key_equal(),
58 const allocator_type& a = allocator_type());
59 explicit unordered_set(const allocator_type&);
60 unordered_set(const unordered_set&);
61 unordered_set(const unordered_set&, const Allocator&);
Howard Hinnant04dae1d2011-06-04 20:18:3762 unordered_set(unordered_set&&)
63 noexcept(
64 is_nothrow_move_constructible<hasher>::value &&
65 is_nothrow_move_constructible<key_equal>::value &&
66 is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:1667 unordered_set(unordered_set&&, const Allocator&);
68 unordered_set(initializer_list<value_type>, size_type n = 0,
69 const hasher& hf = hasher(), const key_equal& eql = key_equal(),
70 const allocator_type& a = allocator_type());
71 ~unordered_set();
72 unordered_set& operator=(const unordered_set&);
Howard Hinnant04dae1d2011-06-04 20:18:3773 unordered_set& operator=(unordered_set&&)
74 noexcept(
75 allocator_type::propagate_on_container_move_assignment::value &&
76 is_nothrow_move_assignable<allocator_type>::value &&
77 is_nothrow_move_assignable<hasher>::value &&
78 is_nothrow_move_assignable<key_equal>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:1679 unordered_set& operator=(initializer_list<value_type>);
80
Howard Hinnant04dae1d2011-06-04 20:18:3781 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:1682
Howard Hinnant04dae1d2011-06-04 20:18:3783 bool empty() const noexcept;
84 size_type size() const noexcept;
85 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:1686
Howard Hinnant04dae1d2011-06-04 20:18:3787 iterator begin() noexcept;
88 iterator end() noexcept;
89 const_iterator begin() const noexcept;
90 const_iterator end() const noexcept;
91 const_iterator cbegin() const noexcept;
92 const_iterator cend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:1693
94 template <class... Args>
95 pair<iterator, bool> emplace(Args&&... args);
96 template <class... Args>
97 iterator emplace_hint(const_iterator position, Args&&... args);
98 pair<iterator, bool> insert(const value_type& obj);
99 pair<iterator, bool> insert(value_type&& obj);
100 iterator insert(const_iterator hint, const value_type& obj);
101 iterator insert(const_iterator hint, value_type&& obj);
102 template <class InputIterator>
103 void insert(InputIterator first, InputIterator last);
104 void insert(initializer_list<value_type>);
105
106 iterator erase(const_iterator position);
107 size_type erase(const key_type& k);
108 iterator erase(const_iterator first, const_iterator last);
Howard Hinnant04dae1d2011-06-04 20:18:37109 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16110
Howard Hinnant04dae1d2011-06-04 20:18:37111 void swap(unordered_set&)
112 noexcept(
113 (!allocator_type::propagate_on_container_swap::value ||
114 __is_nothrow_swappable<allocator_type>::value) &&
115 __is_nothrow_swappable<hasher>::value &&
116 __is_nothrow_swappable<key_equal>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16117
118 hasher hash_function() const;
119 key_equal key_eq() const;
120
121 iterator find(const key_type& k);
122 const_iterator find(const key_type& k) const;
123 size_type count(const key_type& k) const;
124 pair<iterator, iterator> equal_range(const key_type& k);
125 pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
126
Howard Hinnant04dae1d2011-06-04 20:18:37127 size_type bucket_count() const noexcept;
128 size_type max_bucket_count() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16129
130 size_type bucket_size(size_type n) const;
131 size_type bucket(const key_type& k) const;
132
133 local_iterator begin(size_type n);
134 local_iterator end(size_type n);
135 const_local_iterator begin(size_type n) const;
136 const_local_iterator end(size_type n) const;
137 const_local_iterator cbegin(size_type n) const;
138 const_local_iterator cend(size_type n) const;
139
Howard Hinnant04dae1d2011-06-04 20:18:37140 float load_factor() const noexcept;
141 float max_load_factor() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16142 void max_load_factor(float z);
143 void rehash(size_type n);
144 void reserve(size_type n);
145};
146
147template <class Value, class Hash, class Pred, class Alloc>
148 void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
Howard Hinnant04dae1d2011-06-04 20:18:37149 unordered_set<Value, Hash, Pred, Alloc>& y)
150 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16151
152template <class Value, class Hash, class Pred, class Alloc>
153 bool
154 operator==(const unordered_set<Value, Hash, Pred, Alloc>& x,
155 const unordered_set<Value, Hash, Pred, Alloc>& y);
156
157template <class Value, class Hash, class Pred, class Alloc>
158 bool
159 operator!=(const unordered_set<Value, Hash, Pred, Alloc>& x,
160 const unordered_set<Value, Hash, Pred, Alloc>& y);
161
162template <class Value, class Hash = hash<Value>, class Pred = equal_to<Value>,
163 class Alloc = allocator<Value>>
164class unordered_multiset
165{
166public:
167 // types
168 typedef Value key_type;
169 typedef key_type value_type;
170 typedef Hash hasher;
171 typedef Pred key_equal;
172 typedef Alloc allocator_type;
173 typedef value_type& reference;
174 typedef const value_type& const_reference;
175 typedef typename allocator_traits<allocator_type>::pointer pointer;
176 typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
177 typedef typename allocator_traits<allocator_type>::size_type size_type;
178 typedef typename allocator_traits<allocator_type>::difference_type difference_type;
179
180 typedef /unspecified/ iterator;
181 typedef /unspecified/ const_iterator;
182 typedef /unspecified/ local_iterator;
183 typedef /unspecified/ const_local_iterator;
184
Howard Hinnant04dae1d2011-06-04 20:18:37185 unordered_multiset()
186 noexcept(
187 is_nothrow_default_constructible<hasher>::value &&
188 is_nothrow_default_constructible<key_equal>::value &&
189 is_nothrow_default_constructible<allocator_type>::value);
190 explicit unordered_multiset(size_type n, const hasher& hf = hasher(),
Howard Hinnantbc8d3f92010-05-11 19:42:16191 const key_equal& eql = key_equal(),
192 const allocator_type& a = allocator_type());
193 template <class InputIterator>
194 unordered_multiset(InputIterator f, InputIterator l,
195 size_type n = 0, const hasher& hf = hasher(),
196 const key_equal& eql = key_equal(),
197 const allocator_type& a = allocator_type());
198 explicit unordered_multiset(const allocator_type&);
199 unordered_multiset(const unordered_multiset&);
200 unordered_multiset(const unordered_multiset&, const Allocator&);
Howard Hinnant04dae1d2011-06-04 20:18:37201 unordered_multiset(unordered_multiset&&)
202 noexcept(
203 is_nothrow_move_constructible<hasher>::value &&
204 is_nothrow_move_constructible<key_equal>::value &&
205 is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16206 unordered_multiset(unordered_multiset&&, const Allocator&);
207 unordered_multiset(initializer_list<value_type>, size_type n = /see below/,
208 const hasher& hf = hasher(), const key_equal& eql = key_equal(),
209 const allocator_type& a = allocator_type());
210 ~unordered_multiset();
211 unordered_multiset& operator=(const unordered_multiset&);
Howard Hinnant04dae1d2011-06-04 20:18:37212 unordered_multiset& operator=(unordered_multiset&&)
213 noexcept(
214 allocator_type::propagate_on_container_move_assignment::value &&
215 is_nothrow_move_assignable<allocator_type>::value &&
216 is_nothrow_move_assignable<hasher>::value &&
217 is_nothrow_move_assignable<key_equal>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16218 unordered_multiset& operator=(initializer_list<value_type>);
219
Howard Hinnant04dae1d2011-06-04 20:18:37220 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16221
Howard Hinnant04dae1d2011-06-04 20:18:37222 bool empty() const noexcept;
223 size_type size() const noexcept;
224 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16225
Howard Hinnant04dae1d2011-06-04 20:18:37226 iterator begin() noexcept;
227 iterator end() noexcept;
228 const_iterator begin() const noexcept;
229 const_iterator end() const noexcept;
230 const_iterator cbegin() const noexcept;
231 const_iterator cend() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16232
233 template <class... Args>
234 iterator emplace(Args&&... args);
235 template <class... Args>
236 iterator emplace_hint(const_iterator position, Args&&... args);
237 iterator insert(const value_type& obj);
238 iterator insert(value_type&& obj);
239 iterator insert(const_iterator hint, const value_type& obj);
240 iterator insert(const_iterator hint, value_type&& obj);
241 template <class InputIterator>
242 void insert(InputIterator first, InputIterator last);
243 void insert(initializer_list<value_type>);
244
245 iterator erase(const_iterator position);
246 size_type erase(const key_type& k);
247 iterator erase(const_iterator first, const_iterator last);
Howard Hinnant04dae1d2011-06-04 20:18:37248 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16249
Howard Hinnant04dae1d2011-06-04 20:18:37250 void swap(unordered_multiset&)
251 noexcept(
252 (!allocator_type::propagate_on_container_swap::value ||
253 __is_nothrow_swappable<allocator_type>::value) &&
254 __is_nothrow_swappable<hasher>::value &&
255 __is_nothrow_swappable<key_equal>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16256
257 hasher hash_function() const;
258 key_equal key_eq() const;
259
260 iterator find(const key_type& k);
261 const_iterator find(const key_type& k) const;
262 size_type count(const key_type& k) const;
263 pair<iterator, iterator> equal_range(const key_type& k);
264 pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
265
Howard Hinnant04dae1d2011-06-04 20:18:37266 size_type bucket_count() const noexcept;
267 size_type max_bucket_count() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16268
269 size_type bucket_size(size_type n) const;
270 size_type bucket(const key_type& k) const;
271
272 local_iterator begin(size_type n);
273 local_iterator end(size_type n);
274 const_local_iterator begin(size_type n) const;
275 const_local_iterator end(size_type n) const;
276 const_local_iterator cbegin(size_type n) const;
277 const_local_iterator cend(size_type n) const;
278
Howard Hinnant04dae1d2011-06-04 20:18:37279 float load_factor() const noexcept;
280 float max_load_factor() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16281 void max_load_factor(float z);
282 void rehash(size_type n);
283 void reserve(size_type n);
284};
285
286template <class Value, class Hash, class Pred, class Alloc>
287 void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
Howard Hinnant04dae1d2011-06-04 20:18:37288 unordered_multiset<Value, Hash, Pred, Alloc>& y)
289 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16290
291template <class Value, class Hash, class Pred, class Alloc>
292 bool
293 operator==(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
294 const unordered_multiset<Value, Hash, Pred, Alloc>& y);
295
296template <class Value, class Hash, class Pred, class Alloc>
297 bool
298 operator!=(const unordered_multiset<Value, Hash, Pred, Alloc>& x,
299 const unordered_multiset<Value, Hash, Pred, Alloc>& y);
300} // std
301
302*/
303
304#include <__config>
305#include <__hash_table>
306#include <functional>
307
Howard Hinnant08e17472011-10-17 20:05:10308#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16309#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10310#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16311
312_LIBCPP_BEGIN_NAMESPACE_STD
313
314template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
315 class _Alloc = allocator<_Value> >
Howard Hinnant83eade62013-03-06 23:30:19316class _LIBCPP_TYPE_VIS unordered_set
Howard Hinnantbc8d3f92010-05-11 19:42:16317{
318public:
319 // types
320 typedef _Value key_type;
321 typedef key_type value_type;
322 typedef _Hash hasher;
323 typedef _Pred key_equal;
324 typedef _Alloc allocator_type;
325 typedef value_type& reference;
326 typedef const value_type& const_reference;
327
328private:
329 typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
330
331 __table __table_;
332
333public:
334 typedef typename __table::pointer pointer;
335 typedef typename __table::const_pointer const_pointer;
336 typedef typename __table::size_type size_type;
337 typedef typename __table::difference_type difference_type;
338
339 typedef typename __table::const_iterator iterator;
340 typedef typename __table::const_iterator const_iterator;
341 typedef typename __table::const_local_iterator local_iterator;
342 typedef typename __table::const_local_iterator const_local_iterator;
343
Howard Hinnantee6ccd02010-09-23 18:58:28344 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37345 unordered_set()
346 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
347 {} // = default;
Howard Hinnantbc8d3f92010-05-11 19:42:16348 explicit unordered_set(size_type __n, const hasher& __hf = hasher(),
349 const key_equal& __eql = key_equal());
350 unordered_set(size_type __n, const hasher& __hf, const key_equal& __eql,
351 const allocator_type& __a);
352 template <class _InputIterator>
353 unordered_set(_InputIterator __first, _InputIterator __last);
354 template <class _InputIterator>
355 unordered_set(_InputIterator __first, _InputIterator __last,
356 size_type __n, const hasher& __hf = hasher(),
357 const key_equal& __eql = key_equal());
358 template <class _InputIterator>
359 unordered_set(_InputIterator __first, _InputIterator __last,
360 size_type __n, const hasher& __hf, const key_equal& __eql,
361 const allocator_type& __a);
362 explicit unordered_set(const allocator_type& __a);
363 unordered_set(const unordered_set& __u);
364 unordered_set(const unordered_set& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19365#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37366 unordered_set(unordered_set&& __u)
367 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16368 unordered_set(unordered_set&& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19369#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02370#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16371 unordered_set(initializer_list<value_type> __il);
372 unordered_set(initializer_list<value_type> __il, size_type __n,
373 const hasher& __hf = hasher(),
374 const key_equal& __eql = key_equal());
375 unordered_set(initializer_list<value_type> __il, size_type __n,
376 const hasher& __hf, const key_equal& __eql,
377 const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02378#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16379 // ~unordered_set() = default;
Howard Hinnant61aa6012011-07-01 19:24:36380 _LIBCPP_INLINE_VISIBILITY
381 unordered_set& operator=(const unordered_set& __u)
382 {
383 __table_ = __u.__table_;
384 return *this;
385 }
Howard Hinnant73d21a42010-09-04 23:28:19386#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37387 unordered_set& operator=(unordered_set&& __u)
388 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16389#endif
Howard Hinnante3e32912011-08-12 21:56:02390#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16391 unordered_set& operator=(initializer_list<value_type> __il);
Howard Hinnante3e32912011-08-12 21:56:02392#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16393
Howard Hinnantee6ccd02010-09-23 18:58:28394 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37395 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16396 {return allocator_type(__table_.__node_alloc());}
397
Howard Hinnantee6ccd02010-09-23 18:58:28398 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37399 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:28400 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37401 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:28402 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37403 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16404
Howard Hinnantee6ccd02010-09-23 18:58:28405 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37406 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28407 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37408 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28409 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37410 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28411 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37412 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28413 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37414 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28415 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37416 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16417
Howard Hinnant73d21a42010-09-04 23:28:19418#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16419 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28420 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16421 pair<iterator, bool> emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19422 {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:16423 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28424 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16425 iterator emplace_hint(const_iterator, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19426 {return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;}
Howard Hinnant73d21a42010-09-04 23:28:19427#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantee6ccd02010-09-23 18:58:28428 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16429 pair<iterator, bool> insert(const value_type& __x)
430 {return __table_.__insert_unique(__x);}
Howard Hinnant73d21a42010-09-04 23:28:19431#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28432 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16433 pair<iterator, bool> insert(value_type&& __x)
Howard Hinnant0949eed2011-06-30 21:18:19434 {return __table_.__insert_unique(_VSTD::move(__x));}
Howard Hinnant73d21a42010-09-04 23:28:19435#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28436 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16437 iterator insert(const_iterator, const value_type& __x)
438 {return insert(__x).first;}
Howard Hinnant73d21a42010-09-04 23:28:19439#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28440 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16441 iterator insert(const_iterator, value_type&& __x)
Howard Hinnant0949eed2011-06-30 21:18:19442 {return insert(_VSTD::move(__x)).first;}
Howard Hinnant73d21a42010-09-04 23:28:19443#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16444 template <class _InputIterator>
445 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02446#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28447 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16448 void insert(initializer_list<value_type> __il)
449 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02450#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16451
Howard Hinnantee6ccd02010-09-23 18:58:28452 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16453 iterator erase(const_iterator __p) {return __table_.erase(__p);}
Howard Hinnantee6ccd02010-09-23 18:58:28454 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16455 size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28456 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16457 iterator erase(const_iterator __first, const_iterator __last)
458 {return __table_.erase(__first, __last);}
Howard Hinnantee6ccd02010-09-23 18:58:28459 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37460 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:16461
Howard Hinnantee6ccd02010-09-23 18:58:28462 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37463 void swap(unordered_set& __u)
464 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
465 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16466
Howard Hinnantee6ccd02010-09-23 18:58:28467 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16468 hasher hash_function() const {return __table_.hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:28469 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16470 key_equal key_eq() const {return __table_.key_eq();}
471
Howard Hinnantee6ccd02010-09-23 18:58:28472 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16473 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28474 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16475 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28476 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16477 size_type count(const key_type& __k) const {return __table_.__count_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28478 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16479 pair<iterator, iterator> equal_range(const key_type& __k)
480 {return __table_.__equal_range_unique(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28481 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16482 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
483 {return __table_.__equal_range_unique(__k);}
484
Howard Hinnantee6ccd02010-09-23 18:58:28485 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37486 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:28487 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37488 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:16489
Howard Hinnantee6ccd02010-09-23 18:58:28490 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16491 size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16493 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
494
Howard Hinnantee6ccd02010-09-23 18:58:28495 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16496 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28497 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16498 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16500 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16502 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16504 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28505 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16506 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
507
Howard Hinnantee6ccd02010-09-23 18:58:28508 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37509 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:28510 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37511 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:28512 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16513 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:28514 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16515 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28516 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16517 void reserve(size_type __n) {__table_.reserve(__n);}
518};
519
520template <class _Value, class _Hash, class _Pred, class _Alloc>
521unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
522 const hasher& __hf, const key_equal& __eql)
523 : __table_(__hf, __eql)
524{
525 __table_.rehash(__n);
526}
527
528template <class _Value, class _Hash, class _Pred, class _Alloc>
529unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(size_type __n,
530 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
531 : __table_(__hf, __eql, __a)
532{
533 __table_.rehash(__n);
534}
535
536template <class _Value, class _Hash, class _Pred, class _Alloc>
537template <class _InputIterator>
538unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
539 _InputIterator __first, _InputIterator __last)
540{
541 insert(__first, __last);
542}
543
544template <class _Value, class _Hash, class _Pred, class _Alloc>
545template <class _InputIterator>
546unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
547 _InputIterator __first, _InputIterator __last, size_type __n,
548 const hasher& __hf, const key_equal& __eql)
549 : __table_(__hf, __eql)
550{
551 __table_.rehash(__n);
552 insert(__first, __last);
553}
554
555template <class _Value, class _Hash, class _Pred, class _Alloc>
556template <class _InputIterator>
557unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
558 _InputIterator __first, _InputIterator __last, size_type __n,
559 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
560 : __table_(__hf, __eql, __a)
561{
562 __table_.rehash(__n);
563 insert(__first, __last);
564}
565
566template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28567inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16568unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
569 const allocator_type& __a)
570 : __table_(__a)
571{
572}
573
574template <class _Value, class _Hash, class _Pred, class _Alloc>
575unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
576 const unordered_set& __u)
577 : __table_(__u.__table_)
578{
579 __table_.rehash(__u.bucket_count());
580 insert(__u.begin(), __u.end());
581}
582
583template <class _Value, class _Hash, class _Pred, class _Alloc>
584unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
585 const unordered_set& __u, const allocator_type& __a)
586 : __table_(__u.__table_, __a)
587{
588 __table_.rehash(__u.bucket_count());
589 insert(__u.begin(), __u.end());
590}
591
Howard Hinnant73d21a42010-09-04 23:28:19592#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16593
594template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28595inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16596unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
597 unordered_set&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:37598 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:19599 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:16600{
601}
602
603template <class _Value, class _Hash, class _Pred, class _Alloc>
604unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
605 unordered_set&& __u, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:19606 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:16607{
608 if (__a != __u.get_allocator())
609 {
610 iterator __i = __u.begin();
611 while (__u.size() != 0)
Howard Hinnant0949eed2011-06-30 21:18:19612 __table_.__insert_unique(_VSTD::move(__u.__table_.remove(__i++)->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:16613 }
614}
615
Howard Hinnant73d21a42010-09-04 23:28:19616#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16617
Howard Hinnante3e32912011-08-12 21:56:02618#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
619
Howard Hinnantbc8d3f92010-05-11 19:42:16620template <class _Value, class _Hash, class _Pred, class _Alloc>
621unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
622 initializer_list<value_type> __il)
623{
624 insert(__il.begin(), __il.end());
625}
626
627template <class _Value, class _Hash, class _Pred, class _Alloc>
628unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
629 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
630 const key_equal& __eql)
631 : __table_(__hf, __eql)
632{
633 __table_.rehash(__n);
634 insert(__il.begin(), __il.end());
635}
636
637template <class _Value, class _Hash, class _Pred, class _Alloc>
638unordered_set<_Value, _Hash, _Pred, _Alloc>::unordered_set(
639 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
640 const key_equal& __eql, const allocator_type& __a)
641 : __table_(__hf, __eql, __a)
642{
643 __table_.rehash(__n);
644 insert(__il.begin(), __il.end());
645}
646
Howard Hinnante3e32912011-08-12 21:56:02647#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
648
Howard Hinnant73d21a42010-09-04 23:28:19649#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16650
651template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28652inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16653unordered_set<_Value, _Hash, _Pred, _Alloc>&
654unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(unordered_set&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:37655 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16656{
Howard Hinnant0949eed2011-06-30 21:18:19657 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:16658 return *this;
659}
660
Howard Hinnant73d21a42010-09-04 23:28:19661#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16662
Howard Hinnante3e32912011-08-12 21:56:02663#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
664
Howard Hinnantbc8d3f92010-05-11 19:42:16665template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28666inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16667unordered_set<_Value, _Hash, _Pred, _Alloc>&
668unordered_set<_Value, _Hash, _Pred, _Alloc>::operator=(
669 initializer_list<value_type> __il)
670{
671 __table_.__assign_unique(__il.begin(), __il.end());
672 return *this;
673}
674
Howard Hinnante3e32912011-08-12 21:56:02675#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
676
Howard Hinnantbc8d3f92010-05-11 19:42:16677template <class _Value, class _Hash, class _Pred, class _Alloc>
678template <class _InputIterator>
Howard Hinnantee6ccd02010-09-23 18:58:28679inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16680void
681unordered_set<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
682 _InputIterator __last)
683{
684 for (; __first != __last; ++__first)
685 __table_.__insert_unique(*__first);
686}
687
688template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28689inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16690void
691swap(unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
692 unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant04dae1d2011-06-04 20:18:37693 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:16694{
695 __x.swap(__y);
696}
697
698template <class _Value, class _Hash, class _Pred, class _Alloc>
699bool
700operator==(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
701 const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
702{
703 if (__x.size() != __y.size())
704 return false;
705 typedef typename unordered_set<_Value, _Hash, _Pred, _Alloc>::const_iterator
706 const_iterator;
707 for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end();
708 __i != __ex; ++__i)
709 {
710 const_iterator __j = __y.find(*__i);
711 if (__j == __ey || !(*__i == *__j))
712 return false;
713 }
714 return true;
715}
716
717template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28718inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16719bool
720operator!=(const unordered_set<_Value, _Hash, _Pred, _Alloc>& __x,
721 const unordered_set<_Value, _Hash, _Pred, _Alloc>& __y)
722{
723 return !(__x == __y);
724}
725
726template <class _Value, class _Hash = hash<_Value>, class _Pred = equal_to<_Value>,
727 class _Alloc = allocator<_Value> >
Howard Hinnant83eade62013-03-06 23:30:19728class _LIBCPP_TYPE_VIS unordered_multiset
Howard Hinnantbc8d3f92010-05-11 19:42:16729{
730public:
731 // types
732 typedef _Value key_type;
733 typedef key_type value_type;
734 typedef _Hash hasher;
735 typedef _Pred key_equal;
736 typedef _Alloc allocator_type;
737 typedef value_type& reference;
738 typedef const value_type& const_reference;
739
740private:
741 typedef __hash_table<value_type, hasher, key_equal, allocator_type> __table;
742
743 __table __table_;
744
745public:
746 typedef typename __table::pointer pointer;
747 typedef typename __table::const_pointer const_pointer;
748 typedef typename __table::size_type size_type;
749 typedef typename __table::difference_type difference_type;
750
751 typedef typename __table::const_iterator iterator;
752 typedef typename __table::const_iterator const_iterator;
753 typedef typename __table::const_local_iterator local_iterator;
754 typedef typename __table::const_local_iterator const_local_iterator;
755
Howard Hinnantee6ccd02010-09-23 18:58:28756 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37757 unordered_multiset()
758 _NOEXCEPT_(is_nothrow_default_constructible<__table>::value)
759 {} // = default
Howard Hinnantbc8d3f92010-05-11 19:42:16760 explicit unordered_multiset(size_type __n, const hasher& __hf = hasher(),
761 const key_equal& __eql = key_equal());
762 unordered_multiset(size_type __n, const hasher& __hf,
763 const key_equal& __eql, const allocator_type& __a);
764 template <class _InputIterator>
765 unordered_multiset(_InputIterator __first, _InputIterator __last);
766 template <class _InputIterator>
767 unordered_multiset(_InputIterator __first, _InputIterator __last,
768 size_type __n, const hasher& __hf = hasher(),
769 const key_equal& __eql = key_equal());
770 template <class _InputIterator>
771 unordered_multiset(_InputIterator __first, _InputIterator __last,
772 size_type __n , const hasher& __hf,
773 const key_equal& __eql, const allocator_type& __a);
774 explicit unordered_multiset(const allocator_type& __a);
775 unordered_multiset(const unordered_multiset& __u);
776 unordered_multiset(const unordered_multiset& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19777#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37778 unordered_multiset(unordered_multiset&& __u)
779 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16780 unordered_multiset(unordered_multiset&& __u, const allocator_type& __a);
Howard Hinnant73d21a42010-09-04 23:28:19781#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02782#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16783 unordered_multiset(initializer_list<value_type> __il);
784 unordered_multiset(initializer_list<value_type> __il, size_type __n,
785 const hasher& __hf = hasher(),
786 const key_equal& __eql = key_equal());
787 unordered_multiset(initializer_list<value_type> __il, size_type __n,
788 const hasher& __hf, const key_equal& __eql,
789 const allocator_type& __a);
Howard Hinnante3e32912011-08-12 21:56:02790#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16791 // ~unordered_multiset() = default;
Howard Hinnant61aa6012011-07-01 19:24:36792 _LIBCPP_INLINE_VISIBILITY
793 unordered_multiset& operator=(const unordered_multiset& __u)
794 {
795 __table_ = __u.__table_;
796 return *this;
797 }
Howard Hinnant73d21a42010-09-04 23:28:19798#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnant04dae1d2011-06-04 20:18:37799 unordered_multiset& operator=(unordered_multiset&& __u)
800 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:16801#endif
Howard Hinnante3e32912011-08-12 21:56:02802#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16803 unordered_multiset& operator=(initializer_list<value_type> __il);
Howard Hinnante3e32912011-08-12 21:56:02804#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16805
Howard Hinnantee6ccd02010-09-23 18:58:28806 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37807 allocator_type get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16808 {return allocator_type(__table_.__node_alloc());}
809
Howard Hinnantee6ccd02010-09-23 18:58:28810 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37811 bool empty() const _NOEXCEPT {return __table_.size() == 0;}
Howard Hinnantee6ccd02010-09-23 18:58:28812 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37813 size_type size() const _NOEXCEPT {return __table_.size();}
Howard Hinnantee6ccd02010-09-23 18:58:28814 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37815 size_type max_size() const _NOEXCEPT {return __table_.max_size();}
Howard Hinnantbc8d3f92010-05-11 19:42:16816
Howard Hinnantee6ccd02010-09-23 18:58:28817 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37818 iterator begin() _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28819 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37820 iterator end() _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28821 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37822 const_iterator begin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28823 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37824 const_iterator end() const _NOEXCEPT {return __table_.end();}
Howard Hinnantee6ccd02010-09-23 18:58:28825 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37826 const_iterator cbegin() const _NOEXCEPT {return __table_.begin();}
Howard Hinnantee6ccd02010-09-23 18:58:28827 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37828 const_iterator cend() const _NOEXCEPT {return __table_.end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16829
Howard Hinnant73d21a42010-09-04 23:28:19830#if !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantbc8d3f92010-05-11 19:42:16831 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28832 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16833 iterator emplace(_Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19834 {return __table_.__emplace_multi(_VSTD::forward<_Args>(__args)...);}
Howard Hinnantbc8d3f92010-05-11 19:42:16835 template <class... _Args>
Howard Hinnantee6ccd02010-09-23 18:58:28836 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16837 iterator emplace_hint(const_iterator __p, _Args&&... __args)
Howard Hinnant0949eed2011-06-30 21:18:19838 {return __table_.__emplace_hint_multi(__p, _VSTD::forward<_Args>(__args)...);}
Howard Hinnant73d21a42010-09-04 23:28:19839#endif // !defined(_LIBCPP_HAS_NO_RVALUE_REFERENCES) && !defined(_LIBCPP_HAS_NO_VARIADICS)
Howard Hinnantee6ccd02010-09-23 18:58:28840 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16841 iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);}
Howard Hinnant73d21a42010-09-04 23:28:19842#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28843 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant0949eed2011-06-30 21:18:19844 iterator insert(value_type&& __x) {return __table_.__insert_multi(_VSTD::move(__x));}
Howard Hinnantbc8d3f92010-05-11 19:42:16845#endif
Howard Hinnantee6ccd02010-09-23 18:58:28846 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16847 iterator insert(const_iterator __p, const value_type& __x)
848 {return __table_.__insert_multi(__p, __x);}
Howard Hinnant73d21a42010-09-04 23:28:19849#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantee6ccd02010-09-23 18:58:28850 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16851 iterator insert(const_iterator __p, value_type&& __x)
Howard Hinnant0949eed2011-06-30 21:18:19852 {return __table_.__insert_multi(__p, _VSTD::move(__x));}
Howard Hinnant73d21a42010-09-04 23:28:19853#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16854 template <class _InputIterator>
855 void insert(_InputIterator __first, _InputIterator __last);
Howard Hinnante3e32912011-08-12 21:56:02856#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantee6ccd02010-09-23 18:58:28857 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16858 void insert(initializer_list<value_type> __il)
859 {insert(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02860#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16861
Howard Hinnantee6ccd02010-09-23 18:58:28862 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16863 iterator erase(const_iterator __p) {return __table_.erase(__p);}
Howard Hinnantee6ccd02010-09-23 18:58:28864 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16865 size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28866 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16867 iterator erase(const_iterator __first, const_iterator __last)
868 {return __table_.erase(__first, __last);}
Howard Hinnantee6ccd02010-09-23 18:58:28869 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37870 void clear() _NOEXCEPT {__table_.clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:16871
Howard Hinnantee6ccd02010-09-23 18:58:28872 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37873 void swap(unordered_multiset& __u)
874 _NOEXCEPT_(__is_nothrow_swappable<__table>::value)
875 {__table_.swap(__u.__table_);}
Howard Hinnantbc8d3f92010-05-11 19:42:16876
Howard Hinnantee6ccd02010-09-23 18:58:28877 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16878 hasher hash_function() const {return __table_.hash_function();}
Howard Hinnantee6ccd02010-09-23 18:58:28879 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16880 key_equal key_eq() const {return __table_.key_eq();}
881
Howard Hinnantee6ccd02010-09-23 18:58:28882 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16883 iterator find(const key_type& __k) {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28884 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16885 const_iterator find(const key_type& __k) const {return __table_.find(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28886 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16887 size_type count(const key_type& __k) const {return __table_.__count_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28888 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16889 pair<iterator, iterator> equal_range(const key_type& __k)
890 {return __table_.__equal_range_multi(__k);}
Howard Hinnantee6ccd02010-09-23 18:58:28891 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16892 pair<const_iterator, const_iterator> equal_range(const key_type& __k) const
893 {return __table_.__equal_range_multi(__k);}
894
Howard Hinnantee6ccd02010-09-23 18:58:28895 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37896 size_type bucket_count() const _NOEXCEPT {return __table_.bucket_count();}
Howard Hinnantee6ccd02010-09-23 18:58:28897 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37898 size_type max_bucket_count() const _NOEXCEPT {return __table_.max_bucket_count();}
Howard Hinnantbc8d3f92010-05-11 19:42:16899
Howard Hinnantee6ccd02010-09-23 18:58:28900 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16901 size_type bucket_size(size_type __n) const {return __table_.bucket_size(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28902 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16903 size_type bucket(const key_type& __k) const {return __table_.bucket(__k);}
904
Howard Hinnantee6ccd02010-09-23 18:58:28905 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16906 local_iterator begin(size_type __n) {return __table_.begin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28907 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16908 local_iterator end(size_type __n) {return __table_.end(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28909 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16910 const_local_iterator begin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28911 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16912 const_local_iterator end(size_type __n) const {return __table_.cend(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28913 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16914 const_local_iterator cbegin(size_type __n) const {return __table_.cbegin(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28915 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16916 const_local_iterator cend(size_type __n) const {return __table_.cend(__n);}
917
Howard Hinnantee6ccd02010-09-23 18:58:28918 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37919 float load_factor() const _NOEXCEPT {return __table_.load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:28920 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant04dae1d2011-06-04 20:18:37921 float max_load_factor() const _NOEXCEPT {return __table_.max_load_factor();}
Howard Hinnantee6ccd02010-09-23 18:58:28922 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16923 void max_load_factor(float __mlf) {__table_.max_load_factor(__mlf);}
Howard Hinnantee6ccd02010-09-23 18:58:28924 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16925 void rehash(size_type __n) {__table_.rehash(__n);}
Howard Hinnantee6ccd02010-09-23 18:58:28926 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16927 void reserve(size_type __n) {__table_.reserve(__n);}
928};
929
930template <class _Value, class _Hash, class _Pred, class _Alloc>
931unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
932 size_type __n, const hasher& __hf, const key_equal& __eql)
933 : __table_(__hf, __eql)
934{
935 __table_.rehash(__n);
936}
937
938template <class _Value, class _Hash, class _Pred, class _Alloc>
939unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
940 size_type __n, const hasher& __hf, const key_equal& __eql,
941 const allocator_type& __a)
942 : __table_(__hf, __eql, __a)
943{
944 __table_.rehash(__n);
945}
946
947template <class _Value, class _Hash, class _Pred, class _Alloc>
948template <class _InputIterator>
949unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
950 _InputIterator __first, _InputIterator __last)
951{
952 insert(__first, __last);
953}
954
955template <class _Value, class _Hash, class _Pred, class _Alloc>
956template <class _InputIterator>
957unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
958 _InputIterator __first, _InputIterator __last, size_type __n,
959 const hasher& __hf, const key_equal& __eql)
960 : __table_(__hf, __eql)
961{
962 __table_.rehash(__n);
963 insert(__first, __last);
964}
965
966template <class _Value, class _Hash, class _Pred, class _Alloc>
967template <class _InputIterator>
968unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
969 _InputIterator __first, _InputIterator __last, size_type __n,
970 const hasher& __hf, const key_equal& __eql, const allocator_type& __a)
971 : __table_(__hf, __eql, __a)
972{
973 __table_.rehash(__n);
974 insert(__first, __last);
975}
976
977template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:28978inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16979unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
980 const allocator_type& __a)
981 : __table_(__a)
982{
983}
984
985template <class _Value, class _Hash, class _Pred, class _Alloc>
986unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
987 const unordered_multiset& __u)
988 : __table_(__u.__table_)
989{
990 __table_.rehash(__u.bucket_count());
991 insert(__u.begin(), __u.end());
992}
993
994template <class _Value, class _Hash, class _Pred, class _Alloc>
995unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
996 const unordered_multiset& __u, const allocator_type& __a)
997 : __table_(__u.__table_, __a)
998{
999 __table_.rehash(__u.bucket_count());
1000 insert(__u.begin(), __u.end());
1001}
1002
Howard Hinnant73d21a42010-09-04 23:28:191003#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161004
1005template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281006inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161007unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1008 unordered_multiset&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:371009 _NOEXCEPT_(is_nothrow_move_constructible<__table>::value)
Howard Hinnant0949eed2011-06-30 21:18:191010 : __table_(_VSTD::move(__u.__table_))
Howard Hinnantbc8d3f92010-05-11 19:42:161011{
1012}
1013
1014template <class _Value, class _Hash, class _Pred, class _Alloc>
1015unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1016 unordered_multiset&& __u, const allocator_type& __a)
Howard Hinnant0949eed2011-06-30 21:18:191017 : __table_(_VSTD::move(__u.__table_), __a)
Howard Hinnantbc8d3f92010-05-11 19:42:161018{
1019 if (__a != __u.get_allocator())
1020 {
1021 iterator __i = __u.begin();
1022 while (__u.size() != 0)
Howard Hinnant0949eed2011-06-30 21:18:191023 __table_.__insert_multi(_VSTD::move(__u.__table_.remove(__i++)->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:161024 }
1025}
1026
Howard Hinnant73d21a42010-09-04 23:28:191027#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161028
Howard Hinnante3e32912011-08-12 21:56:021029#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1030
Howard Hinnantbc8d3f92010-05-11 19:42:161031template <class _Value, class _Hash, class _Pred, class _Alloc>
1032unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1033 initializer_list<value_type> __il)
1034{
1035 insert(__il.begin(), __il.end());
1036}
1037
1038template <class _Value, class _Hash, class _Pred, class _Alloc>
1039unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1040 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1041 const key_equal& __eql)
1042 : __table_(__hf, __eql)
1043{
1044 __table_.rehash(__n);
1045 insert(__il.begin(), __il.end());
1046}
1047
1048template <class _Value, class _Hash, class _Pred, class _Alloc>
1049unordered_multiset<_Value, _Hash, _Pred, _Alloc>::unordered_multiset(
1050 initializer_list<value_type> __il, size_type __n, const hasher& __hf,
1051 const key_equal& __eql, const allocator_type& __a)
1052 : __table_(__hf, __eql, __a)
1053{
1054 __table_.rehash(__n);
1055 insert(__il.begin(), __il.end());
1056}
1057
Howard Hinnante3e32912011-08-12 21:56:021058#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1059
Howard Hinnant73d21a42010-09-04 23:28:191060#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161061
1062template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281063inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161064unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1065unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
1066 unordered_multiset&& __u)
Howard Hinnant04dae1d2011-06-04 20:18:371067 _NOEXCEPT_(is_nothrow_move_assignable<__table>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:161068{
Howard Hinnant0949eed2011-06-30 21:18:191069 __table_ = _VSTD::move(__u.__table_);
Howard Hinnantbc8d3f92010-05-11 19:42:161070 return *this;
1071}
1072
Howard Hinnant73d21a42010-09-04 23:28:191073#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:161074
Howard Hinnante3e32912011-08-12 21:56:021075#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1076
Howard Hinnantbc8d3f92010-05-11 19:42:161077template <class _Value, class _Hash, class _Pred, class _Alloc>
1078inline
1079unordered_multiset<_Value, _Hash, _Pred, _Alloc>&
1080unordered_multiset<_Value, _Hash, _Pred, _Alloc>::operator=(
1081 initializer_list<value_type> __il)
1082{
1083 __table_.__assign_multi(__il.begin(), __il.end());
1084 return *this;
1085}
1086
Howard Hinnante3e32912011-08-12 21:56:021087#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
1088
Howard Hinnantbc8d3f92010-05-11 19:42:161089template <class _Value, class _Hash, class _Pred, class _Alloc>
1090template <class _InputIterator>
Howard Hinnantee6ccd02010-09-23 18:58:281091inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161092void
1093unordered_multiset<_Value, _Hash, _Pred, _Alloc>::insert(_InputIterator __first,
1094 _InputIterator __last)
1095{
1096 for (; __first != __last; ++__first)
1097 __table_.__insert_multi(*__first);
1098}
1099
1100template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281101inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161102void
1103swap(unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1104 unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
Howard Hinnant04dae1d2011-06-04 20:18:371105 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:161106{
1107 __x.swap(__y);
1108}
1109
1110template <class _Value, class _Hash, class _Pred, class _Alloc>
1111bool
1112operator==(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1113 const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
1114{
1115 if (__x.size() != __y.size())
1116 return false;
1117 typedef typename unordered_multiset<_Value, _Hash, _Pred, _Alloc>::const_iterator
1118 const_iterator;
1119 typedef pair<const_iterator, const_iterator> _EqRng;
1120 for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;)
1121 {
1122 _EqRng __xeq = __x.equal_range(*__i);
1123 _EqRng __yeq = __y.equal_range(*__i);
Howard Hinnant0949eed2011-06-30 21:18:191124 if (_VSTD::distance(__xeq.first, __xeq.second) !=
1125 _VSTD::distance(__yeq.first, __yeq.second) ||
1126 !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first))
Howard Hinnantbc8d3f92010-05-11 19:42:161127 return false;
1128 __i = __xeq.second;
1129 }
1130 return true;
1131}
1132
1133template <class _Value, class _Hash, class _Pred, class _Alloc>
Howard Hinnantee6ccd02010-09-23 18:58:281134inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161135bool
1136operator!=(const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __x,
1137 const unordered_multiset<_Value, _Hash, _Pred, _Alloc>& __y)
1138{
1139 return !(__x == __y);
1140}
1141
1142_LIBCPP_END_NAMESPACE_STD
1143
1144#endif // _LIBCPP_UNORDERED_SET