annotate DEPENDENCIES/generic/include/boost/unordered/unordered_map.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
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