Chris@16
|
1
|
Chris@16
|
2 // Copyright (C) 2003-2004 Jeremy B. Maitin-Shepard.
|
Chris@16
|
3 // Copyright (C) 2005-2011 Daniel James.
|
Chris@16
|
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6
|
Chris@16
|
7 // See http://www.boost.org/libs/unordered for documentation
|
Chris@16
|
8
|
Chris@16
|
9 #ifndef BOOST_UNORDERED_UNORDERED_MAP_HPP_INCLUDED
|
Chris@16
|
10 #define BOOST_UNORDERED_UNORDERED_MAP_HPP_INCLUDED
|
Chris@16
|
11
|
Chris@101
|
12 #include <boost/config.hpp>
|
Chris@101
|
13 #if defined(BOOST_HAS_PRAGMA_ONCE)
|
Chris@101
|
14 #pragma once
|
Chris@16
|
15 #endif
|
Chris@16
|
16
|
Chris@16
|
17 #include <boost/unordered/unordered_map_fwd.hpp>
|
Chris@16
|
18 #include <boost/unordered/detail/equivalent.hpp>
|
Chris@16
|
19 #include <boost/unordered/detail/unique.hpp>
|
Chris@16
|
20 #include <boost/unordered/detail/util.hpp>
|
Chris@16
|
21 #include <boost/functional/hash.hpp>
|
Chris@16
|
22 #include <boost/move/move.hpp>
|
Chris@16
|
23
|
Chris@16
|
24 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
25 #include <initializer_list>
|
Chris@16
|
26 #endif
|
Chris@16
|
27
|
Chris@16
|
28 #if defined(BOOST_MSVC)
|
Chris@16
|
29 #pragma warning(push)
|
Chris@16
|
30 #if BOOST_MSVC >= 1400
|
Chris@16
|
31 #pragma warning(disable:4396) //the inline specifier cannot be used when a
|
Chris@16
|
32 // friend declaration refers to a specialization
|
Chris@16
|
33 // of a function template
|
Chris@16
|
34 #endif
|
Chris@16
|
35 #endif
|
Chris@16
|
36
|
Chris@16
|
37 namespace boost
|
Chris@16
|
38 {
|
Chris@16
|
39 namespace unordered
|
Chris@16
|
40 {
|
Chris@16
|
41 template <class K, class T, class H, class P, class A>
|
Chris@16
|
42 class unordered_map
|
Chris@16
|
43 {
|
Chris@16
|
44 #if defined(BOOST_UNORDERED_USE_MOVE)
|
Chris@16
|
45 BOOST_COPYABLE_AND_MOVABLE(unordered_map)
|
Chris@16
|
46 #endif
|
Chris@16
|
47
|
Chris@16
|
48 public:
|
Chris@16
|
49
|
Chris@16
|
50 typedef K key_type;
|
Chris@16
|
51 typedef std::pair<const K, T> value_type;
|
Chris@16
|
52 typedef T mapped_type;
|
Chris@16
|
53 typedef H hasher;
|
Chris@16
|
54 typedef P key_equal;
|
Chris@16
|
55 typedef A allocator_type;
|
Chris@16
|
56
|
Chris@16
|
57 private:
|
Chris@16
|
58
|
Chris@16
|
59 typedef boost::unordered::detail::map<A, K, T, H, P> types;
|
Chris@16
|
60 typedef typename types::traits allocator_traits;
|
Chris@16
|
61 typedef typename types::table table;
|
Chris@16
|
62
|
Chris@16
|
63 public:
|
Chris@16
|
64
|
Chris@16
|
65 typedef typename allocator_traits::pointer pointer;
|
Chris@16
|
66 typedef typename allocator_traits::const_pointer const_pointer;
|
Chris@16
|
67
|
Chris@16
|
68 typedef value_type& reference;
|
Chris@16
|
69 typedef value_type const& const_reference;
|
Chris@16
|
70
|
Chris@16
|
71 typedef std::size_t size_type;
|
Chris@16
|
72 typedef std::ptrdiff_t difference_type;
|
Chris@16
|
73
|
Chris@16
|
74 typedef typename table::cl_iterator const_local_iterator;
|
Chris@16
|
75 typedef typename table::l_iterator local_iterator;
|
Chris@16
|
76 typedef typename table::c_iterator const_iterator;
|
Chris@16
|
77 typedef typename table::iterator iterator;
|
Chris@16
|
78
|
Chris@16
|
79 private:
|
Chris@16
|
80
|
Chris@16
|
81 table table_;
|
Chris@16
|
82
|
Chris@16
|
83 public:
|
Chris@16
|
84
|
Chris@16
|
85 // constructors
|
Chris@16
|
86
|
Chris@16
|
87 explicit unordered_map(
|
Chris@16
|
88 size_type = boost::unordered::detail::default_bucket_count,
|
Chris@16
|
89 const hasher& = hasher(),
|
Chris@16
|
90 const key_equal& = key_equal(),
|
Chris@16
|
91 const allocator_type& = allocator_type());
|
Chris@16
|
92
|
Chris@16
|
93 explicit unordered_map(allocator_type const&);
|
Chris@16
|
94
|
Chris@16
|
95 template <class InputIt>
|
Chris@16
|
96 unordered_map(InputIt, InputIt);
|
Chris@16
|
97
|
Chris@16
|
98 template <class InputIt>
|
Chris@16
|
99 unordered_map(
|
Chris@16
|
100 InputIt, InputIt,
|
Chris@16
|
101 size_type,
|
Chris@16
|
102 const hasher& = hasher(),
|
Chris@16
|
103 const key_equal& = key_equal());
|
Chris@16
|
104
|
Chris@16
|
105 template <class InputIt>
|
Chris@16
|
106 unordered_map(
|
Chris@16
|
107 InputIt, InputIt,
|
Chris@16
|
108 size_type,
|
Chris@16
|
109 const hasher&,
|
Chris@16
|
110 const key_equal&,
|
Chris@16
|
111 const allocator_type&);
|
Chris@16
|
112
|
Chris@16
|
113 // copy/move constructors
|
Chris@16
|
114
|
Chris@16
|
115 unordered_map(unordered_map const&);
|
Chris@16
|
116
|
Chris@16
|
117 unordered_map(unordered_map const&, allocator_type const&);
|
Chris@16
|
118
|
Chris@16
|
119 #if defined(BOOST_UNORDERED_USE_MOVE)
|
Chris@16
|
120 unordered_map(BOOST_RV_REF(unordered_map) other)
|
Chris@16
|
121 BOOST_NOEXCEPT_IF(table::nothrow_move_constructible)
|
Chris@16
|
122 : table_(other.table_, boost::unordered::detail::move_tag())
|
Chris@16
|
123 {
|
Chris@16
|
124 }
|
Chris@16
|
125 #elif !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
Chris@16
|
126 unordered_map(unordered_map&& other)
|
Chris@16
|
127 BOOST_NOEXCEPT_IF(table::nothrow_move_constructible)
|
Chris@16
|
128 : table_(other.table_, boost::unordered::detail::move_tag())
|
Chris@16
|
129 {
|
Chris@16
|
130 }
|
Chris@16
|
131 #endif
|
Chris@16
|
132
|
Chris@16
|
133 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
Chris@16
|
134 unordered_map(unordered_map&&, allocator_type const&);
|
Chris@16
|
135 #endif
|
Chris@16
|
136
|
Chris@16
|
137 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
138 unordered_map(
|
Chris@16
|
139 std::initializer_list<value_type>,
|
Chris@16
|
140 size_type = boost::unordered::detail::default_bucket_count,
|
Chris@16
|
141 const hasher& = hasher(),
|
Chris@16
|
142 const key_equal&l = key_equal(),
|
Chris@16
|
143 const allocator_type& = allocator_type());
|
Chris@16
|
144 #endif
|
Chris@16
|
145
|
Chris@16
|
146 // Destructor
|
Chris@16
|
147
|
Chris@16
|
148 ~unordered_map() BOOST_NOEXCEPT;
|
Chris@16
|
149
|
Chris@16
|
150 // Assign
|
Chris@16
|
151
|
Chris@16
|
152 #if defined(BOOST_UNORDERED_USE_MOVE)
|
Chris@16
|
153 unordered_map& operator=(BOOST_COPY_ASSIGN_REF(unordered_map) x)
|
Chris@16
|
154 {
|
Chris@16
|
155 table_.assign(x.table_);
|
Chris@16
|
156 return *this;
|
Chris@16
|
157 }
|
Chris@16
|
158
|
Chris@16
|
159 unordered_map& operator=(BOOST_RV_REF(unordered_map) x)
|
Chris@16
|
160 {
|
Chris@16
|
161 table_.move_assign(x.table_);
|
Chris@16
|
162 return *this;
|
Chris@16
|
163 }
|
Chris@16
|
164 #else
|
Chris@16
|
165 unordered_map& operator=(unordered_map const& x)
|
Chris@16
|
166 {
|
Chris@16
|
167 table_.assign(x.table_);
|
Chris@16
|
168 return *this;
|
Chris@16
|
169 }
|
Chris@16
|
170
|
Chris@16
|
171 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
Chris@16
|
172 unordered_map& operator=(unordered_map&& x)
|
Chris@16
|
173 {
|
Chris@16
|
174 table_.move_assign(x.table_);
|
Chris@16
|
175 return *this;
|
Chris@16
|
176 }
|
Chris@16
|
177 #endif
|
Chris@16
|
178 #endif
|
Chris@16
|
179
|
Chris@16
|
180 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
181 unordered_map& operator=(std::initializer_list<value_type>);
|
Chris@16
|
182 #endif
|
Chris@16
|
183
|
Chris@16
|
184 allocator_type get_allocator() const BOOST_NOEXCEPT
|
Chris@16
|
185 {
|
Chris@16
|
186 return table_.node_alloc();
|
Chris@16
|
187 }
|
Chris@16
|
188
|
Chris@16
|
189 // size and capacity
|
Chris@16
|
190
|
Chris@16
|
191 bool empty() const BOOST_NOEXCEPT
|
Chris@16
|
192 {
|
Chris@16
|
193 return table_.size_ == 0;
|
Chris@16
|
194 }
|
Chris@16
|
195
|
Chris@16
|
196 size_type size() const BOOST_NOEXCEPT
|
Chris@16
|
197 {
|
Chris@16
|
198 return table_.size_;
|
Chris@16
|
199 }
|
Chris@16
|
200
|
Chris@16
|
201 size_type max_size() const BOOST_NOEXCEPT;
|
Chris@16
|
202
|
Chris@16
|
203 // iterators
|
Chris@16
|
204
|
Chris@16
|
205 iterator begin() BOOST_NOEXCEPT
|
Chris@16
|
206 {
|
Chris@16
|
207 return table_.begin();
|
Chris@16
|
208 }
|
Chris@16
|
209
|
Chris@16
|
210 const_iterator begin() const BOOST_NOEXCEPT
|
Chris@16
|
211 {
|
Chris@16
|
212 return table_.begin();
|
Chris@16
|
213 }
|
Chris@16
|
214
|
Chris@16
|
215 iterator end() BOOST_NOEXCEPT
|
Chris@16
|
216 {
|
Chris@16
|
217 return iterator();
|
Chris@16
|
218 }
|
Chris@16
|
219
|
Chris@16
|
220 const_iterator end() const BOOST_NOEXCEPT
|
Chris@16
|
221 {
|
Chris@16
|
222 return const_iterator();
|
Chris@16
|
223 }
|
Chris@16
|
224
|
Chris@16
|
225 const_iterator cbegin() const BOOST_NOEXCEPT
|
Chris@16
|
226 {
|
Chris@16
|
227 return table_.begin();
|
Chris@16
|
228 }
|
Chris@16
|
229
|
Chris@16
|
230 const_iterator cend() const BOOST_NOEXCEPT
|
Chris@16
|
231 {
|
Chris@16
|
232 return const_iterator();
|
Chris@16
|
233 }
|
Chris@16
|
234
|
Chris@16
|
235 // emplace
|
Chris@16
|
236
|
Chris@16
|
237 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
Chris@16
|
238 template <class... Args>
|
Chris@16
|
239 std::pair<iterator, bool> emplace(BOOST_FWD_REF(Args)... args)
|
Chris@16
|
240 {
|
Chris@16
|
241 return table_.emplace(boost::forward<Args>(args)...);
|
Chris@16
|
242 }
|
Chris@16
|
243
|
Chris@16
|
244 template <class... Args>
|
Chris@16
|
245 iterator emplace_hint(const_iterator, BOOST_FWD_REF(Args)... args)
|
Chris@16
|
246 {
|
Chris@16
|
247 return table_.emplace(boost::forward<Args>(args)...).first;
|
Chris@16
|
248 }
|
Chris@16
|
249 #else
|
Chris@16
|
250
|
Chris@16
|
251 #if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x5100))
|
Chris@16
|
252
|
Chris@16
|
253 // 0 argument emplace requires special treatment in case
|
Chris@16
|
254 // the container is instantiated with a value type that
|
Chris@16
|
255 // doesn't have a default constructor.
|
Chris@16
|
256
|
Chris@16
|
257 std::pair<iterator, bool> emplace(
|
Chris@16
|
258 boost::unordered::detail::empty_emplace
|
Chris@16
|
259 = boost::unordered::detail::empty_emplace(),
|
Chris@16
|
260 value_type v = value_type())
|
Chris@16
|
261 {
|
Chris@16
|
262 return this->emplace(boost::move(v));
|
Chris@16
|
263 }
|
Chris@16
|
264
|
Chris@16
|
265 iterator emplace_hint(const_iterator hint,
|
Chris@16
|
266 boost::unordered::detail::empty_emplace
|
Chris@16
|
267 = boost::unordered::detail::empty_emplace(),
|
Chris@16
|
268 value_type v = value_type()
|
Chris@16
|
269 )
|
Chris@16
|
270 {
|
Chris@16
|
271 return this->emplace_hint(hint, boost::move(v));
|
Chris@16
|
272 }
|
Chris@16
|
273
|
Chris@16
|
274 #endif
|
Chris@16
|
275
|
Chris@16
|
276 template <typename A0>
|
Chris@16
|
277 std::pair<iterator, bool> emplace(BOOST_FWD_REF(A0) a0)
|
Chris@16
|
278 {
|
Chris@16
|
279 return table_.emplace(
|
Chris@16
|
280 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
281 boost::forward<A0>(a0))
|
Chris@16
|
282 );
|
Chris@16
|
283 }
|
Chris@16
|
284
|
Chris@16
|
285 template <typename A0>
|
Chris@16
|
286 iterator emplace_hint(const_iterator, BOOST_FWD_REF(A0) a0)
|
Chris@16
|
287 {
|
Chris@16
|
288 return table_.emplace(
|
Chris@16
|
289 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
290 boost::forward<A0>(a0))
|
Chris@16
|
291 ).first;
|
Chris@16
|
292 }
|
Chris@16
|
293
|
Chris@16
|
294 template <typename A0, typename A1>
|
Chris@16
|
295 std::pair<iterator, bool> emplace(
|
Chris@16
|
296 BOOST_FWD_REF(A0) a0,
|
Chris@16
|
297 BOOST_FWD_REF(A1) a1)
|
Chris@16
|
298 {
|
Chris@16
|
299 return table_.emplace(
|
Chris@16
|
300 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
301 boost::forward<A0>(a0),
|
Chris@16
|
302 boost::forward<A1>(a1))
|
Chris@16
|
303 );
|
Chris@16
|
304 }
|
Chris@16
|
305
|
Chris@16
|
306 template <typename A0, typename A1>
|
Chris@16
|
307 iterator emplace_hint(const_iterator,
|
Chris@16
|
308 BOOST_FWD_REF(A0) a0,
|
Chris@16
|
309 BOOST_FWD_REF(A1) a1)
|
Chris@16
|
310 {
|
Chris@16
|
311 return table_.emplace(
|
Chris@16
|
312 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
313 boost::forward<A0>(a0),
|
Chris@16
|
314 boost::forward<A1>(a1))
|
Chris@16
|
315 ).first;
|
Chris@16
|
316 }
|
Chris@16
|
317
|
Chris@16
|
318 template <typename A0, typename A1, typename A2>
|
Chris@16
|
319 std::pair<iterator, bool> emplace(
|
Chris@16
|
320 BOOST_FWD_REF(A0) a0,
|
Chris@16
|
321 BOOST_FWD_REF(A1) a1,
|
Chris@16
|
322 BOOST_FWD_REF(A2) a2)
|
Chris@16
|
323 {
|
Chris@16
|
324 return table_.emplace(
|
Chris@16
|
325 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
326 boost::forward<A0>(a0),
|
Chris@16
|
327 boost::forward<A1>(a1),
|
Chris@16
|
328 boost::forward<A2>(a2))
|
Chris@16
|
329 );
|
Chris@16
|
330 }
|
Chris@16
|
331
|
Chris@16
|
332 template <typename A0, typename A1, typename A2>
|
Chris@16
|
333 iterator emplace_hint(const_iterator,
|
Chris@16
|
334 BOOST_FWD_REF(A0) a0,
|
Chris@16
|
335 BOOST_FWD_REF(A1) a1,
|
Chris@16
|
336 BOOST_FWD_REF(A2) a2)
|
Chris@16
|
337 {
|
Chris@16
|
338 return table_.emplace(
|
Chris@16
|
339 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
340 boost::forward<A0>(a0),
|
Chris@16
|
341 boost::forward<A1>(a1),
|
Chris@16
|
342 boost::forward<A2>(a2))
|
Chris@16
|
343 ).first;
|
Chris@16
|
344 }
|
Chris@16
|
345
|
Chris@16
|
346 #define BOOST_UNORDERED_EMPLACE(z, n, _) \
|
Chris@16
|
347 template < \
|
Chris@16
|
348 BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \
|
Chris@16
|
349 > \
|
Chris@16
|
350 std::pair<iterator, bool> emplace( \
|
Chris@16
|
351 BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a) \
|
Chris@16
|
352 ) \
|
Chris@16
|
353 { \
|
Chris@16
|
354 return table_.emplace( \
|
Chris@16
|
355 boost::unordered::detail::create_emplace_args( \
|
Chris@16
|
356 BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, \
|
Chris@16
|
357 a) \
|
Chris@16
|
358 )); \
|
Chris@16
|
359 } \
|
Chris@16
|
360 \
|
Chris@16
|
361 template < \
|
Chris@16
|
362 BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \
|
Chris@16
|
363 > \
|
Chris@16
|
364 iterator emplace_hint( \
|
Chris@16
|
365 const_iterator, \
|
Chris@16
|
366 BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a) \
|
Chris@16
|
367 ) \
|
Chris@16
|
368 { \
|
Chris@16
|
369 return table_.emplace( \
|
Chris@16
|
370 boost::unordered::detail::create_emplace_args( \
|
Chris@16
|
371 BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, \
|
Chris@16
|
372 a) \
|
Chris@16
|
373 )).first; \
|
Chris@16
|
374 }
|
Chris@16
|
375
|
Chris@16
|
376 BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT,
|
Chris@16
|
377 BOOST_UNORDERED_EMPLACE, _)
|
Chris@16
|
378
|
Chris@16
|
379 #undef BOOST_UNORDERED_EMPLACE
|
Chris@16
|
380
|
Chris@16
|
381 #endif
|
Chris@16
|
382
|
Chris@16
|
383 std::pair<iterator, bool> insert(value_type const& x)
|
Chris@16
|
384 {
|
Chris@16
|
385 return this->emplace(x);
|
Chris@16
|
386 }
|
Chris@16
|
387
|
Chris@16
|
388 std::pair<iterator, bool> insert(BOOST_RV_REF(value_type) x)
|
Chris@16
|
389 {
|
Chris@16
|
390 return this->emplace(boost::move(x));
|
Chris@16
|
391 }
|
Chris@16
|
392
|
Chris@16
|
393 iterator insert(const_iterator hint, value_type const& x)
|
Chris@16
|
394 {
|
Chris@16
|
395 return this->emplace_hint(hint, x);
|
Chris@16
|
396 }
|
Chris@16
|
397
|
Chris@16
|
398 iterator insert(const_iterator hint, BOOST_RV_REF(value_type) x)
|
Chris@16
|
399 {
|
Chris@16
|
400 return this->emplace_hint(hint, boost::move(x));
|
Chris@16
|
401 }
|
Chris@16
|
402
|
Chris@16
|
403 template <class InputIt> void insert(InputIt, InputIt);
|
Chris@16
|
404
|
Chris@16
|
405 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
406 void insert(std::initializer_list<value_type>);
|
Chris@16
|
407 #endif
|
Chris@16
|
408
|
Chris@16
|
409 iterator erase(const_iterator);
|
Chris@16
|
410 size_type erase(const key_type&);
|
Chris@16
|
411 iterator erase(const_iterator, const_iterator);
|
Chris@16
|
412 void quick_erase(const_iterator it) { erase(it); }
|
Chris@16
|
413 void erase_return_void(const_iterator it) { erase(it); }
|
Chris@16
|
414
|
Chris@16
|
415 void clear();
|
Chris@16
|
416 void swap(unordered_map&);
|
Chris@16
|
417
|
Chris@16
|
418 // observers
|
Chris@16
|
419
|
Chris@16
|
420 hasher hash_function() const;
|
Chris@16
|
421 key_equal key_eq() const;
|
Chris@16
|
422
|
Chris@16
|
423 mapped_type& operator[](const key_type&);
|
Chris@16
|
424 mapped_type& at(const key_type&);
|
Chris@16
|
425 mapped_type const& at(const key_type&) const;
|
Chris@16
|
426
|
Chris@16
|
427 // lookup
|
Chris@16
|
428
|
Chris@16
|
429 iterator find(const key_type&);
|
Chris@16
|
430 const_iterator find(const key_type&) const;
|
Chris@16
|
431
|
Chris@16
|
432 template <class CompatibleKey, class CompatibleHash,
|
Chris@16
|
433 class CompatiblePredicate>
|
Chris@16
|
434 iterator find(
|
Chris@16
|
435 CompatibleKey const&,
|
Chris@16
|
436 CompatibleHash const&,
|
Chris@16
|
437 CompatiblePredicate const&);
|
Chris@16
|
438
|
Chris@16
|
439 template <class CompatibleKey, class CompatibleHash,
|
Chris@16
|
440 class CompatiblePredicate>
|
Chris@16
|
441 const_iterator find(
|
Chris@16
|
442 CompatibleKey const&,
|
Chris@16
|
443 CompatibleHash const&,
|
Chris@16
|
444 CompatiblePredicate const&) const;
|
Chris@16
|
445
|
Chris@16
|
446 size_type count(const key_type&) const;
|
Chris@16
|
447
|
Chris@16
|
448 std::pair<iterator, iterator>
|
Chris@16
|
449 equal_range(const key_type&);
|
Chris@16
|
450 std::pair<const_iterator, const_iterator>
|
Chris@16
|
451 equal_range(const key_type&) const;
|
Chris@16
|
452
|
Chris@16
|
453 // bucket interface
|
Chris@16
|
454
|
Chris@16
|
455 size_type bucket_count() const BOOST_NOEXCEPT
|
Chris@16
|
456 {
|
Chris@16
|
457 return table_.bucket_count_;
|
Chris@16
|
458 }
|
Chris@16
|
459
|
Chris@16
|
460 size_type max_bucket_count() const BOOST_NOEXCEPT
|
Chris@16
|
461 {
|
Chris@16
|
462 return table_.max_bucket_count();
|
Chris@16
|
463 }
|
Chris@16
|
464
|
Chris@16
|
465 size_type bucket_size(size_type) const;
|
Chris@16
|
466
|
Chris@16
|
467 size_type bucket(const key_type& k) const
|
Chris@16
|
468 {
|
Chris@16
|
469 return table_.hash_to_bucket(table_.hash(k));
|
Chris@16
|
470 }
|
Chris@16
|
471
|
Chris@16
|
472 local_iterator begin(size_type n)
|
Chris@16
|
473 {
|
Chris@16
|
474 return local_iterator(
|
Chris@16
|
475 table_.begin(n), n, table_.bucket_count_);
|
Chris@16
|
476 }
|
Chris@16
|
477
|
Chris@16
|
478 const_local_iterator begin(size_type n) const
|
Chris@16
|
479 {
|
Chris@16
|
480 return const_local_iterator(
|
Chris@16
|
481 table_.begin(n), n, table_.bucket_count_);
|
Chris@16
|
482 }
|
Chris@16
|
483
|
Chris@16
|
484 local_iterator end(size_type)
|
Chris@16
|
485 {
|
Chris@16
|
486 return local_iterator();
|
Chris@16
|
487 }
|
Chris@16
|
488
|
Chris@16
|
489 const_local_iterator end(size_type) const
|
Chris@16
|
490 {
|
Chris@16
|
491 return const_local_iterator();
|
Chris@16
|
492 }
|
Chris@16
|
493
|
Chris@16
|
494 const_local_iterator cbegin(size_type n) const
|
Chris@16
|
495 {
|
Chris@16
|
496 return const_local_iterator(
|
Chris@16
|
497 table_.begin(n), n, table_.bucket_count_);
|
Chris@16
|
498 }
|
Chris@16
|
499
|
Chris@16
|
500 const_local_iterator cend(size_type) const
|
Chris@16
|
501 {
|
Chris@16
|
502 return const_local_iterator();
|
Chris@16
|
503 }
|
Chris@16
|
504
|
Chris@16
|
505 // hash policy
|
Chris@16
|
506
|
Chris@16
|
507 float max_load_factor() const BOOST_NOEXCEPT
|
Chris@16
|
508 {
|
Chris@16
|
509 return table_.mlf_;
|
Chris@16
|
510 }
|
Chris@16
|
511
|
Chris@16
|
512 float load_factor() const BOOST_NOEXCEPT;
|
Chris@16
|
513 void max_load_factor(float) BOOST_NOEXCEPT;
|
Chris@16
|
514 void rehash(size_type);
|
Chris@16
|
515 void reserve(size_type);
|
Chris@16
|
516
|
Chris@16
|
517 #if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582)
|
Chris@16
|
518 friend bool operator==<K,T,H,P,A>(
|
Chris@16
|
519 unordered_map const&, unordered_map const&);
|
Chris@16
|
520 friend bool operator!=<K,T,H,P,A>(
|
Chris@16
|
521 unordered_map const&, unordered_map const&);
|
Chris@16
|
522 #endif
|
Chris@16
|
523 }; // class template unordered_map
|
Chris@16
|
524
|
Chris@16
|
525 template <class K, class T, class H, class P, class A>
|
Chris@16
|
526 class unordered_multimap
|
Chris@16
|
527 {
|
Chris@16
|
528 #if defined(BOOST_UNORDERED_USE_MOVE)
|
Chris@16
|
529 BOOST_COPYABLE_AND_MOVABLE(unordered_multimap)
|
Chris@16
|
530 #endif
|
Chris@16
|
531 public:
|
Chris@16
|
532
|
Chris@16
|
533 typedef K key_type;
|
Chris@16
|
534 typedef std::pair<const K, T> value_type;
|
Chris@16
|
535 typedef T mapped_type;
|
Chris@16
|
536 typedef H hasher;
|
Chris@16
|
537 typedef P key_equal;
|
Chris@16
|
538 typedef A allocator_type;
|
Chris@16
|
539
|
Chris@16
|
540 private:
|
Chris@16
|
541
|
Chris@16
|
542 typedef boost::unordered::detail::multimap<A, K, T, H, P> types;
|
Chris@16
|
543 typedef typename types::traits allocator_traits;
|
Chris@16
|
544 typedef typename types::table table;
|
Chris@16
|
545
|
Chris@16
|
546 public:
|
Chris@16
|
547
|
Chris@16
|
548 typedef typename allocator_traits::pointer pointer;
|
Chris@16
|
549 typedef typename allocator_traits::const_pointer const_pointer;
|
Chris@16
|
550
|
Chris@16
|
551 typedef value_type& reference;
|
Chris@16
|
552 typedef value_type const& const_reference;
|
Chris@16
|
553
|
Chris@16
|
554 typedef std::size_t size_type;
|
Chris@16
|
555 typedef std::ptrdiff_t difference_type;
|
Chris@16
|
556
|
Chris@16
|
557 typedef typename table::cl_iterator const_local_iterator;
|
Chris@16
|
558 typedef typename table::l_iterator local_iterator;
|
Chris@16
|
559 typedef typename table::c_iterator const_iterator;
|
Chris@16
|
560 typedef typename table::iterator iterator;
|
Chris@16
|
561
|
Chris@16
|
562 private:
|
Chris@16
|
563
|
Chris@16
|
564 table table_;
|
Chris@16
|
565
|
Chris@16
|
566 public:
|
Chris@16
|
567
|
Chris@16
|
568 // constructors
|
Chris@16
|
569
|
Chris@16
|
570 explicit unordered_multimap(
|
Chris@16
|
571 size_type = boost::unordered::detail::default_bucket_count,
|
Chris@16
|
572 const hasher& = hasher(),
|
Chris@16
|
573 const key_equal& = key_equal(),
|
Chris@16
|
574 const allocator_type& = allocator_type());
|
Chris@16
|
575
|
Chris@16
|
576 explicit unordered_multimap(allocator_type const&);
|
Chris@16
|
577
|
Chris@16
|
578 template <class InputIt>
|
Chris@16
|
579 unordered_multimap(InputIt, InputIt);
|
Chris@16
|
580
|
Chris@16
|
581 template <class InputIt>
|
Chris@16
|
582 unordered_multimap(
|
Chris@16
|
583 InputIt, InputIt,
|
Chris@16
|
584 size_type,
|
Chris@16
|
585 const hasher& = hasher(),
|
Chris@16
|
586 const key_equal& = key_equal());
|
Chris@16
|
587
|
Chris@16
|
588 template <class InputIt>
|
Chris@16
|
589 unordered_multimap(
|
Chris@16
|
590 InputIt, InputIt,
|
Chris@16
|
591 size_type,
|
Chris@16
|
592 const hasher&,
|
Chris@16
|
593 const key_equal&,
|
Chris@16
|
594 const allocator_type&);
|
Chris@16
|
595
|
Chris@16
|
596 // copy/move constructors
|
Chris@16
|
597
|
Chris@16
|
598 unordered_multimap(unordered_multimap const&);
|
Chris@16
|
599
|
Chris@16
|
600 unordered_multimap(unordered_multimap const&, allocator_type const&);
|
Chris@16
|
601
|
Chris@16
|
602 #if defined(BOOST_UNORDERED_USE_MOVE)
|
Chris@16
|
603 unordered_multimap(BOOST_RV_REF(unordered_multimap) other)
|
Chris@16
|
604 BOOST_NOEXCEPT_IF(table::nothrow_move_constructible)
|
Chris@16
|
605 : table_(other.table_, boost::unordered::detail::move_tag())
|
Chris@16
|
606 {
|
Chris@16
|
607 }
|
Chris@16
|
608 #elif !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
Chris@16
|
609 unordered_multimap(unordered_multimap&& other)
|
Chris@16
|
610 BOOST_NOEXCEPT_IF(table::nothrow_move_constructible)
|
Chris@16
|
611 : table_(other.table_, boost::unordered::detail::move_tag())
|
Chris@16
|
612 {
|
Chris@16
|
613 }
|
Chris@16
|
614 #endif
|
Chris@16
|
615
|
Chris@16
|
616 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
Chris@16
|
617 unordered_multimap(unordered_multimap&&, allocator_type const&);
|
Chris@16
|
618 #endif
|
Chris@16
|
619
|
Chris@16
|
620 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
621 unordered_multimap(
|
Chris@16
|
622 std::initializer_list<value_type>,
|
Chris@16
|
623 size_type = boost::unordered::detail::default_bucket_count,
|
Chris@16
|
624 const hasher& = hasher(),
|
Chris@16
|
625 const key_equal&l = key_equal(),
|
Chris@16
|
626 const allocator_type& = allocator_type());
|
Chris@16
|
627 #endif
|
Chris@16
|
628
|
Chris@16
|
629 // Destructor
|
Chris@16
|
630
|
Chris@16
|
631 ~unordered_multimap() BOOST_NOEXCEPT;
|
Chris@16
|
632
|
Chris@16
|
633 // Assign
|
Chris@16
|
634
|
Chris@16
|
635 #if defined(BOOST_UNORDERED_USE_MOVE)
|
Chris@16
|
636 unordered_multimap& operator=(
|
Chris@16
|
637 BOOST_COPY_ASSIGN_REF(unordered_multimap) x)
|
Chris@16
|
638 {
|
Chris@16
|
639 table_.assign(x.table_);
|
Chris@16
|
640 return *this;
|
Chris@16
|
641 }
|
Chris@16
|
642
|
Chris@16
|
643 unordered_multimap& operator=(BOOST_RV_REF(unordered_multimap) x)
|
Chris@16
|
644 {
|
Chris@16
|
645 table_.move_assign(x.table_);
|
Chris@16
|
646 return *this;
|
Chris@16
|
647 }
|
Chris@16
|
648 #else
|
Chris@16
|
649 unordered_multimap& operator=(unordered_multimap const& x)
|
Chris@16
|
650 {
|
Chris@16
|
651 table_.assign(x.table_);
|
Chris@16
|
652 return *this;
|
Chris@16
|
653 }
|
Chris@16
|
654
|
Chris@16
|
655 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
Chris@16
|
656 unordered_multimap& operator=(unordered_multimap&& x)
|
Chris@16
|
657 {
|
Chris@16
|
658 table_.move_assign(x.table_);
|
Chris@16
|
659 return *this;
|
Chris@16
|
660 }
|
Chris@16
|
661 #endif
|
Chris@16
|
662 #endif
|
Chris@16
|
663
|
Chris@16
|
664 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
665 unordered_multimap& operator=(std::initializer_list<value_type>);
|
Chris@16
|
666 #endif
|
Chris@16
|
667
|
Chris@16
|
668 allocator_type get_allocator() const BOOST_NOEXCEPT
|
Chris@16
|
669 {
|
Chris@16
|
670 return table_.node_alloc();
|
Chris@16
|
671 }
|
Chris@16
|
672
|
Chris@16
|
673 // size and capacity
|
Chris@16
|
674
|
Chris@16
|
675 bool empty() const BOOST_NOEXCEPT
|
Chris@16
|
676 {
|
Chris@16
|
677 return table_.size_ == 0;
|
Chris@16
|
678 }
|
Chris@16
|
679
|
Chris@16
|
680 size_type size() const BOOST_NOEXCEPT
|
Chris@16
|
681 {
|
Chris@16
|
682 return table_.size_;
|
Chris@16
|
683 }
|
Chris@16
|
684
|
Chris@16
|
685 size_type max_size() const BOOST_NOEXCEPT;
|
Chris@16
|
686
|
Chris@16
|
687 // iterators
|
Chris@16
|
688
|
Chris@16
|
689 iterator begin() BOOST_NOEXCEPT
|
Chris@16
|
690 {
|
Chris@16
|
691 return table_.begin();
|
Chris@16
|
692 }
|
Chris@16
|
693
|
Chris@16
|
694 const_iterator begin() const BOOST_NOEXCEPT
|
Chris@16
|
695 {
|
Chris@16
|
696 return table_.begin();
|
Chris@16
|
697 }
|
Chris@16
|
698
|
Chris@16
|
699 iterator end() BOOST_NOEXCEPT
|
Chris@16
|
700 {
|
Chris@16
|
701 return iterator();
|
Chris@16
|
702 }
|
Chris@16
|
703
|
Chris@16
|
704 const_iterator end() const BOOST_NOEXCEPT
|
Chris@16
|
705 {
|
Chris@16
|
706 return const_iterator();
|
Chris@16
|
707 }
|
Chris@16
|
708
|
Chris@16
|
709 const_iterator cbegin() const BOOST_NOEXCEPT
|
Chris@16
|
710 {
|
Chris@16
|
711 return table_.begin();
|
Chris@16
|
712 }
|
Chris@16
|
713
|
Chris@16
|
714 const_iterator cend() const BOOST_NOEXCEPT
|
Chris@16
|
715 {
|
Chris@16
|
716 return const_iterator();
|
Chris@16
|
717 }
|
Chris@16
|
718
|
Chris@16
|
719 // emplace
|
Chris@16
|
720
|
Chris@16
|
721 #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
Chris@16
|
722 template <class... Args>
|
Chris@16
|
723 iterator emplace(BOOST_FWD_REF(Args)... args)
|
Chris@16
|
724 {
|
Chris@16
|
725 return table_.emplace(boost::forward<Args>(args)...);
|
Chris@16
|
726 }
|
Chris@16
|
727
|
Chris@16
|
728 template <class... Args>
|
Chris@16
|
729 iterator emplace_hint(const_iterator, BOOST_FWD_REF(Args)... args)
|
Chris@16
|
730 {
|
Chris@16
|
731 return table_.emplace(boost::forward<Args>(args)...);
|
Chris@16
|
732 }
|
Chris@16
|
733 #else
|
Chris@16
|
734
|
Chris@16
|
735 #if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x5100))
|
Chris@16
|
736
|
Chris@16
|
737 // 0 argument emplace requires special treatment in case
|
Chris@16
|
738 // the container is instantiated with a value type that
|
Chris@16
|
739 // doesn't have a default constructor.
|
Chris@16
|
740
|
Chris@16
|
741 iterator emplace(
|
Chris@16
|
742 boost::unordered::detail::empty_emplace
|
Chris@16
|
743 = boost::unordered::detail::empty_emplace(),
|
Chris@16
|
744 value_type v = value_type())
|
Chris@16
|
745 {
|
Chris@16
|
746 return this->emplace(boost::move(v));
|
Chris@16
|
747 }
|
Chris@16
|
748
|
Chris@16
|
749 iterator emplace_hint(const_iterator hint,
|
Chris@16
|
750 boost::unordered::detail::empty_emplace
|
Chris@16
|
751 = boost::unordered::detail::empty_emplace(),
|
Chris@16
|
752 value_type v = value_type()
|
Chris@16
|
753 )
|
Chris@16
|
754 {
|
Chris@16
|
755 return this->emplace_hint(hint, boost::move(v));
|
Chris@16
|
756 }
|
Chris@16
|
757
|
Chris@16
|
758 #endif
|
Chris@16
|
759
|
Chris@16
|
760 template <typename A0>
|
Chris@16
|
761 iterator emplace(BOOST_FWD_REF(A0) a0)
|
Chris@16
|
762 {
|
Chris@16
|
763 return table_.emplace(
|
Chris@16
|
764 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
765 boost::forward<A0>(a0))
|
Chris@16
|
766 );
|
Chris@16
|
767 }
|
Chris@16
|
768
|
Chris@16
|
769 template <typename A0>
|
Chris@16
|
770 iterator emplace_hint(const_iterator, BOOST_FWD_REF(A0) a0)
|
Chris@16
|
771 {
|
Chris@16
|
772 return table_.emplace(
|
Chris@16
|
773 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
774 boost::forward<A0>(a0))
|
Chris@16
|
775 );
|
Chris@16
|
776 }
|
Chris@16
|
777
|
Chris@16
|
778 template <typename A0, typename A1>
|
Chris@16
|
779 iterator emplace(
|
Chris@16
|
780 BOOST_FWD_REF(A0) a0,
|
Chris@16
|
781 BOOST_FWD_REF(A1) a1)
|
Chris@16
|
782 {
|
Chris@16
|
783 return table_.emplace(
|
Chris@16
|
784 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
785 boost::forward<A0>(a0),
|
Chris@16
|
786 boost::forward<A1>(a1))
|
Chris@16
|
787 );
|
Chris@16
|
788 }
|
Chris@16
|
789
|
Chris@16
|
790 template <typename A0, typename A1>
|
Chris@16
|
791 iterator emplace_hint(const_iterator,
|
Chris@16
|
792 BOOST_FWD_REF(A0) a0,
|
Chris@16
|
793 BOOST_FWD_REF(A1) a1)
|
Chris@16
|
794 {
|
Chris@16
|
795 return table_.emplace(
|
Chris@16
|
796 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
797 boost::forward<A0>(a0),
|
Chris@16
|
798 boost::forward<A1>(a1))
|
Chris@16
|
799 );
|
Chris@16
|
800 }
|
Chris@16
|
801
|
Chris@16
|
802 template <typename A0, typename A1, typename A2>
|
Chris@16
|
803 iterator emplace(
|
Chris@16
|
804 BOOST_FWD_REF(A0) a0,
|
Chris@16
|
805 BOOST_FWD_REF(A1) a1,
|
Chris@16
|
806 BOOST_FWD_REF(A2) a2)
|
Chris@16
|
807 {
|
Chris@16
|
808 return table_.emplace(
|
Chris@16
|
809 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
810 boost::forward<A0>(a0),
|
Chris@16
|
811 boost::forward<A1>(a1),
|
Chris@16
|
812 boost::forward<A2>(a2))
|
Chris@16
|
813 );
|
Chris@16
|
814 }
|
Chris@16
|
815
|
Chris@16
|
816 template <typename A0, typename A1, typename A2>
|
Chris@16
|
817 iterator emplace_hint(const_iterator,
|
Chris@16
|
818 BOOST_FWD_REF(A0) a0,
|
Chris@16
|
819 BOOST_FWD_REF(A1) a1,
|
Chris@16
|
820 BOOST_FWD_REF(A2) a2)
|
Chris@16
|
821 {
|
Chris@16
|
822 return table_.emplace(
|
Chris@16
|
823 boost::unordered::detail::create_emplace_args(
|
Chris@16
|
824 boost::forward<A0>(a0),
|
Chris@16
|
825 boost::forward<A1>(a1),
|
Chris@16
|
826 boost::forward<A2>(a2))
|
Chris@16
|
827 );
|
Chris@16
|
828 }
|
Chris@16
|
829
|
Chris@16
|
830 #define BOOST_UNORDERED_EMPLACE(z, n, _) \
|
Chris@16
|
831 template < \
|
Chris@16
|
832 BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \
|
Chris@16
|
833 > \
|
Chris@16
|
834 iterator emplace( \
|
Chris@16
|
835 BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a) \
|
Chris@16
|
836 ) \
|
Chris@16
|
837 { \
|
Chris@16
|
838 return table_.emplace( \
|
Chris@16
|
839 boost::unordered::detail::create_emplace_args( \
|
Chris@16
|
840 BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, \
|
Chris@16
|
841 a) \
|
Chris@16
|
842 )); \
|
Chris@16
|
843 } \
|
Chris@16
|
844 \
|
Chris@16
|
845 template < \
|
Chris@16
|
846 BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \
|
Chris@16
|
847 > \
|
Chris@16
|
848 iterator emplace_hint( \
|
Chris@16
|
849 const_iterator, \
|
Chris@16
|
850 BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a) \
|
Chris@16
|
851 ) \
|
Chris@16
|
852 { \
|
Chris@16
|
853 return table_.emplace( \
|
Chris@16
|
854 boost::unordered::detail::create_emplace_args( \
|
Chris@16
|
855 BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, \
|
Chris@16
|
856 a) \
|
Chris@16
|
857 )); \
|
Chris@16
|
858 }
|
Chris@16
|
859
|
Chris@16
|
860 BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT,
|
Chris@16
|
861 BOOST_UNORDERED_EMPLACE, _)
|
Chris@16
|
862
|
Chris@16
|
863 #undef BOOST_UNORDERED_EMPLACE
|
Chris@16
|
864
|
Chris@16
|
865 #endif
|
Chris@16
|
866
|
Chris@16
|
867 iterator insert(value_type const& x)
|
Chris@16
|
868 {
|
Chris@16
|
869 return this->emplace(x);
|
Chris@16
|
870 }
|
Chris@16
|
871
|
Chris@16
|
872 iterator insert(BOOST_RV_REF(value_type) x)
|
Chris@16
|
873 {
|
Chris@16
|
874 return this->emplace(boost::move(x));
|
Chris@16
|
875 }
|
Chris@16
|
876
|
Chris@16
|
877 iterator insert(const_iterator hint, value_type const& x)
|
Chris@16
|
878 {
|
Chris@16
|
879 return this->emplace_hint(hint, x);
|
Chris@16
|
880 }
|
Chris@16
|
881
|
Chris@16
|
882 iterator insert(const_iterator hint, BOOST_RV_REF(value_type) x)
|
Chris@16
|
883 {
|
Chris@16
|
884 return this->emplace_hint(hint, boost::move(x));
|
Chris@16
|
885 }
|
Chris@16
|
886
|
Chris@16
|
887 template <class InputIt> void insert(InputIt, InputIt);
|
Chris@16
|
888
|
Chris@16
|
889 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
890 void insert(std::initializer_list<value_type>);
|
Chris@16
|
891 #endif
|
Chris@16
|
892
|
Chris@16
|
893 iterator erase(const_iterator);
|
Chris@16
|
894 size_type erase(const key_type&);
|
Chris@16
|
895 iterator erase(const_iterator, const_iterator);
|
Chris@16
|
896 void quick_erase(const_iterator it) { erase(it); }
|
Chris@16
|
897 void erase_return_void(const_iterator it) { erase(it); }
|
Chris@16
|
898
|
Chris@16
|
899 void clear();
|
Chris@16
|
900 void swap(unordered_multimap&);
|
Chris@16
|
901
|
Chris@16
|
902 // observers
|
Chris@16
|
903
|
Chris@16
|
904 hasher hash_function() const;
|
Chris@16
|
905 key_equal key_eq() const;
|
Chris@16
|
906
|
Chris@16
|
907 // lookup
|
Chris@16
|
908
|
Chris@16
|
909 iterator find(const key_type&);
|
Chris@16
|
910 const_iterator find(const key_type&) const;
|
Chris@16
|
911
|
Chris@16
|
912 template <class CompatibleKey, class CompatibleHash,
|
Chris@16
|
913 class CompatiblePredicate>
|
Chris@16
|
914 iterator find(
|
Chris@16
|
915 CompatibleKey const&,
|
Chris@16
|
916 CompatibleHash const&,
|
Chris@16
|
917 CompatiblePredicate const&);
|
Chris@16
|
918
|
Chris@16
|
919 template <class CompatibleKey, class CompatibleHash,
|
Chris@16
|
920 class CompatiblePredicate>
|
Chris@16
|
921 const_iterator find(
|
Chris@16
|
922 CompatibleKey const&,
|
Chris@16
|
923 CompatibleHash const&,
|
Chris@16
|
924 CompatiblePredicate const&) const;
|
Chris@16
|
925
|
Chris@16
|
926 size_type count(const key_type&) const;
|
Chris@16
|
927
|
Chris@16
|
928 std::pair<iterator, iterator>
|
Chris@16
|
929 equal_range(const key_type&);
|
Chris@16
|
930 std::pair<const_iterator, const_iterator>
|
Chris@16
|
931 equal_range(const key_type&) const;
|
Chris@16
|
932
|
Chris@16
|
933 // bucket interface
|
Chris@16
|
934
|
Chris@16
|
935 size_type bucket_count() const BOOST_NOEXCEPT
|
Chris@16
|
936 {
|
Chris@16
|
937 return table_.bucket_count_;
|
Chris@16
|
938 }
|
Chris@16
|
939
|
Chris@16
|
940 size_type max_bucket_count() const BOOST_NOEXCEPT
|
Chris@16
|
941 {
|
Chris@16
|
942 return table_.max_bucket_count();
|
Chris@16
|
943 }
|
Chris@16
|
944
|
Chris@16
|
945 size_type bucket_size(size_type) const;
|
Chris@16
|
946
|
Chris@16
|
947 size_type bucket(const key_type& k) const
|
Chris@16
|
948 {
|
Chris@16
|
949 return table_.hash_to_bucket(table_.hash(k));
|
Chris@16
|
950 }
|
Chris@16
|
951
|
Chris@16
|
952 local_iterator begin(size_type n)
|
Chris@16
|
953 {
|
Chris@16
|
954 return local_iterator(
|
Chris@16
|
955 table_.begin(n), n, table_.bucket_count_);
|
Chris@16
|
956 }
|
Chris@16
|
957
|
Chris@16
|
958 const_local_iterator begin(size_type n) const
|
Chris@16
|
959 {
|
Chris@16
|
960 return const_local_iterator(
|
Chris@16
|
961 table_.begin(n), n, table_.bucket_count_);
|
Chris@16
|
962 }
|
Chris@16
|
963
|
Chris@16
|
964 local_iterator end(size_type)
|
Chris@16
|
965 {
|
Chris@16
|
966 return local_iterator();
|
Chris@16
|
967 }
|
Chris@16
|
968
|
Chris@16
|
969 const_local_iterator end(size_type) const
|
Chris@16
|
970 {
|
Chris@16
|
971 return const_local_iterator();
|
Chris@16
|
972 }
|
Chris@16
|
973
|
Chris@16
|
974 const_local_iterator cbegin(size_type n) const
|
Chris@16
|
975 {
|
Chris@16
|
976 return const_local_iterator(
|
Chris@16
|
977 table_.begin(n), n, table_.bucket_count_);
|
Chris@16
|
978 }
|
Chris@16
|
979
|
Chris@16
|
980 const_local_iterator cend(size_type) const
|
Chris@16
|
981 {
|
Chris@16
|
982 return const_local_iterator();
|
Chris@16
|
983 }
|
Chris@16
|
984
|
Chris@16
|
985 // hash policy
|
Chris@16
|
986
|
Chris@16
|
987 float max_load_factor() const BOOST_NOEXCEPT
|
Chris@16
|
988 {
|
Chris@16
|
989 return table_.mlf_;
|
Chris@16
|
990 }
|
Chris@16
|
991
|
Chris@16
|
992 float load_factor() const BOOST_NOEXCEPT;
|
Chris@16
|
993 void max_load_factor(float) BOOST_NOEXCEPT;
|
Chris@16
|
994 void rehash(size_type);
|
Chris@16
|
995 void reserve(size_type);
|
Chris@16
|
996
|
Chris@16
|
997 #if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582)
|
Chris@16
|
998 friend bool operator==<K,T,H,P,A>(
|
Chris@16
|
999 unordered_multimap const&, unordered_multimap const&);
|
Chris@16
|
1000 friend bool operator!=<K,T,H,P,A>(
|
Chris@16
|
1001 unordered_multimap const&, unordered_multimap const&);
|
Chris@16
|
1002 #endif
|
Chris@16
|
1003 }; // class template unordered_multimap
|
Chris@16
|
1004
|
Chris@16
|
1005 ////////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
1006
|
Chris@16
|
1007 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1008 unordered_map<K,T,H,P,A>::unordered_map(
|
Chris@16
|
1009 size_type n, const hasher &hf, const key_equal &eql,
|
Chris@16
|
1010 const allocator_type &a)
|
Chris@16
|
1011 : table_(n, hf, eql, a)
|
Chris@16
|
1012 {
|
Chris@16
|
1013 }
|
Chris@16
|
1014
|
Chris@16
|
1015 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1016 unordered_map<K,T,H,P,A>::unordered_map(allocator_type const& a)
|
Chris@16
|
1017 : table_(boost::unordered::detail::default_bucket_count,
|
Chris@16
|
1018 hasher(), key_equal(), a)
|
Chris@16
|
1019 {
|
Chris@16
|
1020 }
|
Chris@16
|
1021
|
Chris@16
|
1022 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1023 unordered_map<K,T,H,P,A>::unordered_map(
|
Chris@16
|
1024 unordered_map const& other, allocator_type const& a)
|
Chris@16
|
1025 : table_(other.table_, a)
|
Chris@16
|
1026 {
|
Chris@16
|
1027 }
|
Chris@16
|
1028
|
Chris@16
|
1029 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1030 template <class InputIt>
|
Chris@16
|
1031 unordered_map<K,T,H,P,A>::unordered_map(InputIt f, InputIt l)
|
Chris@16
|
1032 : table_(boost::unordered::detail::initial_size(f, l),
|
Chris@16
|
1033 hasher(), key_equal(), allocator_type())
|
Chris@16
|
1034 {
|
Chris@16
|
1035 table_.insert_range(f, l);
|
Chris@16
|
1036 }
|
Chris@16
|
1037
|
Chris@16
|
1038 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1039 template <class InputIt>
|
Chris@16
|
1040 unordered_map<K,T,H,P,A>::unordered_map(
|
Chris@16
|
1041 InputIt f, InputIt l,
|
Chris@16
|
1042 size_type n,
|
Chris@16
|
1043 const hasher &hf,
|
Chris@16
|
1044 const key_equal &eql)
|
Chris@16
|
1045 : table_(boost::unordered::detail::initial_size(f, l, n),
|
Chris@16
|
1046 hf, eql, allocator_type())
|
Chris@16
|
1047 {
|
Chris@16
|
1048 table_.insert_range(f, l);
|
Chris@16
|
1049 }
|
Chris@16
|
1050
|
Chris@16
|
1051 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1052 template <class InputIt>
|
Chris@16
|
1053 unordered_map<K,T,H,P,A>::unordered_map(
|
Chris@16
|
1054 InputIt f, InputIt l,
|
Chris@16
|
1055 size_type n,
|
Chris@16
|
1056 const hasher &hf,
|
Chris@16
|
1057 const key_equal &eql,
|
Chris@16
|
1058 const allocator_type &a)
|
Chris@16
|
1059 : table_(boost::unordered::detail::initial_size(f, l, n), hf, eql, a)
|
Chris@16
|
1060 {
|
Chris@16
|
1061 table_.insert_range(f, l);
|
Chris@16
|
1062 }
|
Chris@16
|
1063
|
Chris@16
|
1064 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1065 unordered_map<K,T,H,P,A>::~unordered_map() BOOST_NOEXCEPT {}
|
Chris@16
|
1066
|
Chris@16
|
1067 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1068 unordered_map<K,T,H,P,A>::unordered_map(
|
Chris@16
|
1069 unordered_map const& other)
|
Chris@16
|
1070 : table_(other.table_)
|
Chris@16
|
1071 {
|
Chris@16
|
1072 }
|
Chris@16
|
1073
|
Chris@16
|
1074 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
Chris@16
|
1075
|
Chris@16
|
1076 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1077 unordered_map<K,T,H,P,A>::unordered_map(
|
Chris@16
|
1078 unordered_map&& other, allocator_type const& a)
|
Chris@16
|
1079 : table_(other.table_, a, boost::unordered::detail::move_tag())
|
Chris@16
|
1080 {
|
Chris@16
|
1081 }
|
Chris@16
|
1082
|
Chris@16
|
1083 #endif
|
Chris@16
|
1084
|
Chris@16
|
1085 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
1086
|
Chris@16
|
1087 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1088 unordered_map<K,T,H,P,A>::unordered_map(
|
Chris@16
|
1089 std::initializer_list<value_type> list, size_type n,
|
Chris@16
|
1090 const hasher &hf, const key_equal &eql, const allocator_type &a)
|
Chris@16
|
1091 : table_(
|
Chris@16
|
1092 boost::unordered::detail::initial_size(
|
Chris@16
|
1093 list.begin(), list.end(), n),
|
Chris@16
|
1094 hf, eql, a)
|
Chris@16
|
1095 {
|
Chris@16
|
1096 table_.insert_range(list.begin(), list.end());
|
Chris@16
|
1097 }
|
Chris@16
|
1098
|
Chris@16
|
1099 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1100 unordered_map<K,T,H,P,A>& unordered_map<K,T,H,P,A>::operator=(
|
Chris@16
|
1101 std::initializer_list<value_type> list)
|
Chris@16
|
1102 {
|
Chris@16
|
1103 table_.clear();
|
Chris@16
|
1104 table_.insert_range(list.begin(), list.end());
|
Chris@16
|
1105 return *this;
|
Chris@16
|
1106 }
|
Chris@16
|
1107
|
Chris@16
|
1108 #endif
|
Chris@16
|
1109
|
Chris@16
|
1110 // size and capacity
|
Chris@16
|
1111
|
Chris@16
|
1112 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1113 std::size_t unordered_map<K,T,H,P,A>::max_size() const BOOST_NOEXCEPT
|
Chris@16
|
1114 {
|
Chris@16
|
1115 return table_.max_size();
|
Chris@16
|
1116 }
|
Chris@16
|
1117
|
Chris@16
|
1118 // modifiers
|
Chris@16
|
1119
|
Chris@16
|
1120 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1121 template <class InputIt>
|
Chris@16
|
1122 void unordered_map<K,T,H,P,A>::insert(InputIt first, InputIt last)
|
Chris@16
|
1123 {
|
Chris@16
|
1124 table_.insert_range(first, last);
|
Chris@16
|
1125 }
|
Chris@16
|
1126
|
Chris@16
|
1127 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
1128 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1129 void unordered_map<K,T,H,P,A>::insert(
|
Chris@16
|
1130 std::initializer_list<value_type> list)
|
Chris@16
|
1131 {
|
Chris@16
|
1132 table_.insert_range(list.begin(), list.end());
|
Chris@16
|
1133 }
|
Chris@16
|
1134 #endif
|
Chris@16
|
1135
|
Chris@16
|
1136 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1137 typename unordered_map<K,T,H,P,A>::iterator
|
Chris@16
|
1138 unordered_map<K,T,H,P,A>::erase(const_iterator position)
|
Chris@16
|
1139 {
|
Chris@16
|
1140 return table_.erase(position);
|
Chris@16
|
1141 }
|
Chris@16
|
1142
|
Chris@16
|
1143 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1144 typename unordered_map<K,T,H,P,A>::size_type
|
Chris@16
|
1145 unordered_map<K,T,H,P,A>::erase(const key_type& k)
|
Chris@16
|
1146 {
|
Chris@16
|
1147 return table_.erase_key(k);
|
Chris@16
|
1148 }
|
Chris@16
|
1149
|
Chris@16
|
1150 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1151 typename unordered_map<K,T,H,P,A>::iterator
|
Chris@16
|
1152 unordered_map<K,T,H,P,A>::erase(
|
Chris@16
|
1153 const_iterator first, const_iterator last)
|
Chris@16
|
1154 {
|
Chris@16
|
1155 return table_.erase_range(first, last);
|
Chris@16
|
1156 }
|
Chris@16
|
1157
|
Chris@16
|
1158 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1159 void unordered_map<K,T,H,P,A>::clear()
|
Chris@16
|
1160 {
|
Chris@16
|
1161 table_.clear();
|
Chris@16
|
1162 }
|
Chris@16
|
1163
|
Chris@16
|
1164 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1165 void unordered_map<K,T,H,P,A>::swap(unordered_map& other)
|
Chris@16
|
1166 {
|
Chris@16
|
1167 table_.swap(other.table_);
|
Chris@16
|
1168 }
|
Chris@16
|
1169
|
Chris@16
|
1170 // observers
|
Chris@16
|
1171
|
Chris@16
|
1172 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1173 typename unordered_map<K,T,H,P,A>::hasher
|
Chris@16
|
1174 unordered_map<K,T,H,P,A>::hash_function() const
|
Chris@16
|
1175 {
|
Chris@16
|
1176 return table_.hash_function();
|
Chris@16
|
1177 }
|
Chris@16
|
1178
|
Chris@16
|
1179 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1180 typename unordered_map<K,T,H,P,A>::key_equal
|
Chris@16
|
1181 unordered_map<K,T,H,P,A>::key_eq() const
|
Chris@16
|
1182 {
|
Chris@16
|
1183 return table_.key_eq();
|
Chris@16
|
1184 }
|
Chris@16
|
1185
|
Chris@16
|
1186 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1187 typename unordered_map<K,T,H,P,A>::mapped_type&
|
Chris@16
|
1188 unordered_map<K,T,H,P,A>::operator[](const key_type &k)
|
Chris@16
|
1189 {
|
Chris@16
|
1190 return table_[k].second;
|
Chris@16
|
1191 }
|
Chris@16
|
1192
|
Chris@16
|
1193 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1194 typename unordered_map<K,T,H,P,A>::mapped_type&
|
Chris@16
|
1195 unordered_map<K,T,H,P,A>::at(const key_type& k)
|
Chris@16
|
1196 {
|
Chris@16
|
1197 return table_.at(k).second;
|
Chris@16
|
1198 }
|
Chris@16
|
1199
|
Chris@16
|
1200 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1201 typename unordered_map<K,T,H,P,A>::mapped_type const&
|
Chris@16
|
1202 unordered_map<K,T,H,P,A>::at(const key_type& k) const
|
Chris@16
|
1203 {
|
Chris@16
|
1204 return table_.at(k).second;
|
Chris@16
|
1205 }
|
Chris@16
|
1206
|
Chris@16
|
1207 // lookup
|
Chris@16
|
1208
|
Chris@16
|
1209 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1210 typename unordered_map<K,T,H,P,A>::iterator
|
Chris@16
|
1211 unordered_map<K,T,H,P,A>::find(const key_type& k)
|
Chris@16
|
1212 {
|
Chris@16
|
1213 return table_.find_node(k);
|
Chris@16
|
1214 }
|
Chris@16
|
1215
|
Chris@16
|
1216 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1217 typename unordered_map<K,T,H,P,A>::const_iterator
|
Chris@16
|
1218 unordered_map<K,T,H,P,A>::find(const key_type& k) const
|
Chris@16
|
1219 {
|
Chris@16
|
1220 return table_.find_node(k);
|
Chris@16
|
1221 }
|
Chris@16
|
1222
|
Chris@16
|
1223 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1224 template <class CompatibleKey, class CompatibleHash,
|
Chris@16
|
1225 class CompatiblePredicate>
|
Chris@16
|
1226 typename unordered_map<K,T,H,P,A>::iterator
|
Chris@16
|
1227 unordered_map<K,T,H,P,A>::find(
|
Chris@16
|
1228 CompatibleKey const& k,
|
Chris@16
|
1229 CompatibleHash const& hash,
|
Chris@16
|
1230 CompatiblePredicate const& eq)
|
Chris@16
|
1231 {
|
Chris@16
|
1232 return table_.generic_find_node(k, hash, eq);
|
Chris@16
|
1233 }
|
Chris@16
|
1234
|
Chris@16
|
1235 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1236 template <class CompatibleKey, class CompatibleHash,
|
Chris@16
|
1237 class CompatiblePredicate>
|
Chris@16
|
1238 typename unordered_map<K,T,H,P,A>::const_iterator
|
Chris@16
|
1239 unordered_map<K,T,H,P,A>::find(
|
Chris@16
|
1240 CompatibleKey const& k,
|
Chris@16
|
1241 CompatibleHash const& hash,
|
Chris@16
|
1242 CompatiblePredicate const& eq) const
|
Chris@16
|
1243 {
|
Chris@16
|
1244 return table_.generic_find_node(k, hash, eq);
|
Chris@16
|
1245 }
|
Chris@16
|
1246
|
Chris@16
|
1247 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1248 typename unordered_map<K,T,H,P,A>::size_type
|
Chris@16
|
1249 unordered_map<K,T,H,P,A>::count(const key_type& k) const
|
Chris@16
|
1250 {
|
Chris@16
|
1251 return table_.count(k);
|
Chris@16
|
1252 }
|
Chris@16
|
1253
|
Chris@16
|
1254 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1255 std::pair<
|
Chris@16
|
1256 typename unordered_map<K,T,H,P,A>::iterator,
|
Chris@16
|
1257 typename unordered_map<K,T,H,P,A>::iterator>
|
Chris@16
|
1258 unordered_map<K,T,H,P,A>::equal_range(const key_type& k)
|
Chris@16
|
1259 {
|
Chris@16
|
1260 return table_.equal_range(k);
|
Chris@16
|
1261 }
|
Chris@16
|
1262
|
Chris@16
|
1263 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1264 std::pair<
|
Chris@16
|
1265 typename unordered_map<K,T,H,P,A>::const_iterator,
|
Chris@16
|
1266 typename unordered_map<K,T,H,P,A>::const_iterator>
|
Chris@16
|
1267 unordered_map<K,T,H,P,A>::equal_range(const key_type& k) const
|
Chris@16
|
1268 {
|
Chris@16
|
1269 return table_.equal_range(k);
|
Chris@16
|
1270 }
|
Chris@16
|
1271
|
Chris@16
|
1272 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1273 typename unordered_map<K,T,H,P,A>::size_type
|
Chris@16
|
1274 unordered_map<K,T,H,P,A>::bucket_size(size_type n) const
|
Chris@16
|
1275 {
|
Chris@16
|
1276 return table_.bucket_size(n);
|
Chris@16
|
1277 }
|
Chris@16
|
1278
|
Chris@16
|
1279 // hash policy
|
Chris@16
|
1280
|
Chris@16
|
1281 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1282 float unordered_map<K,T,H,P,A>::load_factor() const BOOST_NOEXCEPT
|
Chris@16
|
1283 {
|
Chris@16
|
1284 return table_.load_factor();
|
Chris@16
|
1285 }
|
Chris@16
|
1286
|
Chris@16
|
1287 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1288 void unordered_map<K,T,H,P,A>::max_load_factor(float m) BOOST_NOEXCEPT
|
Chris@16
|
1289 {
|
Chris@16
|
1290 table_.max_load_factor(m);
|
Chris@16
|
1291 }
|
Chris@16
|
1292
|
Chris@16
|
1293 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1294 void unordered_map<K,T,H,P,A>::rehash(size_type n)
|
Chris@16
|
1295 {
|
Chris@16
|
1296 table_.rehash(n);
|
Chris@16
|
1297 }
|
Chris@16
|
1298
|
Chris@16
|
1299 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1300 void unordered_map<K,T,H,P,A>::reserve(size_type n)
|
Chris@16
|
1301 {
|
Chris@16
|
1302 table_.reserve(n);
|
Chris@16
|
1303 }
|
Chris@16
|
1304
|
Chris@16
|
1305 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1306 inline bool operator==(
|
Chris@16
|
1307 unordered_map<K,T,H,P,A> const& m1,
|
Chris@16
|
1308 unordered_map<K,T,H,P,A> const& m2)
|
Chris@16
|
1309 {
|
Chris@16
|
1310 #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613))
|
Chris@16
|
1311 struct dummy { unordered_map<K,T,H,P,A> x; };
|
Chris@16
|
1312 #endif
|
Chris@16
|
1313 return m1.table_.equals(m2.table_);
|
Chris@16
|
1314 }
|
Chris@16
|
1315
|
Chris@16
|
1316 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1317 inline bool operator!=(
|
Chris@16
|
1318 unordered_map<K,T,H,P,A> const& m1,
|
Chris@16
|
1319 unordered_map<K,T,H,P,A> const& m2)
|
Chris@16
|
1320 {
|
Chris@16
|
1321 #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613))
|
Chris@16
|
1322 struct dummy { unordered_map<K,T,H,P,A> x; };
|
Chris@16
|
1323 #endif
|
Chris@16
|
1324 return !m1.table_.equals(m2.table_);
|
Chris@16
|
1325 }
|
Chris@16
|
1326
|
Chris@16
|
1327 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1328 inline void swap(
|
Chris@16
|
1329 unordered_map<K,T,H,P,A> &m1,
|
Chris@16
|
1330 unordered_map<K,T,H,P,A> &m2)
|
Chris@16
|
1331 {
|
Chris@16
|
1332 #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613))
|
Chris@16
|
1333 struct dummy { unordered_map<K,T,H,P,A> x; };
|
Chris@16
|
1334 #endif
|
Chris@16
|
1335 m1.swap(m2);
|
Chris@16
|
1336 }
|
Chris@16
|
1337
|
Chris@16
|
1338 ////////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
1339
|
Chris@16
|
1340 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1341 unordered_multimap<K,T,H,P,A>::unordered_multimap(
|
Chris@16
|
1342 size_type n, const hasher &hf, const key_equal &eql,
|
Chris@16
|
1343 const allocator_type &a)
|
Chris@16
|
1344 : table_(n, hf, eql, a)
|
Chris@16
|
1345 {
|
Chris@16
|
1346 }
|
Chris@16
|
1347
|
Chris@16
|
1348 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1349 unordered_multimap<K,T,H,P,A>::unordered_multimap(allocator_type const& a)
|
Chris@16
|
1350 : table_(boost::unordered::detail::default_bucket_count,
|
Chris@16
|
1351 hasher(), key_equal(), a)
|
Chris@16
|
1352 {
|
Chris@16
|
1353 }
|
Chris@16
|
1354
|
Chris@16
|
1355 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1356 unordered_multimap<K,T,H,P,A>::unordered_multimap(
|
Chris@16
|
1357 unordered_multimap const& other, allocator_type const& a)
|
Chris@16
|
1358 : table_(other.table_, a)
|
Chris@16
|
1359 {
|
Chris@16
|
1360 }
|
Chris@16
|
1361
|
Chris@16
|
1362 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1363 template <class InputIt>
|
Chris@16
|
1364 unordered_multimap<K,T,H,P,A>::unordered_multimap(InputIt f, InputIt l)
|
Chris@16
|
1365 : table_(boost::unordered::detail::initial_size(f, l),
|
Chris@16
|
1366 hasher(), key_equal(), allocator_type())
|
Chris@16
|
1367 {
|
Chris@16
|
1368 table_.insert_range(f, l);
|
Chris@16
|
1369 }
|
Chris@16
|
1370
|
Chris@16
|
1371 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1372 template <class InputIt>
|
Chris@16
|
1373 unordered_multimap<K,T,H,P,A>::unordered_multimap(
|
Chris@16
|
1374 InputIt f, InputIt l,
|
Chris@16
|
1375 size_type n,
|
Chris@16
|
1376 const hasher &hf,
|
Chris@16
|
1377 const key_equal &eql)
|
Chris@16
|
1378 : table_(boost::unordered::detail::initial_size(f, l, n),
|
Chris@16
|
1379 hf, eql, allocator_type())
|
Chris@16
|
1380 {
|
Chris@16
|
1381 table_.insert_range(f, l);
|
Chris@16
|
1382 }
|
Chris@16
|
1383
|
Chris@16
|
1384 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1385 template <class InputIt>
|
Chris@16
|
1386 unordered_multimap<K,T,H,P,A>::unordered_multimap(
|
Chris@16
|
1387 InputIt f, InputIt l,
|
Chris@16
|
1388 size_type n,
|
Chris@16
|
1389 const hasher &hf,
|
Chris@16
|
1390 const key_equal &eql,
|
Chris@16
|
1391 const allocator_type &a)
|
Chris@16
|
1392 : table_(boost::unordered::detail::initial_size(f, l, n), hf, eql, a)
|
Chris@16
|
1393 {
|
Chris@16
|
1394 table_.insert_range(f, l);
|
Chris@16
|
1395 }
|
Chris@16
|
1396
|
Chris@16
|
1397 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1398 unordered_multimap<K,T,H,P,A>::~unordered_multimap() BOOST_NOEXCEPT {}
|
Chris@16
|
1399
|
Chris@16
|
1400 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1401 unordered_multimap<K,T,H,P,A>::unordered_multimap(
|
Chris@16
|
1402 unordered_multimap const& other)
|
Chris@16
|
1403 : table_(other.table_)
|
Chris@16
|
1404 {
|
Chris@16
|
1405 }
|
Chris@16
|
1406
|
Chris@16
|
1407 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
Chris@16
|
1408
|
Chris@16
|
1409 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1410 unordered_multimap<K,T,H,P,A>::unordered_multimap(
|
Chris@16
|
1411 unordered_multimap&& other, allocator_type const& a)
|
Chris@16
|
1412 : table_(other.table_, a, boost::unordered::detail::move_tag())
|
Chris@16
|
1413 {
|
Chris@16
|
1414 }
|
Chris@16
|
1415
|
Chris@16
|
1416 #endif
|
Chris@16
|
1417
|
Chris@16
|
1418 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
1419
|
Chris@16
|
1420 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1421 unordered_multimap<K,T,H,P,A>::unordered_multimap(
|
Chris@16
|
1422 std::initializer_list<value_type> list, size_type n,
|
Chris@16
|
1423 const hasher &hf, const key_equal &eql, const allocator_type &a)
|
Chris@16
|
1424 : table_(
|
Chris@16
|
1425 boost::unordered::detail::initial_size(
|
Chris@16
|
1426 list.begin(), list.end(), n),
|
Chris@16
|
1427 hf, eql, a)
|
Chris@16
|
1428 {
|
Chris@16
|
1429 table_.insert_range(list.begin(), list.end());
|
Chris@16
|
1430 }
|
Chris@16
|
1431
|
Chris@16
|
1432 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1433 unordered_multimap<K,T,H,P,A>& unordered_multimap<K,T,H,P,A>::operator=(
|
Chris@16
|
1434 std::initializer_list<value_type> list)
|
Chris@16
|
1435 {
|
Chris@16
|
1436 table_.clear();
|
Chris@16
|
1437 table_.insert_range(list.begin(), list.end());
|
Chris@16
|
1438 return *this;
|
Chris@16
|
1439 }
|
Chris@16
|
1440
|
Chris@16
|
1441 #endif
|
Chris@16
|
1442
|
Chris@16
|
1443 // size and capacity
|
Chris@16
|
1444
|
Chris@16
|
1445 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1446 std::size_t unordered_multimap<K,T,H,P,A>::max_size() const BOOST_NOEXCEPT
|
Chris@16
|
1447 {
|
Chris@16
|
1448 return table_.max_size();
|
Chris@16
|
1449 }
|
Chris@16
|
1450
|
Chris@16
|
1451 // modifiers
|
Chris@16
|
1452
|
Chris@16
|
1453 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1454 template <class InputIt>
|
Chris@16
|
1455 void unordered_multimap<K,T,H,P,A>::insert(InputIt first, InputIt last)
|
Chris@16
|
1456 {
|
Chris@16
|
1457 table_.insert_range(first, last);
|
Chris@16
|
1458 }
|
Chris@16
|
1459
|
Chris@16
|
1460 #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
|
Chris@16
|
1461 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1462 void unordered_multimap<K,T,H,P,A>::insert(
|
Chris@16
|
1463 std::initializer_list<value_type> list)
|
Chris@16
|
1464 {
|
Chris@16
|
1465 table_.insert_range(list.begin(), list.end());
|
Chris@16
|
1466 }
|
Chris@16
|
1467 #endif
|
Chris@16
|
1468
|
Chris@16
|
1469 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1470 typename unordered_multimap<K,T,H,P,A>::iterator
|
Chris@16
|
1471 unordered_multimap<K,T,H,P,A>::erase(const_iterator position)
|
Chris@16
|
1472 {
|
Chris@16
|
1473 return table_.erase(position);
|
Chris@16
|
1474 }
|
Chris@16
|
1475
|
Chris@16
|
1476 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1477 typename unordered_multimap<K,T,H,P,A>::size_type
|
Chris@16
|
1478 unordered_multimap<K,T,H,P,A>::erase(const key_type& k)
|
Chris@16
|
1479 {
|
Chris@16
|
1480 return table_.erase_key(k);
|
Chris@16
|
1481 }
|
Chris@16
|
1482
|
Chris@16
|
1483 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1484 typename unordered_multimap<K,T,H,P,A>::iterator
|
Chris@16
|
1485 unordered_multimap<K,T,H,P,A>::erase(
|
Chris@16
|
1486 const_iterator first, const_iterator last)
|
Chris@16
|
1487 {
|
Chris@16
|
1488 return table_.erase_range(first, last);
|
Chris@16
|
1489 }
|
Chris@16
|
1490
|
Chris@16
|
1491 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1492 void unordered_multimap<K,T,H,P,A>::clear()
|
Chris@16
|
1493 {
|
Chris@16
|
1494 table_.clear();
|
Chris@16
|
1495 }
|
Chris@16
|
1496
|
Chris@16
|
1497 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1498 void unordered_multimap<K,T,H,P,A>::swap(unordered_multimap& other)
|
Chris@16
|
1499 {
|
Chris@16
|
1500 table_.swap(other.table_);
|
Chris@16
|
1501 }
|
Chris@16
|
1502
|
Chris@16
|
1503 // observers
|
Chris@16
|
1504
|
Chris@16
|
1505 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1506 typename unordered_multimap<K,T,H,P,A>::hasher
|
Chris@16
|
1507 unordered_multimap<K,T,H,P,A>::hash_function() const
|
Chris@16
|
1508 {
|
Chris@16
|
1509 return table_.hash_function();
|
Chris@16
|
1510 }
|
Chris@16
|
1511
|
Chris@16
|
1512 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1513 typename unordered_multimap<K,T,H,P,A>::key_equal
|
Chris@16
|
1514 unordered_multimap<K,T,H,P,A>::key_eq() const
|
Chris@16
|
1515 {
|
Chris@16
|
1516 return table_.key_eq();
|
Chris@16
|
1517 }
|
Chris@16
|
1518
|
Chris@16
|
1519 // lookup
|
Chris@16
|
1520
|
Chris@16
|
1521 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1522 typename unordered_multimap<K,T,H,P,A>::iterator
|
Chris@16
|
1523 unordered_multimap<K,T,H,P,A>::find(const key_type& k)
|
Chris@16
|
1524 {
|
Chris@16
|
1525 return table_.find_node(k);
|
Chris@16
|
1526 }
|
Chris@16
|
1527
|
Chris@16
|
1528 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1529 typename unordered_multimap<K,T,H,P,A>::const_iterator
|
Chris@16
|
1530 unordered_multimap<K,T,H,P,A>::find(const key_type& k) const
|
Chris@16
|
1531 {
|
Chris@16
|
1532 return table_.find_node(k);
|
Chris@16
|
1533 }
|
Chris@16
|
1534
|
Chris@16
|
1535 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1536 template <class CompatibleKey, class CompatibleHash,
|
Chris@16
|
1537 class CompatiblePredicate>
|
Chris@16
|
1538 typename unordered_multimap<K,T,H,P,A>::iterator
|
Chris@16
|
1539 unordered_multimap<K,T,H,P,A>::find(
|
Chris@16
|
1540 CompatibleKey const& k,
|
Chris@16
|
1541 CompatibleHash const& hash,
|
Chris@16
|
1542 CompatiblePredicate const& eq)
|
Chris@16
|
1543 {
|
Chris@16
|
1544 return table_.generic_find_node(k, hash, eq);
|
Chris@16
|
1545 }
|
Chris@16
|
1546
|
Chris@16
|
1547 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1548 template <class CompatibleKey, class CompatibleHash,
|
Chris@16
|
1549 class CompatiblePredicate>
|
Chris@16
|
1550 typename unordered_multimap<K,T,H,P,A>::const_iterator
|
Chris@16
|
1551 unordered_multimap<K,T,H,P,A>::find(
|
Chris@16
|
1552 CompatibleKey const& k,
|
Chris@16
|
1553 CompatibleHash const& hash,
|
Chris@16
|
1554 CompatiblePredicate const& eq) const
|
Chris@16
|
1555 {
|
Chris@16
|
1556 return table_.generic_find_node(k, hash, eq);
|
Chris@16
|
1557 }
|
Chris@16
|
1558
|
Chris@16
|
1559 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1560 typename unordered_multimap<K,T,H,P,A>::size_type
|
Chris@16
|
1561 unordered_multimap<K,T,H,P,A>::count(const key_type& k) const
|
Chris@16
|
1562 {
|
Chris@16
|
1563 return table_.count(k);
|
Chris@16
|
1564 }
|
Chris@16
|
1565
|
Chris@16
|
1566 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1567 std::pair<
|
Chris@16
|
1568 typename unordered_multimap<K,T,H,P,A>::iterator,
|
Chris@16
|
1569 typename unordered_multimap<K,T,H,P,A>::iterator>
|
Chris@16
|
1570 unordered_multimap<K,T,H,P,A>::equal_range(const key_type& k)
|
Chris@16
|
1571 {
|
Chris@16
|
1572 return table_.equal_range(k);
|
Chris@16
|
1573 }
|
Chris@16
|
1574
|
Chris@16
|
1575 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1576 std::pair<
|
Chris@16
|
1577 typename unordered_multimap<K,T,H,P,A>::const_iterator,
|
Chris@16
|
1578 typename unordered_multimap<K,T,H,P,A>::const_iterator>
|
Chris@16
|
1579 unordered_multimap<K,T,H,P,A>::equal_range(const key_type& k) const
|
Chris@16
|
1580 {
|
Chris@16
|
1581 return table_.equal_range(k);
|
Chris@16
|
1582 }
|
Chris@16
|
1583
|
Chris@16
|
1584 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1585 typename unordered_multimap<K,T,H,P,A>::size_type
|
Chris@16
|
1586 unordered_multimap<K,T,H,P,A>::bucket_size(size_type n) const
|
Chris@16
|
1587 {
|
Chris@16
|
1588 return table_.bucket_size(n);
|
Chris@16
|
1589 }
|
Chris@16
|
1590
|
Chris@16
|
1591 // hash policy
|
Chris@16
|
1592
|
Chris@16
|
1593 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1594 float unordered_multimap<K,T,H,P,A>::load_factor() const BOOST_NOEXCEPT
|
Chris@16
|
1595 {
|
Chris@16
|
1596 return table_.load_factor();
|
Chris@16
|
1597 }
|
Chris@16
|
1598
|
Chris@16
|
1599 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1600 void unordered_multimap<K,T,H,P,A>::max_load_factor(float m) BOOST_NOEXCEPT
|
Chris@16
|
1601 {
|
Chris@16
|
1602 table_.max_load_factor(m);
|
Chris@16
|
1603 }
|
Chris@16
|
1604
|
Chris@16
|
1605 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1606 void unordered_multimap<K,T,H,P,A>::rehash(size_type n)
|
Chris@16
|
1607 {
|
Chris@16
|
1608 table_.rehash(n);
|
Chris@16
|
1609 }
|
Chris@16
|
1610
|
Chris@16
|
1611 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1612 void unordered_multimap<K,T,H,P,A>::reserve(size_type n)
|
Chris@16
|
1613 {
|
Chris@16
|
1614 table_.reserve(n);
|
Chris@16
|
1615 }
|
Chris@16
|
1616
|
Chris@16
|
1617 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1618 inline bool operator==(
|
Chris@16
|
1619 unordered_multimap<K,T,H,P,A> const& m1,
|
Chris@16
|
1620 unordered_multimap<K,T,H,P,A> const& m2)
|
Chris@16
|
1621 {
|
Chris@16
|
1622 #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613))
|
Chris@16
|
1623 struct dummy { unordered_multimap<K,T,H,P,A> x; };
|
Chris@16
|
1624 #endif
|
Chris@16
|
1625 return m1.table_.equals(m2.table_);
|
Chris@16
|
1626 }
|
Chris@16
|
1627
|
Chris@16
|
1628 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1629 inline bool operator!=(
|
Chris@16
|
1630 unordered_multimap<K,T,H,P,A> const& m1,
|
Chris@16
|
1631 unordered_multimap<K,T,H,P,A> const& m2)
|
Chris@16
|
1632 {
|
Chris@16
|
1633 #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613))
|
Chris@16
|
1634 struct dummy { unordered_multimap<K,T,H,P,A> x; };
|
Chris@16
|
1635 #endif
|
Chris@16
|
1636 return !m1.table_.equals(m2.table_);
|
Chris@16
|
1637 }
|
Chris@16
|
1638
|
Chris@16
|
1639 template <class K, class T, class H, class P, class A>
|
Chris@16
|
1640 inline void swap(
|
Chris@16
|
1641 unordered_multimap<K,T,H,P,A> &m1,
|
Chris@16
|
1642 unordered_multimap<K,T,H,P,A> &m2)
|
Chris@16
|
1643 {
|
Chris@16
|
1644 #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613))
|
Chris@16
|
1645 struct dummy { unordered_multimap<K,T,H,P,A> x; };
|
Chris@16
|
1646 #endif
|
Chris@16
|
1647 m1.swap(m2);
|
Chris@16
|
1648 }
|
Chris@16
|
1649
|
Chris@16
|
1650 } // namespace unordered
|
Chris@16
|
1651 } // namespace boost
|
Chris@16
|
1652
|
Chris@16
|
1653 #if defined(BOOST_MSVC)
|
Chris@16
|
1654 #pragma warning(pop)
|
Chris@16
|
1655 #endif
|
Chris@16
|
1656
|
Chris@16
|
1657 #endif // BOOST_UNORDERED_UNORDERED_MAP_HPP_INCLUDED
|