root / lab4 / .minix-src / include / c++ / ext / hash_map
History | View | Annotate | Download (38.2 KB)
1 | 13 | up20180614 | // -*- C++ -*- |
---|---|---|---|
2 | //===-------------------------- hash_map ----------------------------------===// |
||
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_MAP |
||
12 | #define _LIBCPP_HASH_MAP |
||
13 | |||
14 | /* |
||
15 | |||
16 | hash_map synopsis |
||
17 | |||
18 | namespace __gnu_cxx |
||
19 | { |
||
20 | |||
21 | template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, |
||
22 | class Alloc = allocator<pair<const Key, T>>> |
||
23 | class hash_map |
||
24 | { |
||
25 | public: |
||
26 | // types |
||
27 | typedef Key key_type; |
||
28 | typedef T mapped_type; |
||
29 | typedef Hash hasher; |
||
30 | typedef Pred key_equal; |
||
31 | typedef Alloc allocator_type; |
||
32 | typedef pair<const key_type, mapped_type> value_type; |
||
33 | typedef value_type& reference; |
||
34 | typedef const value_type& const_reference; |
||
35 | typedef typename allocator_traits<allocator_type>::pointer pointer; |
||
36 | typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; |
||
37 | typedef typename allocator_traits<allocator_type>::size_type size_type; |
||
38 | typedef typename allocator_traits<allocator_type>::difference_type difference_type; |
||
39 | |||
40 | typedef /unspecified/ iterator; |
||
41 | typedef /unspecified/ const_iterator; |
||
42 | |||
43 | explicit hash_map(size_type n = 193, const hasher& hf = hasher(), |
||
44 | const key_equal& eql = key_equal(), |
||
45 | const allocator_type& a = allocator_type()); |
||
46 | template <class InputIterator> |
||
47 | hash_map(InputIterator f, InputIterator l, |
||
48 | size_type n = 193, const hasher& hf = hasher(), |
||
49 | const key_equal& eql = key_equal(), |
||
50 | const allocator_type& a = allocator_type()); |
||
51 | hash_map(const hash_map&); |
||
52 | ~hash_map(); |
||
53 | hash_map& operator=(const hash_map&); |
||
54 | |||
55 | allocator_type get_allocator() const; |
||
56 | |||
57 | bool empty() const; |
||
58 | size_type size() const; |
||
59 | size_type max_size() const; |
||
60 | |||
61 | iterator begin(); |
||
62 | iterator end(); |
||
63 | const_iterator begin() const; |
||
64 | const_iterator end() const; |
||
65 | |||
66 | pair<iterator, bool> insert(const value_type& obj); |
||
67 | template <class InputIterator> |
||
68 | void insert(InputIterator first, InputIterator last); |
||
69 | |||
70 | void erase(const_iterator position); |
||
71 | size_type erase(const key_type& k); |
||
72 | void erase(const_iterator first, const_iterator last); |
||
73 | void clear(); |
||
74 | |||
75 | void swap(hash_map&); |
||
76 | |||
77 | hasher hash_funct() const; |
||
78 | key_equal key_eq() const; |
||
79 | |||
80 | iterator find(const key_type& k); |
||
81 | const_iterator find(const key_type& k) const; |
||
82 | size_type count(const key_type& k) const; |
||
83 | pair<iterator, iterator> equal_range(const key_type& k); |
||
84 | pair<const_iterator, const_iterator> equal_range(const key_type& k) const; |
||
85 | |||
86 | mapped_type& operator[](const key_type& k); |
||
87 | |||
88 | size_type bucket_count() const; |
||
89 | size_type max_bucket_count() const; |
||
90 | |||
91 | size_type elems_in_bucket(size_type n) const; |
||
92 | |||
93 | void resize(size_type n); |
||
94 | }; |
||
95 | |||
96 | template <class Key, class T, class Hash, class Pred, class Alloc> |
||
97 | void swap(hash_map<Key, T, Hash, Pred, Alloc>& x, |
||
98 | hash_map<Key, T, Hash, Pred, Alloc>& y); |
||
99 | |||
100 | template <class Key, class T, class Hash, class Pred, class Alloc> |
||
101 | bool |
||
102 | operator==(const hash_map<Key, T, Hash, Pred, Alloc>& x, |
||
103 | const hash_map<Key, T, Hash, Pred, Alloc>& y); |
||
104 | |||
105 | template <class Key, class T, class Hash, class Pred, class Alloc> |
||
106 | bool |
||
107 | operator!=(const hash_map<Key, T, Hash, Pred, Alloc>& x, |
||
108 | const hash_map<Key, T, Hash, Pred, Alloc>& y); |
||
109 | |||
110 | template <class Key, class T, class Hash = hash<Key>, class Pred = equal_to<Key>, |
||
111 | class Alloc = allocator<pair<const Key, T>>> |
||
112 | class hash_multimap |
||
113 | { |
||
114 | public: |
||
115 | // types |
||
116 | typedef Key key_type; |
||
117 | typedef T mapped_type; |
||
118 | typedef Hash hasher; |
||
119 | typedef Pred key_equal; |
||
120 | typedef Alloc allocator_type; |
||
121 | typedef pair<const key_type, mapped_type> value_type; |
||
122 | typedef value_type& reference; |
||
123 | typedef const value_type& const_reference; |
||
124 | typedef typename allocator_traits<allocator_type>::pointer pointer; |
||
125 | typedef typename allocator_traits<allocator_type>::const_pointer const_pointer; |
||
126 | typedef typename allocator_traits<allocator_type>::size_type size_type; |
||
127 | typedef typename allocator_traits<allocator_type>::difference_type difference_type; |
||
128 | |||
129 | typedef /unspecified/ iterator; |
||
130 | typedef /unspecified/ const_iterator; |
||
131 | |||
132 | explicit hash_multimap(size_type n = 193, const hasher& hf = hasher(), |
||
133 | const key_equal& eql = key_equal(), |
||
134 | const allocator_type& a = allocator_type()); |
||
135 | template <class InputIterator> |
||
136 | hash_multimap(InputIterator f, InputIterator l, |
||
137 | size_type n = 193, const hasher& hf = hasher(), |
||
138 | const key_equal& eql = key_equal(), |
||
139 | const allocator_type& a = allocator_type()); |
||
140 | explicit hash_multimap(const allocator_type&); |
||
141 | hash_multimap(const hash_multimap&); |
||
142 | ~hash_multimap(); |
||
143 | hash_multimap& operator=(const hash_multimap&); |
||
144 | |||
145 | allocator_type get_allocator() const; |
||
146 | |||
147 | bool empty() const; |
||
148 | size_type size() const; |
||
149 | size_type max_size() const; |
||
150 | |||
151 | iterator begin(); |
||
152 | iterator end(); |
||
153 | const_iterator begin() const; |
||
154 | const_iterator end() const; |
||
155 | |||
156 | iterator insert(const value_type& obj); |
||
157 | template <class InputIterator> |
||
158 | void insert(InputIterator first, InputIterator last); |
||
159 | |||
160 | void erase(const_iterator position); |
||
161 | size_type erase(const key_type& k); |
||
162 | void erase(const_iterator first, const_iterator last); |
||
163 | void clear(); |
||
164 | |||
165 | void swap(hash_multimap&); |
||
166 | |||
167 | hasher hash_funct() const; |
||
168 | key_equal key_eq() const; |
||
169 | |||
170 | iterator find(const key_type& k); |
||
171 | const_iterator find(const key_type& k) const; |
||
172 | size_type count(const key_type& k) const; |
||
173 | pair<iterator, iterator> equal_range(const key_type& k); |
||
174 | pair<const_iterator, const_iterator> equal_range(const key_type& k) const; |
||
175 | |||
176 | size_type bucket_count() const; |
||
177 | size_type max_bucket_count() const; |
||
178 | |||
179 | size_type elems_in_bucket(size_type n) const; |
||
180 | |||
181 | void resize(size_type n); |
||
182 | }; |
||
183 | |||
184 | template <class Key, class T, class Hash, class Pred, class Alloc> |
||
185 | void swap(hash_multimap<Key, T, Hash, Pred, Alloc>& x, |
||
186 | hash_multimap<Key, T, Hash, Pred, Alloc>& y); |
||
187 | |||
188 | template <class Key, class T, class Hash, class Pred, class Alloc> |
||
189 | bool |
||
190 | operator==(const hash_multimap<Key, T, Hash, Pred, Alloc>& x, |
||
191 | const hash_multimap<Key, T, Hash, Pred, Alloc>& y); |
||
192 | |||
193 | template <class Key, class T, class Hash, class Pred, class Alloc> |
||
194 | bool |
||
195 | operator!=(const hash_multimap<Key, T, Hash, Pred, Alloc>& x, |
||
196 | const hash_multimap<Key, T, Hash, Pred, Alloc>& y); |
||
197 | |||
198 | } // __gnu_cxx |
||
199 | |||
200 | */ |
||
201 | |||
202 | #include <__config> |
||
203 | #include <__hash_table> |
||
204 | #include <functional> |
||
205 | #include <stdexcept> |
||
206 | #include <type_traits> |
||
207 | #include <ext/__hash> |
||
208 | |||
209 | #if __DEPRECATED |
||
210 | #if defined(_MSC_VER) && ! defined(__clang__) |
||
211 | _LIBCPP_WARNING("Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map>") |
||
212 | #else |
||
213 | # warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map> |
||
214 | #endif |
||
215 | #endif |
||
216 | |||
217 | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
||
218 | #pragma GCC system_header |
||
219 | #endif |
||
220 | |||
221 | namespace __gnu_cxx { |
||
222 | |||
223 | using namespace std; |
||
224 | |||
225 | template <class _Tp, class _Hash, |
||
226 | bool = is_empty<_Hash>::value && !__libcpp_is_final<_Hash>::value |
||
227 | > |
||
228 | class __hash_map_hasher |
||
229 | : private _Hash |
||
230 | { |
||
231 | public: |
||
232 | _LIBCPP_INLINE_VISIBILITY __hash_map_hasher() : _Hash() {} |
||
233 | _LIBCPP_INLINE_VISIBILITY __hash_map_hasher(const _Hash& __h) : _Hash(__h) {} |
||
234 | _LIBCPP_INLINE_VISIBILITY const _Hash& hash_function() const {return *this;} |
||
235 | _LIBCPP_INLINE_VISIBILITY |
||
236 | size_t operator()(const _Tp& __x) const |
||
237 | {return static_cast<const _Hash&>(*this)(__x.first);} |
||
238 | _LIBCPP_INLINE_VISIBILITY |
||
239 | size_t operator()(const typename _Tp::first_type& __x) const |
||
240 | {return static_cast<const _Hash&>(*this)(__x);} |
||
241 | }; |
||
242 | |||
243 | template <class _Tp, class _Hash> |
||
244 | class __hash_map_hasher<_Tp, _Hash, false> |
||
245 | { |
||
246 | _Hash __hash_; |
||
247 | public: |
||
248 | _LIBCPP_INLINE_VISIBILITY __hash_map_hasher() : __hash_() {} |
||
249 | _LIBCPP_INLINE_VISIBILITY __hash_map_hasher(const _Hash& __h) : __hash_(__h) {} |
||
250 | _LIBCPP_INLINE_VISIBILITY const _Hash& hash_function() const {return __hash_;} |
||
251 | _LIBCPP_INLINE_VISIBILITY |
||
252 | size_t operator()(const _Tp& __x) const |
||
253 | {return __hash_(__x.first);} |
||
254 | _LIBCPP_INLINE_VISIBILITY |
||
255 | size_t operator()(const typename _Tp::first_type& __x) const |
||
256 | {return __hash_(__x);} |
||
257 | }; |
||
258 | |||
259 | template <class _Tp, class _Pred, |
||
260 | bool = is_empty<_Pred>::value && !__libcpp_is_final<_Pred>::value |
||
261 | > |
||
262 | class __hash_map_equal |
||
263 | : private _Pred |
||
264 | { |
||
265 | public: |
||
266 | _LIBCPP_INLINE_VISIBILITY __hash_map_equal() : _Pred() {} |
||
267 | _LIBCPP_INLINE_VISIBILITY __hash_map_equal(const _Pred& __p) : _Pred(__p) {} |
||
268 | _LIBCPP_INLINE_VISIBILITY const _Pred& key_eq() const {return *this;} |
||
269 | _LIBCPP_INLINE_VISIBILITY |
||
270 | bool operator()(const _Tp& __x, const _Tp& __y) const |
||
271 | {return static_cast<const _Pred&>(*this)(__x.first, __y.first);} |
||
272 | _LIBCPP_INLINE_VISIBILITY |
||
273 | bool operator()(const typename _Tp::first_type& __x, const _Tp& __y) const |
||
274 | {return static_cast<const _Pred&>(*this)(__x, __y.first);} |
||
275 | _LIBCPP_INLINE_VISIBILITY |
||
276 | bool operator()(const _Tp& __x, const typename _Tp::first_type& __y) const |
||
277 | {return static_cast<const _Pred&>(*this)(__x.first, __y);} |
||
278 | _LIBCPP_INLINE_VISIBILITY |
||
279 | bool operator()(const typename _Tp::first_type& __x, |
||
280 | const typename _Tp::first_type& __y) const |
||
281 | {return static_cast<const _Pred&>(*this)(__x, __y);} |
||
282 | }; |
||
283 | |||
284 | template <class _Tp, class _Pred> |
||
285 | class __hash_map_equal<_Tp, _Pred, false> |
||
286 | { |
||
287 | _Pred __pred_; |
||
288 | public: |
||
289 | _LIBCPP_INLINE_VISIBILITY __hash_map_equal() : __pred_() {} |
||
290 | _LIBCPP_INLINE_VISIBILITY __hash_map_equal(const _Pred& __p) : __pred_(__p) {} |
||
291 | _LIBCPP_INLINE_VISIBILITY const _Pred& key_eq() const {return __pred_;} |
||
292 | _LIBCPP_INLINE_VISIBILITY |
||
293 | bool operator()(const _Tp& __x, const _Tp& __y) const |
||
294 | {return __pred_(__x.first, __y.first);} |
||
295 | _LIBCPP_INLINE_VISIBILITY |
||
296 | bool operator()(const typename _Tp::first_type& __x, const _Tp& __y) const |
||
297 | {return __pred_(__x, __y.first);} |
||
298 | _LIBCPP_INLINE_VISIBILITY |
||
299 | bool operator()(const _Tp& __x, const typename _Tp::first_type& __y) const |
||
300 | {return __pred_(__x.first, __y);} |
||
301 | _LIBCPP_INLINE_VISIBILITY |
||
302 | bool operator()(const typename _Tp::first_type& __x, |
||
303 | const typename _Tp::first_type& __y) const |
||
304 | {return __pred_(__x, __y);} |
||
305 | }; |
||
306 | |||
307 | template <class _Alloc> |
||
308 | class __hash_map_node_destructor |
||
309 | { |
||
310 | typedef _Alloc allocator_type; |
||
311 | typedef allocator_traits<allocator_type> __alloc_traits; |
||
312 | typedef typename __alloc_traits::value_type::value_type value_type; |
||
313 | public: |
||
314 | typedef typename __alloc_traits::pointer pointer; |
||
315 | private: |
||
316 | typedef typename value_type::first_type first_type; |
||
317 | typedef typename value_type::second_type second_type; |
||
318 | |||
319 | allocator_type& __na_; |
||
320 | |||
321 | __hash_map_node_destructor& operator=(const __hash_map_node_destructor&); |
||
322 | |||
323 | public: |
||
324 | bool __first_constructed; |
||
325 | bool __second_constructed; |
||
326 | |||
327 | _LIBCPP_INLINE_VISIBILITY |
||
328 | explicit __hash_map_node_destructor(allocator_type& __na) |
||
329 | : __na_(__na), |
||
330 | __first_constructed(false), |
||
331 | __second_constructed(false) |
||
332 | {} |
||
333 | |||
334 | #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES |
||
335 | _LIBCPP_INLINE_VISIBILITY |
||
336 | __hash_map_node_destructor(__hash_node_destructor<allocator_type>&& __x) |
||
337 | : __na_(__x.__na_), |
||
338 | __first_constructed(__x.__value_constructed), |
||
339 | __second_constructed(__x.__value_constructed) |
||
340 | { |
||
341 | __x.__value_constructed = false; |
||
342 | } |
||
343 | #else // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
||
344 | _LIBCPP_INLINE_VISIBILITY |
||
345 | __hash_map_node_destructor(const __hash_node_destructor<allocator_type>& __x) |
||
346 | : __na_(__x.__na_), |
||
347 | __first_constructed(__x.__value_constructed), |
||
348 | __second_constructed(__x.__value_constructed) |
||
349 | { |
||
350 | const_cast<bool&>(__x.__value_constructed) = false; |
||
351 | } |
||
352 | #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES |
||
353 | |||
354 | _LIBCPP_INLINE_VISIBILITY |
||
355 | void operator()(pointer __p) |
||
356 | { |
||
357 | if (__second_constructed) |
||
358 | __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.second)); |
||
359 | if (__first_constructed) |
||
360 | __alloc_traits::destroy(__na_, _VSTD::addressof(__p->__value_.first)); |
||
361 | if (__p) |
||
362 | __alloc_traits::deallocate(__na_, __p, 1); |
||
363 | } |
||
364 | }; |
||
365 | |||
366 | template <class _HashIterator> |
||
367 | class _LIBCPP_TYPE_VIS_ONLY __hash_map_iterator |
||
368 | { |
||
369 | _HashIterator __i_; |
||
370 | |||
371 | typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits; |
||
372 | typedef const typename _HashIterator::value_type::first_type key_type; |
||
373 | typedef typename _HashIterator::value_type::second_type mapped_type; |
||
374 | public: |
||
375 | typedef forward_iterator_tag iterator_category; |
||
376 | typedef pair<key_type, mapped_type> value_type; |
||
377 | typedef typename _HashIterator::difference_type difference_type; |
||
378 | typedef value_type& reference; |
||
379 | typedef typename __pointer_traits::template |
||
380 | #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |
||
381 | rebind<value_type> |
||
382 | #else |
||
383 | rebind<value_type>::other |
||
384 | #endif |
||
385 | pointer; |
||
386 | |||
387 | _LIBCPP_INLINE_VISIBILITY __hash_map_iterator() {} |
||
388 | |||
389 | _LIBCPP_INLINE_VISIBILITY __hash_map_iterator(_HashIterator __i) : __i_(__i) {} |
||
390 | |||
391 | _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *operator->();} |
||
392 | _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return (pointer)__i_.operator->();} |
||
393 | |||
394 | _LIBCPP_INLINE_VISIBILITY __hash_map_iterator& operator++() {++__i_; return *this;} |
||
395 | _LIBCPP_INLINE_VISIBILITY |
||
396 | __hash_map_iterator operator++(int) |
||
397 | { |
||
398 | __hash_map_iterator __t(*this); |
||
399 | ++(*this); |
||
400 | return __t; |
||
401 | } |
||
402 | |||
403 | friend _LIBCPP_INLINE_VISIBILITY |
||
404 | bool operator==(const __hash_map_iterator& __x, const __hash_map_iterator& __y) |
||
405 | {return __x.__i_ == __y.__i_;} |
||
406 | friend _LIBCPP_INLINE_VISIBILITY |
||
407 | bool operator!=(const __hash_map_iterator& __x, const __hash_map_iterator& __y) |
||
408 | {return __x.__i_ != __y.__i_;} |
||
409 | |||
410 | template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY hash_map; |
||
411 | template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY hash_multimap; |
||
412 | template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator; |
||
413 | template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator; |
||
414 | template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator; |
||
415 | }; |
||
416 | |||
417 | template <class _HashIterator> |
||
418 | class _LIBCPP_TYPE_VIS_ONLY __hash_map_const_iterator |
||
419 | { |
||
420 | _HashIterator __i_; |
||
421 | |||
422 | typedef pointer_traits<typename _HashIterator::pointer> __pointer_traits; |
||
423 | typedef const typename _HashIterator::value_type::first_type key_type; |
||
424 | typedef typename _HashIterator::value_type::second_type mapped_type; |
||
425 | public: |
||
426 | typedef forward_iterator_tag iterator_category; |
||
427 | typedef pair<key_type, mapped_type> value_type; |
||
428 | typedef typename _HashIterator::difference_type difference_type; |
||
429 | typedef const value_type& reference; |
||
430 | typedef typename __pointer_traits::template |
||
431 | #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES |
||
432 | rebind<const value_type> |
||
433 | #else |
||
434 | rebind<const value_type>::other |
||
435 | #endif |
||
436 | pointer; |
||
437 | |||
438 | _LIBCPP_INLINE_VISIBILITY __hash_map_const_iterator() {} |
||
439 | |||
440 | _LIBCPP_INLINE_VISIBILITY |
||
441 | __hash_map_const_iterator(_HashIterator __i) : __i_(__i) {} |
||
442 | _LIBCPP_INLINE_VISIBILITY |
||
443 | __hash_map_const_iterator( |
||
444 | __hash_map_iterator<typename _HashIterator::__non_const_iterator> __i) |
||
445 | : __i_(__i.__i_) {} |
||
446 | |||
447 | _LIBCPP_INLINE_VISIBILITY |
||
448 | reference operator*() const {return *operator->();} |
||
449 | _LIBCPP_INLINE_VISIBILITY |
||
450 | pointer operator->() const {return (pointer)__i_.operator->();} |
||
451 | |||
452 | _LIBCPP_INLINE_VISIBILITY |
||
453 | __hash_map_const_iterator& operator++() {++__i_; return *this;} |
||
454 | _LIBCPP_INLINE_VISIBILITY |
||
455 | __hash_map_const_iterator operator++(int) |
||
456 | { |
||
457 | __hash_map_const_iterator __t(*this); |
||
458 | ++(*this); |
||
459 | return __t; |
||
460 | } |
||
461 | |||
462 | friend _LIBCPP_INLINE_VISIBILITY |
||
463 | bool operator==(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) |
||
464 | {return __x.__i_ == __y.__i_;} |
||
465 | friend _LIBCPP_INLINE_VISIBILITY |
||
466 | bool operator!=(const __hash_map_const_iterator& __x, const __hash_map_const_iterator& __y) |
||
467 | {return __x.__i_ != __y.__i_;} |
||
468 | |||
469 | template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY hash_map; |
||
470 | template <class, class, class, class, class> friend class _LIBCPP_TYPE_VIS_ONLY hash_multimap; |
||
471 | template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_iterator; |
||
472 | template <class> friend class _LIBCPP_TYPE_VIS_ONLY __hash_const_local_iterator; |
||
473 | }; |
||
474 | |||
475 | template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, |
||
476 | class _Alloc = allocator<pair<const _Key, _Tp> > > |
||
477 | class _LIBCPP_TYPE_VIS_ONLY hash_map |
||
478 | { |
||
479 | public: |
||
480 | // types |
||
481 | typedef _Key key_type; |
||
482 | typedef _Tp mapped_type; |
||
483 | typedef _Tp data_type; |
||
484 | typedef _Hash hasher; |
||
485 | typedef _Pred key_equal; |
||
486 | typedef _Alloc allocator_type; |
||
487 | typedef pair<const key_type, mapped_type> value_type; |
||
488 | typedef value_type& reference; |
||
489 | typedef const value_type& const_reference; |
||
490 | |||
491 | private: |
||
492 | typedef pair<key_type, mapped_type> __value_type; |
||
493 | typedef __hash_map_hasher<__value_type, hasher> __hasher; |
||
494 | typedef __hash_map_equal<__value_type, key_equal> __key_equal; |
||
495 | typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, __value_type>::type __allocator_type; |
||
496 | |||
497 | typedef __hash_table<__value_type, __hasher, |
||
498 | __key_equal, __allocator_type> __table; |
||
499 | |||
500 | __table __table_; |
||
501 | |||
502 | typedef typename __table::__node_pointer __node_pointer; |
||
503 | typedef typename __table::__node_const_pointer __node_const_pointer; |
||
504 | typedef typename __table::__node_traits __node_traits; |
||
505 | typedef typename __table::__node_allocator __node_allocator; |
||
506 | typedef typename __table::__node __node; |
||
507 | typedef __hash_map_node_destructor<__node_allocator> _Dp; |
||
508 | typedef unique_ptr<__node, _Dp> __node_holder; |
||
509 | typedef allocator_traits<allocator_type> __alloc_traits; |
||
510 | public: |
||
511 | typedef typename __alloc_traits::pointer pointer; |
||
512 | typedef typename __alloc_traits::const_pointer const_pointer; |
||
513 | typedef typename __alloc_traits::size_type size_type; |
||
514 | typedef typename __alloc_traits::difference_type difference_type; |
||
515 | |||
516 | typedef __hash_map_iterator<typename __table::iterator> iterator; |
||
517 | typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; |
||
518 | |||
519 | _LIBCPP_INLINE_VISIBILITY hash_map() {__table_.rehash(193);} |
||
520 | explicit hash_map(size_type __n, const hasher& __hf = hasher(), |
||
521 | const key_equal& __eql = key_equal()); |
||
522 | hash_map(size_type __n, const hasher& __hf, |
||
523 | const key_equal& __eql, |
||
524 | const allocator_type& __a); |
||
525 | template <class _InputIterator> |
||
526 | hash_map(_InputIterator __first, _InputIterator __last); |
||
527 | template <class _InputIterator> |
||
528 | hash_map(_InputIterator __first, _InputIterator __last, |
||
529 | size_type __n, const hasher& __hf = hasher(), |
||
530 | const key_equal& __eql = key_equal()); |
||
531 | template <class _InputIterator> |
||
532 | hash_map(_InputIterator __first, _InputIterator __last, |
||
533 | size_type __n, const hasher& __hf, |
||
534 | const key_equal& __eql, |
||
535 | const allocator_type& __a); |
||
536 | hash_map(const hash_map& __u); |
||
537 | |||
538 | _LIBCPP_INLINE_VISIBILITY |
||
539 | allocator_type get_allocator() const |
||
540 | {return allocator_type(__table_.__node_alloc());} |
||
541 | |||
542 | _LIBCPP_INLINE_VISIBILITY |
||
543 | bool empty() const {return __table_.size() == 0;} |
||
544 | _LIBCPP_INLINE_VISIBILITY |
||
545 | size_type size() const {return __table_.size();} |
||
546 | _LIBCPP_INLINE_VISIBILITY |
||
547 | size_type max_size() const {return __table_.max_size();} |
||
548 | |||
549 | _LIBCPP_INLINE_VISIBILITY |
||
550 | iterator begin() {return __table_.begin();} |
||
551 | _LIBCPP_INLINE_VISIBILITY |
||
552 | iterator end() {return __table_.end();} |
||
553 | _LIBCPP_INLINE_VISIBILITY |
||
554 | const_iterator begin() const {return __table_.begin();} |
||
555 | _LIBCPP_INLINE_VISIBILITY |
||
556 | const_iterator end() const {return __table_.end();} |
||
557 | |||
558 | _LIBCPP_INLINE_VISIBILITY |
||
559 | pair<iterator, bool> insert(const value_type& __x) |
||
560 | {return __table_.__insert_unique(__x);} |
||
561 | _LIBCPP_INLINE_VISIBILITY |
||
562 | iterator insert(const_iterator, const value_type& __x) {return insert(__x).first;} |
||
563 | template <class _InputIterator> |
||
564 | void insert(_InputIterator __first, _InputIterator __last); |
||
565 | |||
566 | _LIBCPP_INLINE_VISIBILITY |
||
567 | void erase(const_iterator __p) {__table_.erase(__p.__i_);} |
||
568 | _LIBCPP_INLINE_VISIBILITY |
||
569 | size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} |
||
570 | _LIBCPP_INLINE_VISIBILITY |
||
571 | void erase(const_iterator __first, const_iterator __last) |
||
572 | {__table_.erase(__first.__i_, __last.__i_);} |
||
573 | _LIBCPP_INLINE_VISIBILITY |
||
574 | void clear() {__table_.clear();} |
||
575 | |||
576 | _LIBCPP_INLINE_VISIBILITY |
||
577 | void swap(hash_map& __u) {__table_.swap(__u.__table_);} |
||
578 | |||
579 | _LIBCPP_INLINE_VISIBILITY |
||
580 | hasher hash_funct() const |
||
581 | {return __table_.hash_function().hash_function();} |
||
582 | _LIBCPP_INLINE_VISIBILITY |
||
583 | key_equal key_eq() const |
||
584 | {return __table_.key_eq().key_eq();} |
||
585 | |||
586 | _LIBCPP_INLINE_VISIBILITY |
||
587 | iterator find(const key_type& __k) {return __table_.find(__k);} |
||
588 | _LIBCPP_INLINE_VISIBILITY |
||
589 | const_iterator find(const key_type& __k) const {return __table_.find(__k);} |
||
590 | _LIBCPP_INLINE_VISIBILITY |
||
591 | size_type count(const key_type& __k) const {return __table_.__count_unique(__k);} |
||
592 | _LIBCPP_INLINE_VISIBILITY |
||
593 | pair<iterator, iterator> equal_range(const key_type& __k) |
||
594 | {return __table_.__equal_range_unique(__k);} |
||
595 | _LIBCPP_INLINE_VISIBILITY |
||
596 | pair<const_iterator, const_iterator> equal_range(const key_type& __k) const |
||
597 | {return __table_.__equal_range_unique(__k);} |
||
598 | |||
599 | mapped_type& operator[](const key_type& __k); |
||
600 | |||
601 | _LIBCPP_INLINE_VISIBILITY |
||
602 | size_type bucket_count() const {return __table_.bucket_count();} |
||
603 | _LIBCPP_INLINE_VISIBILITY |
||
604 | size_type max_bucket_count() const {return __table_.max_bucket_count();} |
||
605 | |||
606 | _LIBCPP_INLINE_VISIBILITY |
||
607 | size_type elems_in_bucket(size_type __n) const |
||
608 | {return __table_.bucket_size(__n);} |
||
609 | |||
610 | _LIBCPP_INLINE_VISIBILITY |
||
611 | void resize(size_type __n) {__table_.rehash(__n);} |
||
612 | |||
613 | private: |
||
614 | __node_holder __construct_node(const key_type& __k); |
||
615 | }; |
||
616 | |||
617 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
618 | hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( |
||
619 | size_type __n, const hasher& __hf, const key_equal& __eql) |
||
620 | : __table_(__hf, __eql) |
||
621 | { |
||
622 | __table_.rehash(__n); |
||
623 | } |
||
624 | |||
625 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
626 | hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( |
||
627 | size_type __n, const hasher& __hf, const key_equal& __eql, |
||
628 | const allocator_type& __a) |
||
629 | : __table_(__hf, __eql, __a) |
||
630 | { |
||
631 | __table_.rehash(__n); |
||
632 | } |
||
633 | |||
634 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
635 | template <class _InputIterator> |
||
636 | hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( |
||
637 | _InputIterator __first, _InputIterator __last) |
||
638 | { |
||
639 | __table_.rehash(193); |
||
640 | insert(__first, __last); |
||
641 | } |
||
642 | |||
643 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
644 | template <class _InputIterator> |
||
645 | hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( |
||
646 | _InputIterator __first, _InputIterator __last, size_type __n, |
||
647 | const hasher& __hf, const key_equal& __eql) |
||
648 | : __table_(__hf, __eql) |
||
649 | { |
||
650 | __table_.rehash(__n); |
||
651 | insert(__first, __last); |
||
652 | } |
||
653 | |||
654 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
655 | template <class _InputIterator> |
||
656 | hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( |
||
657 | _InputIterator __first, _InputIterator __last, size_type __n, |
||
658 | const hasher& __hf, const key_equal& __eql, const allocator_type& __a) |
||
659 | : __table_(__hf, __eql, __a) |
||
660 | { |
||
661 | __table_.rehash(__n); |
||
662 | insert(__first, __last); |
||
663 | } |
||
664 | |||
665 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
666 | hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_map( |
||
667 | const hash_map& __u) |
||
668 | : __table_(__u.__table_) |
||
669 | { |
||
670 | __table_.rehash(__u.bucket_count()); |
||
671 | insert(__u.begin(), __u.end()); |
||
672 | } |
||
673 | |||
674 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
675 | typename hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__node_holder |
||
676 | hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__construct_node(const key_type& __k) |
||
677 | { |
||
678 | __node_allocator& __na = __table_.__node_alloc(); |
||
679 | __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na)); |
||
680 | __node_traits::construct(__na, _VSTD::addressof(__h->__value_.first), __k); |
||
681 | __h.get_deleter().__first_constructed = true; |
||
682 | __node_traits::construct(__na, _VSTD::addressof(__h->__value_.second)); |
||
683 | __h.get_deleter().__second_constructed = true; |
||
684 | return _LIBCPP_EXPLICIT_MOVE(__h); // explicitly moved for C++03 |
||
685 | } |
||
686 | |||
687 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
688 | template <class _InputIterator> |
||
689 | inline _LIBCPP_INLINE_VISIBILITY |
||
690 | void |
||
691 | hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, |
||
692 | _InputIterator __last) |
||
693 | { |
||
694 | for (; __first != __last; ++__first) |
||
695 | __table_.__insert_unique(*__first); |
||
696 | } |
||
697 | |||
698 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
699 | _Tp& |
||
700 | hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type& __k) |
||
701 | { |
||
702 | iterator __i = find(__k); |
||
703 | if (__i != end()) |
||
704 | return __i->second; |
||
705 | __node_holder __h = __construct_node(__k); |
||
706 | pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get()); |
||
707 | __h.release(); |
||
708 | return __r.first->second; |
||
709 | } |
||
710 | |||
711 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
712 | inline _LIBCPP_INLINE_VISIBILITY |
||
713 | void |
||
714 | swap(hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, |
||
715 | hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) |
||
716 | { |
||
717 | __x.swap(__y); |
||
718 | } |
||
719 | |||
720 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
721 | bool |
||
722 | operator==(const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, |
||
723 | const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) |
||
724 | { |
||
725 | if (__x.size() != __y.size()) |
||
726 | return false; |
||
727 | typedef typename hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator |
||
728 | const_iterator; |
||
729 | for (const_iterator __i = __x.begin(), __ex = __x.end(), __ey = __y.end(); |
||
730 | __i != __ex; ++__i) |
||
731 | { |
||
732 | const_iterator __j = __y.find(__i->first); |
||
733 | if (__j == __ey || !(*__i == *__j)) |
||
734 | return false; |
||
735 | } |
||
736 | return true; |
||
737 | } |
||
738 | |||
739 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
740 | inline _LIBCPP_INLINE_VISIBILITY |
||
741 | bool |
||
742 | operator!=(const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, |
||
743 | const hash_map<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) |
||
744 | { |
||
745 | return !(__x == __y); |
||
746 | } |
||
747 | |||
748 | template <class _Key, class _Tp, class _Hash = hash<_Key>, class _Pred = equal_to<_Key>, |
||
749 | class _Alloc = allocator<pair<const _Key, _Tp> > > |
||
750 | class _LIBCPP_TYPE_VIS_ONLY hash_multimap |
||
751 | { |
||
752 | public: |
||
753 | // types |
||
754 | typedef _Key key_type; |
||
755 | typedef _Tp mapped_type; |
||
756 | typedef _Tp data_type; |
||
757 | typedef _Hash hasher; |
||
758 | typedef _Pred key_equal; |
||
759 | typedef _Alloc allocator_type; |
||
760 | typedef pair<const key_type, mapped_type> value_type; |
||
761 | typedef value_type& reference; |
||
762 | typedef const value_type& const_reference; |
||
763 | |||
764 | private: |
||
765 | typedef pair<key_type, mapped_type> __value_type; |
||
766 | typedef __hash_map_hasher<__value_type, hasher> __hasher; |
||
767 | typedef __hash_map_equal<__value_type, key_equal> __key_equal; |
||
768 | typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, __value_type>::type __allocator_type; |
||
769 | |||
770 | typedef __hash_table<__value_type, __hasher, |
||
771 | __key_equal, __allocator_type> __table; |
||
772 | |||
773 | __table __table_; |
||
774 | |||
775 | typedef typename __table::__node_traits __node_traits; |
||
776 | typedef typename __table::__node_allocator __node_allocator; |
||
777 | typedef typename __table::__node __node; |
||
778 | typedef __hash_map_node_destructor<__node_allocator> _Dp; |
||
779 | typedef unique_ptr<__node, _Dp> __node_holder; |
||
780 | typedef allocator_traits<allocator_type> __alloc_traits; |
||
781 | public: |
||
782 | typedef typename __alloc_traits::pointer pointer; |
||
783 | typedef typename __alloc_traits::const_pointer const_pointer; |
||
784 | typedef typename __alloc_traits::size_type size_type; |
||
785 | typedef typename __alloc_traits::difference_type difference_type; |
||
786 | |||
787 | typedef __hash_map_iterator<typename __table::iterator> iterator; |
||
788 | typedef __hash_map_const_iterator<typename __table::const_iterator> const_iterator; |
||
789 | |||
790 | _LIBCPP_INLINE_VISIBILITY |
||
791 | hash_multimap() {__table_.rehash(193);} |
||
792 | explicit hash_multimap(size_type __n, const hasher& __hf = hasher(), |
||
793 | const key_equal& __eql = key_equal()); |
||
794 | hash_multimap(size_type __n, const hasher& __hf, |
||
795 | const key_equal& __eql, |
||
796 | const allocator_type& __a); |
||
797 | template <class _InputIterator> |
||
798 | hash_multimap(_InputIterator __first, _InputIterator __last); |
||
799 | template <class _InputIterator> |
||
800 | hash_multimap(_InputIterator __first, _InputIterator __last, |
||
801 | size_type __n, const hasher& __hf = hasher(), |
||
802 | const key_equal& __eql = key_equal()); |
||
803 | template <class _InputIterator> |
||
804 | hash_multimap(_InputIterator __first, _InputIterator __last, |
||
805 | size_type __n, const hasher& __hf, |
||
806 | const key_equal& __eql, |
||
807 | const allocator_type& __a); |
||
808 | hash_multimap(const hash_multimap& __u); |
||
809 | |||
810 | _LIBCPP_INLINE_VISIBILITY |
||
811 | allocator_type get_allocator() const |
||
812 | {return allocator_type(__table_.__node_alloc());} |
||
813 | |||
814 | _LIBCPP_INLINE_VISIBILITY |
||
815 | bool empty() const {return __table_.size() == 0;} |
||
816 | _LIBCPP_INLINE_VISIBILITY |
||
817 | size_type size() const {return __table_.size();} |
||
818 | _LIBCPP_INLINE_VISIBILITY |
||
819 | size_type max_size() const {return __table_.max_size();} |
||
820 | |||
821 | _LIBCPP_INLINE_VISIBILITY |
||
822 | iterator begin() {return __table_.begin();} |
||
823 | _LIBCPP_INLINE_VISIBILITY |
||
824 | iterator end() {return __table_.end();} |
||
825 | _LIBCPP_INLINE_VISIBILITY |
||
826 | const_iterator begin() const {return __table_.begin();} |
||
827 | _LIBCPP_INLINE_VISIBILITY |
||
828 | const_iterator end() const {return __table_.end();} |
||
829 | |||
830 | _LIBCPP_INLINE_VISIBILITY |
||
831 | iterator insert(const value_type& __x) {return __table_.__insert_multi(__x);} |
||
832 | _LIBCPP_INLINE_VISIBILITY |
||
833 | iterator insert(const_iterator, const value_type& __x) {return insert(__x);} |
||
834 | template <class _InputIterator> |
||
835 | void insert(_InputIterator __first, _InputIterator __last); |
||
836 | |||
837 | _LIBCPP_INLINE_VISIBILITY |
||
838 | void erase(const_iterator __p) {__table_.erase(__p.__i_);} |
||
839 | _LIBCPP_INLINE_VISIBILITY |
||
840 | size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} |
||
841 | _LIBCPP_INLINE_VISIBILITY |
||
842 | void erase(const_iterator __first, const_iterator __last) |
||
843 | {__table_.erase(__first.__i_, __last.__i_);} |
||
844 | _LIBCPP_INLINE_VISIBILITY |
||
845 | void clear() {__table_.clear();} |
||
846 | |||
847 | _LIBCPP_INLINE_VISIBILITY |
||
848 | void swap(hash_multimap& __u) {__table_.swap(__u.__table_);} |
||
849 | |||
850 | _LIBCPP_INLINE_VISIBILITY |
||
851 | hasher hash_funct() const |
||
852 | {return __table_.hash_function().hash_function();} |
||
853 | _LIBCPP_INLINE_VISIBILITY |
||
854 | key_equal key_eq() const |
||
855 | {return __table_.key_eq().key_eq();} |
||
856 | |||
857 | _LIBCPP_INLINE_VISIBILITY |
||
858 | iterator find(const key_type& __k) {return __table_.find(__k);} |
||
859 | _LIBCPP_INLINE_VISIBILITY |
||
860 | const_iterator find(const key_type& __k) const {return __table_.find(__k);} |
||
861 | _LIBCPP_INLINE_VISIBILITY |
||
862 | size_type count(const key_type& __k) const {return __table_.__count_multi(__k);} |
||
863 | _LIBCPP_INLINE_VISIBILITY |
||
864 | pair<iterator, iterator> equal_range(const key_type& __k) |
||
865 | {return __table_.__equal_range_multi(__k);} |
||
866 | _LIBCPP_INLINE_VISIBILITY |
||
867 | pair<const_iterator, const_iterator> equal_range(const key_type& __k) const |
||
868 | {return __table_.__equal_range_multi(__k);} |
||
869 | |||
870 | _LIBCPP_INLINE_VISIBILITY |
||
871 | size_type bucket_count() const {return __table_.bucket_count();} |
||
872 | _LIBCPP_INLINE_VISIBILITY |
||
873 | size_type max_bucket_count() const {return __table_.max_bucket_count();} |
||
874 | |||
875 | _LIBCPP_INLINE_VISIBILITY |
||
876 | size_type elems_in_bucket(size_type __n) const |
||
877 | {return __table_.bucket_size(__n);} |
||
878 | |||
879 | _LIBCPP_INLINE_VISIBILITY |
||
880 | void resize(size_type __n) {__table_.rehash(__n);} |
||
881 | }; |
||
882 | |||
883 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
884 | hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( |
||
885 | size_type __n, const hasher& __hf, const key_equal& __eql) |
||
886 | : __table_(__hf, __eql) |
||
887 | { |
||
888 | __table_.rehash(__n); |
||
889 | } |
||
890 | |||
891 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
892 | hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( |
||
893 | size_type __n, const hasher& __hf, const key_equal& __eql, |
||
894 | const allocator_type& __a) |
||
895 | : __table_(__hf, __eql, __a) |
||
896 | { |
||
897 | __table_.rehash(__n); |
||
898 | } |
||
899 | |||
900 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
901 | template <class _InputIterator> |
||
902 | hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( |
||
903 | _InputIterator __first, _InputIterator __last) |
||
904 | { |
||
905 | __table_.rehash(193); |
||
906 | insert(__first, __last); |
||
907 | } |
||
908 | |||
909 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
910 | template <class _InputIterator> |
||
911 | hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( |
||
912 | _InputIterator __first, _InputIterator __last, size_type __n, |
||
913 | const hasher& __hf, const key_equal& __eql) |
||
914 | : __table_(__hf, __eql) |
||
915 | { |
||
916 | __table_.rehash(__n); |
||
917 | insert(__first, __last); |
||
918 | } |
||
919 | |||
920 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
921 | template <class _InputIterator> |
||
922 | hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( |
||
923 | _InputIterator __first, _InputIterator __last, size_type __n, |
||
924 | const hasher& __hf, const key_equal& __eql, const allocator_type& __a) |
||
925 | : __table_(__hf, __eql, __a) |
||
926 | { |
||
927 | __table_.rehash(__n); |
||
928 | insert(__first, __last); |
||
929 | } |
||
930 | |||
931 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
932 | hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::hash_multimap( |
||
933 | const hash_multimap& __u) |
||
934 | : __table_(__u.__table_) |
||
935 | { |
||
936 | __table_.rehash(__u.bucket_count()); |
||
937 | insert(__u.begin(), __u.end()); |
||
938 | } |
||
939 | |||
940 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
941 | template <class _InputIterator> |
||
942 | inline _LIBCPP_INLINE_VISIBILITY |
||
943 | void |
||
944 | hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::insert(_InputIterator __first, |
||
945 | _InputIterator __last) |
||
946 | { |
||
947 | for (; __first != __last; ++__first) |
||
948 | __table_.__insert_multi(*__first); |
||
949 | } |
||
950 | |||
951 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
952 | inline _LIBCPP_INLINE_VISIBILITY |
||
953 | void |
||
954 | swap(hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, |
||
955 | hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) |
||
956 | { |
||
957 | __x.swap(__y); |
||
958 | } |
||
959 | |||
960 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
961 | bool |
||
962 | operator==(const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, |
||
963 | const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) |
||
964 | { |
||
965 | if (__x.size() != __y.size()) |
||
966 | return false; |
||
967 | typedef typename hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>::const_iterator |
||
968 | const_iterator; |
||
969 | typedef pair<const_iterator, const_iterator> _EqRng; |
||
970 | for (const_iterator __i = __x.begin(), __ex = __x.end(); __i != __ex;) |
||
971 | { |
||
972 | _EqRng __xeq = __x.equal_range(__i->first); |
||
973 | _EqRng __yeq = __y.equal_range(__i->first); |
||
974 | if (_VSTD::distance(__xeq.first, __xeq.second) != |
||
975 | _VSTD::distance(__yeq.first, __yeq.second) || |
||
976 | !_VSTD::is_permutation(__xeq.first, __xeq.second, __yeq.first)) |
||
977 | return false; |
||
978 | __i = __xeq.second; |
||
979 | } |
||
980 | return true; |
||
981 | } |
||
982 | |||
983 | template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> |
||
984 | inline _LIBCPP_INLINE_VISIBILITY |
||
985 | bool |
||
986 | operator!=(const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __x, |
||
987 | const hash_multimap<_Key, _Tp, _Hash, _Pred, _Alloc>& __y) |
||
988 | { |
||
989 | return !(__x == __y); |
||
990 | } |
||
991 | |||
992 | } // __gnu_cxx |
||
993 | |||
994 | #endif // _LIBCPP_HASH_MAP |