Chris@16: Chris@16: // Copyright (C) 2003-2004 Jeremy B. Maitin-Shepard. Chris@16: // Copyright (C) 2005-2011 Daniel James. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/unordered for documentation Chris@16: Chris@16: #ifndef BOOST_UNORDERED_UNORDERED_MAP_HPP_INCLUDED Chris@16: #define BOOST_UNORDERED_UNORDERED_MAP_HPP_INCLUDED Chris@16: Chris@101: #include Chris@101: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@101: #pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: #include Chris@16: #endif Chris@16: Chris@16: #if defined(BOOST_MSVC) Chris@16: #pragma warning(push) Chris@16: #if BOOST_MSVC >= 1400 Chris@16: #pragma warning(disable:4396) //the inline specifier cannot be used when a Chris@16: // friend declaration refers to a specialization Chris@16: // of a function template Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace unordered Chris@16: { Chris@16: template Chris@16: class unordered_map Chris@16: { Chris@16: #if defined(BOOST_UNORDERED_USE_MOVE) Chris@16: BOOST_COPYABLE_AND_MOVABLE(unordered_map) Chris@16: #endif Chris@16: Chris@16: public: Chris@16: Chris@16: typedef K key_type; Chris@16: typedef std::pair value_type; Chris@16: typedef T mapped_type; Chris@16: typedef H hasher; Chris@16: typedef P key_equal; Chris@16: typedef A allocator_type; Chris@16: Chris@16: private: Chris@16: Chris@16: typedef boost::unordered::detail::map types; Chris@16: typedef typename types::traits allocator_traits; Chris@16: typedef typename types::table table; Chris@16: Chris@16: public: Chris@16: Chris@16: typedef typename allocator_traits::pointer pointer; Chris@16: typedef typename allocator_traits::const_pointer const_pointer; Chris@16: Chris@16: typedef value_type& reference; Chris@16: typedef value_type const& const_reference; Chris@16: Chris@16: typedef std::size_t size_type; Chris@16: typedef std::ptrdiff_t difference_type; Chris@16: Chris@16: typedef typename table::cl_iterator const_local_iterator; Chris@16: typedef typename table::l_iterator local_iterator; Chris@16: typedef typename table::c_iterator const_iterator; Chris@16: typedef typename table::iterator iterator; Chris@16: Chris@16: private: Chris@16: Chris@16: table table_; Chris@16: Chris@16: public: Chris@16: Chris@16: // constructors Chris@16: Chris@16: explicit unordered_map( Chris@16: size_type = boost::unordered::detail::default_bucket_count, Chris@16: const hasher& = hasher(), Chris@16: const key_equal& = key_equal(), Chris@16: const allocator_type& = allocator_type()); Chris@16: Chris@16: explicit unordered_map(allocator_type const&); Chris@16: Chris@16: template Chris@16: unordered_map(InputIt, InputIt); Chris@16: Chris@16: template Chris@16: unordered_map( Chris@16: InputIt, InputIt, Chris@16: size_type, Chris@16: const hasher& = hasher(), Chris@16: const key_equal& = key_equal()); Chris@16: Chris@16: template Chris@16: unordered_map( Chris@16: InputIt, InputIt, Chris@16: size_type, Chris@16: const hasher&, Chris@16: const key_equal&, Chris@16: const allocator_type&); Chris@16: Chris@16: // copy/move constructors Chris@16: Chris@16: unordered_map(unordered_map const&); Chris@16: Chris@16: unordered_map(unordered_map const&, allocator_type const&); Chris@16: Chris@16: #if defined(BOOST_UNORDERED_USE_MOVE) Chris@16: unordered_map(BOOST_RV_REF(unordered_map) other) Chris@16: BOOST_NOEXCEPT_IF(table::nothrow_move_constructible) Chris@16: : table_(other.table_, boost::unordered::detail::move_tag()) Chris@16: { Chris@16: } Chris@16: #elif !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@16: unordered_map(unordered_map&& other) Chris@16: BOOST_NOEXCEPT_IF(table::nothrow_move_constructible) Chris@16: : table_(other.table_, boost::unordered::detail::move_tag()) Chris@16: { Chris@16: } Chris@16: #endif Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@16: unordered_map(unordered_map&&, allocator_type const&); Chris@16: #endif Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: unordered_map( Chris@16: std::initializer_list, Chris@16: size_type = boost::unordered::detail::default_bucket_count, Chris@16: const hasher& = hasher(), Chris@16: const key_equal&l = key_equal(), Chris@16: const allocator_type& = allocator_type()); Chris@16: #endif Chris@16: Chris@16: // Destructor Chris@16: Chris@16: ~unordered_map() BOOST_NOEXCEPT; Chris@16: Chris@16: // Assign Chris@16: Chris@16: #if defined(BOOST_UNORDERED_USE_MOVE) Chris@16: unordered_map& operator=(BOOST_COPY_ASSIGN_REF(unordered_map) x) Chris@16: { Chris@16: table_.assign(x.table_); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: unordered_map& operator=(BOOST_RV_REF(unordered_map) x) Chris@16: { Chris@16: table_.move_assign(x.table_); Chris@16: return *this; Chris@16: } Chris@16: #else Chris@16: unordered_map& operator=(unordered_map const& x) Chris@16: { Chris@16: table_.assign(x.table_); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@16: unordered_map& operator=(unordered_map&& x) Chris@16: { Chris@16: table_.move_assign(x.table_); Chris@16: return *this; Chris@16: } Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: unordered_map& operator=(std::initializer_list); Chris@16: #endif Chris@16: Chris@16: allocator_type get_allocator() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.node_alloc(); Chris@16: } Chris@16: Chris@16: // size and capacity Chris@16: Chris@16: bool empty() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.size_ == 0; Chris@16: } Chris@16: Chris@16: size_type size() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.size_; Chris@16: } Chris@16: Chris@16: size_type max_size() const BOOST_NOEXCEPT; Chris@16: Chris@16: // iterators Chris@16: Chris@16: iterator begin() BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.begin(); Chris@16: } Chris@16: Chris@16: const_iterator begin() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.begin(); Chris@16: } Chris@16: Chris@16: iterator end() BOOST_NOEXCEPT Chris@16: { Chris@16: return iterator(); Chris@16: } Chris@16: Chris@16: const_iterator end() const BOOST_NOEXCEPT Chris@16: { Chris@16: return const_iterator(); Chris@16: } Chris@16: Chris@16: const_iterator cbegin() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.begin(); Chris@16: } Chris@16: Chris@16: const_iterator cend() const BOOST_NOEXCEPT Chris@16: { Chris@16: return const_iterator(); Chris@16: } Chris@16: Chris@16: // emplace Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@16: template Chris@16: std::pair emplace(BOOST_FWD_REF(Args)... args) Chris@16: { Chris@16: return table_.emplace(boost::forward(args)...); Chris@16: } Chris@16: Chris@16: template Chris@16: iterator emplace_hint(const_iterator, BOOST_FWD_REF(Args)... args) Chris@16: { Chris@16: return table_.emplace(boost::forward(args)...).first; Chris@16: } Chris@16: #else Chris@16: Chris@16: #if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x5100)) Chris@16: Chris@16: // 0 argument emplace requires special treatment in case Chris@16: // the container is instantiated with a value type that Chris@16: // doesn't have a default constructor. Chris@16: Chris@16: std::pair emplace( Chris@16: boost::unordered::detail::empty_emplace Chris@16: = boost::unordered::detail::empty_emplace(), Chris@16: value_type v = value_type()) Chris@16: { Chris@16: return this->emplace(boost::move(v)); Chris@16: } Chris@16: Chris@16: iterator emplace_hint(const_iterator hint, Chris@16: boost::unordered::detail::empty_emplace Chris@16: = boost::unordered::detail::empty_emplace(), Chris@16: value_type v = value_type() Chris@16: ) Chris@16: { Chris@16: return this->emplace_hint(hint, boost::move(v)); Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: template Chris@16: std::pair emplace(BOOST_FWD_REF(A0) a0) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0)) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: iterator emplace_hint(const_iterator, BOOST_FWD_REF(A0) a0) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0)) Chris@16: ).first; Chris@16: } Chris@16: Chris@16: template Chris@16: std::pair emplace( Chris@16: BOOST_FWD_REF(A0) a0, Chris@16: BOOST_FWD_REF(A1) a1) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0), Chris@16: boost::forward(a1)) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: iterator emplace_hint(const_iterator, Chris@16: BOOST_FWD_REF(A0) a0, Chris@16: BOOST_FWD_REF(A1) a1) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0), Chris@16: boost::forward(a1)) Chris@16: ).first; Chris@16: } Chris@16: Chris@16: template Chris@16: std::pair emplace( Chris@16: BOOST_FWD_REF(A0) a0, Chris@16: BOOST_FWD_REF(A1) a1, Chris@16: BOOST_FWD_REF(A2) a2) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0), Chris@16: boost::forward(a1), Chris@16: boost::forward(a2)) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: iterator emplace_hint(const_iterator, Chris@16: BOOST_FWD_REF(A0) a0, Chris@16: BOOST_FWD_REF(A1) a1, Chris@16: BOOST_FWD_REF(A2) a2) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0), Chris@16: boost::forward(a1), Chris@16: boost::forward(a2)) Chris@16: ).first; Chris@16: } Chris@16: Chris@16: #define BOOST_UNORDERED_EMPLACE(z, n, _) \ Chris@16: template < \ Chris@16: BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \ Chris@16: > \ Chris@16: std::pair emplace( \ Chris@16: BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a) \ Chris@16: ) \ Chris@16: { \ Chris@16: return table_.emplace( \ Chris@16: boost::unordered::detail::create_emplace_args( \ Chris@16: BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, \ Chris@16: a) \ Chris@16: )); \ Chris@16: } \ Chris@16: \ Chris@16: template < \ Chris@16: BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \ Chris@16: > \ Chris@16: iterator emplace_hint( \ Chris@16: const_iterator, \ Chris@16: BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a) \ Chris@16: ) \ Chris@16: { \ Chris@16: return table_.emplace( \ Chris@16: boost::unordered::detail::create_emplace_args( \ Chris@16: BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, \ Chris@16: a) \ Chris@16: )).first; \ Chris@16: } Chris@16: Chris@16: BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT, Chris@16: BOOST_UNORDERED_EMPLACE, _) Chris@16: Chris@16: #undef BOOST_UNORDERED_EMPLACE Chris@16: Chris@16: #endif Chris@16: Chris@16: std::pair insert(value_type const& x) Chris@16: { Chris@16: return this->emplace(x); Chris@16: } Chris@16: Chris@16: std::pair insert(BOOST_RV_REF(value_type) x) Chris@16: { Chris@16: return this->emplace(boost::move(x)); Chris@16: } Chris@16: Chris@16: iterator insert(const_iterator hint, value_type const& x) Chris@16: { Chris@16: return this->emplace_hint(hint, x); Chris@16: } Chris@16: Chris@16: iterator insert(const_iterator hint, BOOST_RV_REF(value_type) x) Chris@16: { Chris@16: return this->emplace_hint(hint, boost::move(x)); Chris@16: } Chris@16: Chris@16: template void insert(InputIt, InputIt); Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: void insert(std::initializer_list); Chris@16: #endif Chris@16: Chris@16: iterator erase(const_iterator); Chris@16: size_type erase(const key_type&); Chris@16: iterator erase(const_iterator, const_iterator); Chris@16: void quick_erase(const_iterator it) { erase(it); } Chris@16: void erase_return_void(const_iterator it) { erase(it); } Chris@16: Chris@16: void clear(); Chris@16: void swap(unordered_map&); Chris@16: Chris@16: // observers Chris@16: Chris@16: hasher hash_function() const; Chris@16: key_equal key_eq() const; Chris@16: Chris@16: mapped_type& operator[](const key_type&); Chris@16: mapped_type& at(const key_type&); Chris@16: mapped_type const& at(const key_type&) const; Chris@16: Chris@16: // lookup Chris@16: Chris@16: iterator find(const key_type&); Chris@16: const_iterator find(const key_type&) const; Chris@16: Chris@16: template Chris@16: iterator find( Chris@16: CompatibleKey const&, Chris@16: CompatibleHash const&, Chris@16: CompatiblePredicate const&); Chris@16: Chris@16: template Chris@16: const_iterator find( Chris@16: CompatibleKey const&, Chris@16: CompatibleHash const&, Chris@16: CompatiblePredicate const&) const; Chris@16: Chris@16: size_type count(const key_type&) const; Chris@16: Chris@16: std::pair Chris@16: equal_range(const key_type&); Chris@16: std::pair Chris@16: equal_range(const key_type&) const; Chris@16: Chris@16: // bucket interface Chris@16: Chris@16: size_type bucket_count() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.bucket_count_; Chris@16: } Chris@16: Chris@16: size_type max_bucket_count() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.max_bucket_count(); Chris@16: } Chris@16: Chris@16: size_type bucket_size(size_type) const; Chris@16: Chris@16: size_type bucket(const key_type& k) const Chris@16: { Chris@16: return table_.hash_to_bucket(table_.hash(k)); Chris@16: } Chris@16: Chris@16: local_iterator begin(size_type n) Chris@16: { Chris@16: return local_iterator( Chris@16: table_.begin(n), n, table_.bucket_count_); Chris@16: } Chris@16: Chris@16: const_local_iterator begin(size_type n) const Chris@16: { Chris@16: return const_local_iterator( Chris@16: table_.begin(n), n, table_.bucket_count_); Chris@16: } Chris@16: Chris@16: local_iterator end(size_type) Chris@16: { Chris@16: return local_iterator(); Chris@16: } Chris@16: Chris@16: const_local_iterator end(size_type) const Chris@16: { Chris@16: return const_local_iterator(); Chris@16: } Chris@16: Chris@16: const_local_iterator cbegin(size_type n) const Chris@16: { Chris@16: return const_local_iterator( Chris@16: table_.begin(n), n, table_.bucket_count_); Chris@16: } Chris@16: Chris@16: const_local_iterator cend(size_type) const Chris@16: { Chris@16: return const_local_iterator(); Chris@16: } Chris@16: Chris@16: // hash policy Chris@16: Chris@16: float max_load_factor() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.mlf_; Chris@16: } Chris@16: Chris@16: float load_factor() const BOOST_NOEXCEPT; Chris@16: void max_load_factor(float) BOOST_NOEXCEPT; Chris@16: void rehash(size_type); Chris@16: void reserve(size_type); Chris@16: Chris@16: #if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582) Chris@16: friend bool operator==( Chris@16: unordered_map const&, unordered_map const&); Chris@16: friend bool operator!=( Chris@16: unordered_map const&, unordered_map const&); Chris@16: #endif Chris@16: }; // class template unordered_map Chris@16: Chris@16: template Chris@16: class unordered_multimap Chris@16: { Chris@16: #if defined(BOOST_UNORDERED_USE_MOVE) Chris@16: BOOST_COPYABLE_AND_MOVABLE(unordered_multimap) Chris@16: #endif Chris@16: public: Chris@16: Chris@16: typedef K key_type; Chris@16: typedef std::pair value_type; Chris@16: typedef T mapped_type; Chris@16: typedef H hasher; Chris@16: typedef P key_equal; Chris@16: typedef A allocator_type; Chris@16: Chris@16: private: Chris@16: Chris@16: typedef boost::unordered::detail::multimap types; Chris@16: typedef typename types::traits allocator_traits; Chris@16: typedef typename types::table table; Chris@16: Chris@16: public: Chris@16: Chris@16: typedef typename allocator_traits::pointer pointer; Chris@16: typedef typename allocator_traits::const_pointer const_pointer; Chris@16: Chris@16: typedef value_type& reference; Chris@16: typedef value_type const& const_reference; Chris@16: Chris@16: typedef std::size_t size_type; Chris@16: typedef std::ptrdiff_t difference_type; Chris@16: Chris@16: typedef typename table::cl_iterator const_local_iterator; Chris@16: typedef typename table::l_iterator local_iterator; Chris@16: typedef typename table::c_iterator const_iterator; Chris@16: typedef typename table::iterator iterator; Chris@16: Chris@16: private: Chris@16: Chris@16: table table_; Chris@16: Chris@16: public: Chris@16: Chris@16: // constructors Chris@16: Chris@16: explicit unordered_multimap( Chris@16: size_type = boost::unordered::detail::default_bucket_count, Chris@16: const hasher& = hasher(), Chris@16: const key_equal& = key_equal(), Chris@16: const allocator_type& = allocator_type()); Chris@16: Chris@16: explicit unordered_multimap(allocator_type const&); Chris@16: Chris@16: template Chris@16: unordered_multimap(InputIt, InputIt); Chris@16: Chris@16: template Chris@16: unordered_multimap( Chris@16: InputIt, InputIt, Chris@16: size_type, Chris@16: const hasher& = hasher(), Chris@16: const key_equal& = key_equal()); Chris@16: Chris@16: template Chris@16: unordered_multimap( Chris@16: InputIt, InputIt, Chris@16: size_type, Chris@16: const hasher&, Chris@16: const key_equal&, Chris@16: const allocator_type&); Chris@16: Chris@16: // copy/move constructors Chris@16: Chris@16: unordered_multimap(unordered_multimap const&); Chris@16: Chris@16: unordered_multimap(unordered_multimap const&, allocator_type const&); Chris@16: Chris@16: #if defined(BOOST_UNORDERED_USE_MOVE) Chris@16: unordered_multimap(BOOST_RV_REF(unordered_multimap) other) Chris@16: BOOST_NOEXCEPT_IF(table::nothrow_move_constructible) Chris@16: : table_(other.table_, boost::unordered::detail::move_tag()) Chris@16: { Chris@16: } Chris@16: #elif !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@16: unordered_multimap(unordered_multimap&& other) Chris@16: BOOST_NOEXCEPT_IF(table::nothrow_move_constructible) Chris@16: : table_(other.table_, boost::unordered::detail::move_tag()) Chris@16: { Chris@16: } Chris@16: #endif Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@16: unordered_multimap(unordered_multimap&&, allocator_type const&); Chris@16: #endif Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: unordered_multimap( Chris@16: std::initializer_list, Chris@16: size_type = boost::unordered::detail::default_bucket_count, Chris@16: const hasher& = hasher(), Chris@16: const key_equal&l = key_equal(), Chris@16: const allocator_type& = allocator_type()); Chris@16: #endif Chris@16: Chris@16: // Destructor Chris@16: Chris@16: ~unordered_multimap() BOOST_NOEXCEPT; Chris@16: Chris@16: // Assign Chris@16: Chris@16: #if defined(BOOST_UNORDERED_USE_MOVE) Chris@16: unordered_multimap& operator=( Chris@16: BOOST_COPY_ASSIGN_REF(unordered_multimap) x) Chris@16: { Chris@16: table_.assign(x.table_); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: unordered_multimap& operator=(BOOST_RV_REF(unordered_multimap) x) Chris@16: { Chris@16: table_.move_assign(x.table_); Chris@16: return *this; Chris@16: } Chris@16: #else Chris@16: unordered_multimap& operator=(unordered_multimap const& x) Chris@16: { Chris@16: table_.assign(x.table_); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@16: unordered_multimap& operator=(unordered_multimap&& x) Chris@16: { Chris@16: table_.move_assign(x.table_); Chris@16: return *this; Chris@16: } Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: unordered_multimap& operator=(std::initializer_list); Chris@16: #endif Chris@16: Chris@16: allocator_type get_allocator() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.node_alloc(); Chris@16: } Chris@16: Chris@16: // size and capacity Chris@16: Chris@16: bool empty() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.size_ == 0; Chris@16: } Chris@16: Chris@16: size_type size() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.size_; Chris@16: } Chris@16: Chris@16: size_type max_size() const BOOST_NOEXCEPT; Chris@16: Chris@16: // iterators Chris@16: Chris@16: iterator begin() BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.begin(); Chris@16: } Chris@16: Chris@16: const_iterator begin() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.begin(); Chris@16: } Chris@16: Chris@16: iterator end() BOOST_NOEXCEPT Chris@16: { Chris@16: return iterator(); Chris@16: } Chris@16: Chris@16: const_iterator end() const BOOST_NOEXCEPT Chris@16: { Chris@16: return const_iterator(); Chris@16: } Chris@16: Chris@16: const_iterator cbegin() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.begin(); Chris@16: } Chris@16: Chris@16: const_iterator cend() const BOOST_NOEXCEPT Chris@16: { Chris@16: return const_iterator(); Chris@16: } Chris@16: Chris@16: // emplace Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) Chris@16: template Chris@16: iterator emplace(BOOST_FWD_REF(Args)... args) Chris@16: { Chris@16: return table_.emplace(boost::forward(args)...); Chris@16: } Chris@16: Chris@16: template Chris@16: iterator emplace_hint(const_iterator, BOOST_FWD_REF(Args)... args) Chris@16: { Chris@16: return table_.emplace(boost::forward(args)...); Chris@16: } Chris@16: #else Chris@16: Chris@16: #if !BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x5100)) Chris@16: Chris@16: // 0 argument emplace requires special treatment in case Chris@16: // the container is instantiated with a value type that Chris@16: // doesn't have a default constructor. Chris@16: Chris@16: iterator emplace( Chris@16: boost::unordered::detail::empty_emplace Chris@16: = boost::unordered::detail::empty_emplace(), Chris@16: value_type v = value_type()) Chris@16: { Chris@16: return this->emplace(boost::move(v)); Chris@16: } Chris@16: Chris@16: iterator emplace_hint(const_iterator hint, Chris@16: boost::unordered::detail::empty_emplace Chris@16: = boost::unordered::detail::empty_emplace(), Chris@16: value_type v = value_type() Chris@16: ) Chris@16: { Chris@16: return this->emplace_hint(hint, boost::move(v)); Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: template Chris@16: iterator emplace(BOOST_FWD_REF(A0) a0) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0)) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: iterator emplace_hint(const_iterator, BOOST_FWD_REF(A0) a0) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0)) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: iterator emplace( Chris@16: BOOST_FWD_REF(A0) a0, Chris@16: BOOST_FWD_REF(A1) a1) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0), Chris@16: boost::forward(a1)) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: iterator emplace_hint(const_iterator, Chris@16: BOOST_FWD_REF(A0) a0, Chris@16: BOOST_FWD_REF(A1) a1) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0), Chris@16: boost::forward(a1)) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: iterator emplace( Chris@16: BOOST_FWD_REF(A0) a0, Chris@16: BOOST_FWD_REF(A1) a1, Chris@16: BOOST_FWD_REF(A2) a2) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0), Chris@16: boost::forward(a1), Chris@16: boost::forward(a2)) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: iterator emplace_hint(const_iterator, Chris@16: BOOST_FWD_REF(A0) a0, Chris@16: BOOST_FWD_REF(A1) a1, Chris@16: BOOST_FWD_REF(A2) a2) Chris@16: { Chris@16: return table_.emplace( Chris@16: boost::unordered::detail::create_emplace_args( Chris@16: boost::forward(a0), Chris@16: boost::forward(a1), Chris@16: boost::forward(a2)) Chris@16: ); Chris@16: } Chris@16: Chris@16: #define BOOST_UNORDERED_EMPLACE(z, n, _) \ Chris@16: template < \ Chris@16: BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \ Chris@16: > \ Chris@16: iterator emplace( \ Chris@16: BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a) \ Chris@16: ) \ Chris@16: { \ Chris@16: return table_.emplace( \ Chris@16: boost::unordered::detail::create_emplace_args( \ Chris@16: BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, \ Chris@16: a) \ Chris@16: )); \ Chris@16: } \ Chris@16: \ Chris@16: template < \ Chris@16: BOOST_PP_ENUM_PARAMS_Z(z, n, typename A) \ Chris@16: > \ Chris@16: iterator emplace_hint( \ Chris@16: const_iterator, \ Chris@16: BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a) \ Chris@16: ) \ Chris@16: { \ Chris@16: return table_.emplace( \ Chris@16: boost::unordered::detail::create_emplace_args( \ Chris@16: BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, \ Chris@16: a) \ Chris@16: )); \ Chris@16: } Chris@16: Chris@16: BOOST_PP_REPEAT_FROM_TO(4, BOOST_UNORDERED_EMPLACE_LIMIT, Chris@16: BOOST_UNORDERED_EMPLACE, _) Chris@16: Chris@16: #undef BOOST_UNORDERED_EMPLACE Chris@16: Chris@16: #endif Chris@16: Chris@16: iterator insert(value_type const& x) Chris@16: { Chris@16: return this->emplace(x); Chris@16: } Chris@16: Chris@16: iterator insert(BOOST_RV_REF(value_type) x) Chris@16: { Chris@16: return this->emplace(boost::move(x)); Chris@16: } Chris@16: Chris@16: iterator insert(const_iterator hint, value_type const& x) Chris@16: { Chris@16: return this->emplace_hint(hint, x); Chris@16: } Chris@16: Chris@16: iterator insert(const_iterator hint, BOOST_RV_REF(value_type) x) Chris@16: { Chris@16: return this->emplace_hint(hint, boost::move(x)); Chris@16: } Chris@16: Chris@16: template void insert(InputIt, InputIt); Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: void insert(std::initializer_list); Chris@16: #endif Chris@16: Chris@16: iterator erase(const_iterator); Chris@16: size_type erase(const key_type&); Chris@16: iterator erase(const_iterator, const_iterator); Chris@16: void quick_erase(const_iterator it) { erase(it); } Chris@16: void erase_return_void(const_iterator it) { erase(it); } Chris@16: Chris@16: void clear(); Chris@16: void swap(unordered_multimap&); Chris@16: Chris@16: // observers Chris@16: Chris@16: hasher hash_function() const; Chris@16: key_equal key_eq() const; Chris@16: Chris@16: // lookup Chris@16: Chris@16: iterator find(const key_type&); Chris@16: const_iterator find(const key_type&) const; Chris@16: Chris@16: template Chris@16: iterator find( Chris@16: CompatibleKey const&, Chris@16: CompatibleHash const&, Chris@16: CompatiblePredicate const&); Chris@16: Chris@16: template Chris@16: const_iterator find( Chris@16: CompatibleKey const&, Chris@16: CompatibleHash const&, Chris@16: CompatiblePredicate const&) const; Chris@16: Chris@16: size_type count(const key_type&) const; Chris@16: Chris@16: std::pair Chris@16: equal_range(const key_type&); Chris@16: std::pair Chris@16: equal_range(const key_type&) const; Chris@16: Chris@16: // bucket interface Chris@16: Chris@16: size_type bucket_count() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.bucket_count_; Chris@16: } Chris@16: Chris@16: size_type max_bucket_count() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.max_bucket_count(); Chris@16: } Chris@16: Chris@16: size_type bucket_size(size_type) const; Chris@16: Chris@16: size_type bucket(const key_type& k) const Chris@16: { Chris@16: return table_.hash_to_bucket(table_.hash(k)); Chris@16: } Chris@16: Chris@16: local_iterator begin(size_type n) Chris@16: { Chris@16: return local_iterator( Chris@16: table_.begin(n), n, table_.bucket_count_); Chris@16: } Chris@16: Chris@16: const_local_iterator begin(size_type n) const Chris@16: { Chris@16: return const_local_iterator( Chris@16: table_.begin(n), n, table_.bucket_count_); Chris@16: } Chris@16: Chris@16: local_iterator end(size_type) Chris@16: { Chris@16: return local_iterator(); Chris@16: } Chris@16: Chris@16: const_local_iterator end(size_type) const Chris@16: { Chris@16: return const_local_iterator(); Chris@16: } Chris@16: Chris@16: const_local_iterator cbegin(size_type n) const Chris@16: { Chris@16: return const_local_iterator( Chris@16: table_.begin(n), n, table_.bucket_count_); Chris@16: } Chris@16: Chris@16: const_local_iterator cend(size_type) const Chris@16: { Chris@16: return const_local_iterator(); Chris@16: } Chris@16: Chris@16: // hash policy Chris@16: Chris@16: float max_load_factor() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.mlf_; Chris@16: } Chris@16: Chris@16: float load_factor() const BOOST_NOEXCEPT; Chris@16: void max_load_factor(float) BOOST_NOEXCEPT; Chris@16: void rehash(size_type); Chris@16: void reserve(size_type); Chris@16: Chris@16: #if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582) Chris@16: friend bool operator==( Chris@16: unordered_multimap const&, unordered_multimap const&); Chris@16: friend bool operator!=( Chris@16: unordered_multimap const&, unordered_multimap const&); Chris@16: #endif Chris@16: }; // class template unordered_multimap Chris@16: Chris@16: //////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: template Chris@16: unordered_map::unordered_map( Chris@16: size_type n, const hasher &hf, const key_equal &eql, Chris@16: const allocator_type &a) Chris@16: : table_(n, hf, eql, a) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: unordered_map::unordered_map(allocator_type const& a) Chris@16: : table_(boost::unordered::detail::default_bucket_count, Chris@16: hasher(), key_equal(), a) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: unordered_map::unordered_map( Chris@16: unordered_map const& other, allocator_type const& a) Chris@16: : table_(other.table_, a) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: unordered_map::unordered_map(InputIt f, InputIt l) Chris@16: : table_(boost::unordered::detail::initial_size(f, l), Chris@16: hasher(), key_equal(), allocator_type()) Chris@16: { Chris@16: table_.insert_range(f, l); Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: unordered_map::unordered_map( Chris@16: InputIt f, InputIt l, Chris@16: size_type n, Chris@16: const hasher &hf, Chris@16: const key_equal &eql) Chris@16: : table_(boost::unordered::detail::initial_size(f, l, n), Chris@16: hf, eql, allocator_type()) Chris@16: { Chris@16: table_.insert_range(f, l); Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: unordered_map::unordered_map( Chris@16: InputIt f, InputIt l, Chris@16: size_type n, Chris@16: const hasher &hf, Chris@16: const key_equal &eql, Chris@16: const allocator_type &a) Chris@16: : table_(boost::unordered::detail::initial_size(f, l, n), hf, eql, a) Chris@16: { Chris@16: table_.insert_range(f, l); Chris@16: } Chris@16: Chris@16: template Chris@16: unordered_map::~unordered_map() BOOST_NOEXCEPT {} Chris@16: Chris@16: template Chris@16: unordered_map::unordered_map( Chris@16: unordered_map const& other) Chris@16: : table_(other.table_) Chris@16: { Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@16: Chris@16: template Chris@16: unordered_map::unordered_map( Chris@16: unordered_map&& other, allocator_type const& a) Chris@16: : table_(other.table_, a, boost::unordered::detail::move_tag()) Chris@16: { Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: Chris@16: template Chris@16: unordered_map::unordered_map( Chris@16: std::initializer_list list, size_type n, Chris@16: const hasher &hf, const key_equal &eql, const allocator_type &a) Chris@16: : table_( Chris@16: boost::unordered::detail::initial_size( Chris@16: list.begin(), list.end(), n), Chris@16: hf, eql, a) Chris@16: { Chris@16: table_.insert_range(list.begin(), list.end()); Chris@16: } Chris@16: Chris@16: template Chris@16: unordered_map& unordered_map::operator=( Chris@16: std::initializer_list list) Chris@16: { Chris@16: table_.clear(); Chris@16: table_.insert_range(list.begin(), list.end()); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: // size and capacity Chris@16: Chris@16: template Chris@16: std::size_t unordered_map::max_size() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.max_size(); Chris@16: } Chris@16: Chris@16: // modifiers Chris@16: Chris@16: template Chris@16: template Chris@16: void unordered_map::insert(InputIt first, InputIt last) Chris@16: { Chris@16: table_.insert_range(first, last); Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: template Chris@16: void unordered_map::insert( Chris@16: std::initializer_list list) Chris@16: { Chris@16: table_.insert_range(list.begin(), list.end()); Chris@16: } Chris@16: #endif Chris@16: Chris@16: template Chris@16: typename unordered_map::iterator Chris@16: unordered_map::erase(const_iterator position) Chris@16: { Chris@16: return table_.erase(position); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_map::size_type Chris@16: unordered_map::erase(const key_type& k) Chris@16: { Chris@16: return table_.erase_key(k); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_map::iterator Chris@16: unordered_map::erase( Chris@16: const_iterator first, const_iterator last) Chris@16: { Chris@16: return table_.erase_range(first, last); Chris@16: } Chris@16: Chris@16: template Chris@16: void unordered_map::clear() Chris@16: { Chris@16: table_.clear(); Chris@16: } Chris@16: Chris@16: template Chris@16: void unordered_map::swap(unordered_map& other) Chris@16: { Chris@16: table_.swap(other.table_); Chris@16: } Chris@16: Chris@16: // observers Chris@16: Chris@16: template Chris@16: typename unordered_map::hasher Chris@16: unordered_map::hash_function() const Chris@16: { Chris@16: return table_.hash_function(); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_map::key_equal Chris@16: unordered_map::key_eq() const Chris@16: { Chris@16: return table_.key_eq(); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_map::mapped_type& Chris@16: unordered_map::operator[](const key_type &k) Chris@16: { Chris@16: return table_[k].second; Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_map::mapped_type& Chris@16: unordered_map::at(const key_type& k) Chris@16: { Chris@16: return table_.at(k).second; Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_map::mapped_type const& Chris@16: unordered_map::at(const key_type& k) const Chris@16: { Chris@16: return table_.at(k).second; Chris@16: } Chris@16: Chris@16: // lookup Chris@16: Chris@16: template Chris@16: typename unordered_map::iterator Chris@16: unordered_map::find(const key_type& k) Chris@16: { Chris@16: return table_.find_node(k); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_map::const_iterator Chris@16: unordered_map::find(const key_type& k) const Chris@16: { Chris@16: return table_.find_node(k); Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: typename unordered_map::iterator Chris@16: unordered_map::find( Chris@16: CompatibleKey const& k, Chris@16: CompatibleHash const& hash, Chris@16: CompatiblePredicate const& eq) Chris@16: { Chris@16: return table_.generic_find_node(k, hash, eq); Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: typename unordered_map::const_iterator Chris@16: unordered_map::find( Chris@16: CompatibleKey const& k, Chris@16: CompatibleHash const& hash, Chris@16: CompatiblePredicate const& eq) const Chris@16: { Chris@16: return table_.generic_find_node(k, hash, eq); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_map::size_type Chris@16: unordered_map::count(const key_type& k) const Chris@16: { Chris@16: return table_.count(k); Chris@16: } Chris@16: Chris@16: template Chris@16: std::pair< Chris@16: typename unordered_map::iterator, Chris@16: typename unordered_map::iterator> Chris@16: unordered_map::equal_range(const key_type& k) Chris@16: { Chris@16: return table_.equal_range(k); Chris@16: } Chris@16: Chris@16: template Chris@16: std::pair< Chris@16: typename unordered_map::const_iterator, Chris@16: typename unordered_map::const_iterator> Chris@16: unordered_map::equal_range(const key_type& k) const Chris@16: { Chris@16: return table_.equal_range(k); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_map::size_type Chris@16: unordered_map::bucket_size(size_type n) const Chris@16: { Chris@16: return table_.bucket_size(n); Chris@16: } Chris@16: Chris@16: // hash policy Chris@16: Chris@16: template Chris@16: float unordered_map::load_factor() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.load_factor(); Chris@16: } Chris@16: Chris@16: template Chris@16: void unordered_map::max_load_factor(float m) BOOST_NOEXCEPT Chris@16: { Chris@16: table_.max_load_factor(m); Chris@16: } Chris@16: Chris@16: template Chris@16: void unordered_map::rehash(size_type n) Chris@16: { Chris@16: table_.rehash(n); Chris@16: } Chris@16: Chris@16: template Chris@16: void unordered_map::reserve(size_type n) Chris@16: { Chris@16: table_.reserve(n); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool operator==( Chris@16: unordered_map const& m1, Chris@16: unordered_map const& m2) Chris@16: { Chris@16: #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613)) Chris@16: struct dummy { unordered_map x; }; Chris@16: #endif Chris@16: return m1.table_.equals(m2.table_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool operator!=( Chris@16: unordered_map const& m1, Chris@16: unordered_map const& m2) Chris@16: { Chris@16: #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613)) Chris@16: struct dummy { unordered_map x; }; Chris@16: #endif Chris@16: return !m1.table_.equals(m2.table_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void swap( Chris@16: unordered_map &m1, Chris@16: unordered_map &m2) Chris@16: { Chris@16: #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613)) Chris@16: struct dummy { unordered_map x; }; Chris@16: #endif Chris@16: m1.swap(m2); Chris@16: } Chris@16: Chris@16: //////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: template Chris@16: unordered_multimap::unordered_multimap( Chris@16: size_type n, const hasher &hf, const key_equal &eql, Chris@16: const allocator_type &a) Chris@16: : table_(n, hf, eql, a) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: unordered_multimap::unordered_multimap(allocator_type const& a) Chris@16: : table_(boost::unordered::detail::default_bucket_count, Chris@16: hasher(), key_equal(), a) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: unordered_multimap::unordered_multimap( Chris@16: unordered_multimap const& other, allocator_type const& a) Chris@16: : table_(other.table_, a) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: unordered_multimap::unordered_multimap(InputIt f, InputIt l) Chris@16: : table_(boost::unordered::detail::initial_size(f, l), Chris@16: hasher(), key_equal(), allocator_type()) Chris@16: { Chris@16: table_.insert_range(f, l); Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: unordered_multimap::unordered_multimap( Chris@16: InputIt f, InputIt l, Chris@16: size_type n, Chris@16: const hasher &hf, Chris@16: const key_equal &eql) Chris@16: : table_(boost::unordered::detail::initial_size(f, l, n), Chris@16: hf, eql, allocator_type()) Chris@16: { Chris@16: table_.insert_range(f, l); Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: unordered_multimap::unordered_multimap( Chris@16: InputIt f, InputIt l, Chris@16: size_type n, Chris@16: const hasher &hf, Chris@16: const key_equal &eql, Chris@16: const allocator_type &a) Chris@16: : table_(boost::unordered::detail::initial_size(f, l, n), hf, eql, a) Chris@16: { Chris@16: table_.insert_range(f, l); Chris@16: } Chris@16: Chris@16: template Chris@16: unordered_multimap::~unordered_multimap() BOOST_NOEXCEPT {} Chris@16: Chris@16: template Chris@16: unordered_multimap::unordered_multimap( Chris@16: unordered_multimap const& other) Chris@16: : table_(other.table_) Chris@16: { Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) Chris@16: Chris@16: template Chris@16: unordered_multimap::unordered_multimap( Chris@16: unordered_multimap&& other, allocator_type const& a) Chris@16: : table_(other.table_, a, boost::unordered::detail::move_tag()) Chris@16: { Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: Chris@16: template Chris@16: unordered_multimap::unordered_multimap( Chris@16: std::initializer_list list, size_type n, Chris@16: const hasher &hf, const key_equal &eql, const allocator_type &a) Chris@16: : table_( Chris@16: boost::unordered::detail::initial_size( Chris@16: list.begin(), list.end(), n), Chris@16: hf, eql, a) Chris@16: { Chris@16: table_.insert_range(list.begin(), list.end()); Chris@16: } Chris@16: Chris@16: template Chris@16: unordered_multimap& unordered_multimap::operator=( Chris@16: std::initializer_list list) Chris@16: { Chris@16: table_.clear(); Chris@16: table_.insert_range(list.begin(), list.end()); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: // size and capacity Chris@16: Chris@16: template Chris@16: std::size_t unordered_multimap::max_size() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.max_size(); Chris@16: } Chris@16: Chris@16: // modifiers Chris@16: Chris@16: template Chris@16: template Chris@16: void unordered_multimap::insert(InputIt first, InputIt last) Chris@16: { Chris@16: table_.insert_range(first, last); Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) Chris@16: template Chris@16: void unordered_multimap::insert( Chris@16: std::initializer_list list) Chris@16: { Chris@16: table_.insert_range(list.begin(), list.end()); Chris@16: } Chris@16: #endif Chris@16: Chris@16: template Chris@16: typename unordered_multimap::iterator Chris@16: unordered_multimap::erase(const_iterator position) Chris@16: { Chris@16: return table_.erase(position); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_multimap::size_type Chris@16: unordered_multimap::erase(const key_type& k) Chris@16: { Chris@16: return table_.erase_key(k); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_multimap::iterator Chris@16: unordered_multimap::erase( Chris@16: const_iterator first, const_iterator last) Chris@16: { Chris@16: return table_.erase_range(first, last); Chris@16: } Chris@16: Chris@16: template Chris@16: void unordered_multimap::clear() Chris@16: { Chris@16: table_.clear(); Chris@16: } Chris@16: Chris@16: template Chris@16: void unordered_multimap::swap(unordered_multimap& other) Chris@16: { Chris@16: table_.swap(other.table_); Chris@16: } Chris@16: Chris@16: // observers Chris@16: Chris@16: template Chris@16: typename unordered_multimap::hasher Chris@16: unordered_multimap::hash_function() const Chris@16: { Chris@16: return table_.hash_function(); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_multimap::key_equal Chris@16: unordered_multimap::key_eq() const Chris@16: { Chris@16: return table_.key_eq(); Chris@16: } Chris@16: Chris@16: // lookup Chris@16: Chris@16: template Chris@16: typename unordered_multimap::iterator Chris@16: unordered_multimap::find(const key_type& k) Chris@16: { Chris@16: return table_.find_node(k); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_multimap::const_iterator Chris@16: unordered_multimap::find(const key_type& k) const Chris@16: { Chris@16: return table_.find_node(k); Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: typename unordered_multimap::iterator Chris@16: unordered_multimap::find( Chris@16: CompatibleKey const& k, Chris@16: CompatibleHash const& hash, Chris@16: CompatiblePredicate const& eq) Chris@16: { Chris@16: return table_.generic_find_node(k, hash, eq); Chris@16: } Chris@16: Chris@16: template Chris@16: template Chris@16: typename unordered_multimap::const_iterator Chris@16: unordered_multimap::find( Chris@16: CompatibleKey const& k, Chris@16: CompatibleHash const& hash, Chris@16: CompatiblePredicate const& eq) const Chris@16: { Chris@16: return table_.generic_find_node(k, hash, eq); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_multimap::size_type Chris@16: unordered_multimap::count(const key_type& k) const Chris@16: { Chris@16: return table_.count(k); Chris@16: } Chris@16: Chris@16: template Chris@16: std::pair< Chris@16: typename unordered_multimap::iterator, Chris@16: typename unordered_multimap::iterator> Chris@16: unordered_multimap::equal_range(const key_type& k) Chris@16: { Chris@16: return table_.equal_range(k); Chris@16: } Chris@16: Chris@16: template Chris@16: std::pair< Chris@16: typename unordered_multimap::const_iterator, Chris@16: typename unordered_multimap::const_iterator> Chris@16: unordered_multimap::equal_range(const key_type& k) const Chris@16: { Chris@16: return table_.equal_range(k); Chris@16: } Chris@16: Chris@16: template Chris@16: typename unordered_multimap::size_type Chris@16: unordered_multimap::bucket_size(size_type n) const Chris@16: { Chris@16: return table_.bucket_size(n); Chris@16: } Chris@16: Chris@16: // hash policy Chris@16: Chris@16: template Chris@16: float unordered_multimap::load_factor() const BOOST_NOEXCEPT Chris@16: { Chris@16: return table_.load_factor(); Chris@16: } Chris@16: Chris@16: template Chris@16: void unordered_multimap::max_load_factor(float m) BOOST_NOEXCEPT Chris@16: { Chris@16: table_.max_load_factor(m); Chris@16: } Chris@16: Chris@16: template Chris@16: void unordered_multimap::rehash(size_type n) Chris@16: { Chris@16: table_.rehash(n); Chris@16: } Chris@16: Chris@16: template Chris@16: void unordered_multimap::reserve(size_type n) Chris@16: { Chris@16: table_.reserve(n); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool operator==( Chris@16: unordered_multimap const& m1, Chris@16: unordered_multimap const& m2) Chris@16: { Chris@16: #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613)) Chris@16: struct dummy { unordered_multimap x; }; Chris@16: #endif Chris@16: return m1.table_.equals(m2.table_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline bool operator!=( Chris@16: unordered_multimap const& m1, Chris@16: unordered_multimap const& m2) Chris@16: { Chris@16: #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613)) Chris@16: struct dummy { unordered_multimap x; }; Chris@16: #endif Chris@16: return !m1.table_.equals(m2.table_); Chris@16: } Chris@16: Chris@16: template Chris@16: inline void swap( Chris@16: unordered_multimap &m1, Chris@16: unordered_multimap &m2) Chris@16: { Chris@16: #if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x0613)) Chris@16: struct dummy { unordered_multimap x; }; Chris@16: #endif Chris@16: m1.swap(m2); Chris@16: } Chris@16: Chris@16: } // namespace unordered Chris@16: } // namespace boost Chris@16: Chris@16: #if defined(BOOST_MSVC) Chris@16: #pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif // BOOST_UNORDERED_UNORDERED_MAP_HPP_INCLUDED