| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Copyright (C) 2003-2004 Jeremy B. Maitin-Shepard.
 | 
					
						
							| 
									
										
										
										
											2011-06-04 16:17:07 +00:00
										 |  |  | // Copyright (C) 2005-2011 Daniel James.
 | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  | // Copyright (C) 2022 Christian Mazakas
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | // Distributed under the Boost Software License, Version 1.0. (See accompanying
 | 
					
						
							|  |  |  | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //  See http://www.boost.org/libs/unordered for documentation
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef BOOST_UNORDERED_UNORDERED_SET_HPP_INCLUDED
 | 
					
						
							|  |  |  | #define BOOST_UNORDERED_UNORDERED_SET_HPP_INCLUDED
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-16 20:13:24 +00:00
										 |  |  | #include <boost/config.hpp>
 | 
					
						
							|  |  |  | #if defined(BOOST_HAS_PRAGMA_ONCE)
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #include <boost/core/explicit_operator_bool.hpp>
 | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | #include <boost/functional/hash.hpp>
 | 
					
						
							|  |  |  | #include <boost/move/move.hpp>
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | #include <boost/unordered/detail/set.hpp>
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 22:08:01 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2009-05-20 06:43:38 +00:00
										 |  |  | #include <initializer_list>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-14 16:11:16 +00:00
										 |  |  | #if defined(BOOST_MSVC)
 | 
					
						
							|  |  |  | #pragma warning(push)
 | 
					
						
							| 
									
										
										
										
											2018-01-10 11:35:22 +00:00
										 |  |  | // conditional expression is constant
 | 
					
						
							|  |  |  | #pragma warning(disable : 4127)
 | 
					
						
							| 
									
										
										
										
											2018-01-23 15:40:58 +00:00
										 |  |  | #if BOOST_MSVC >= 1400
 | 
					
						
							| 
									
										
										
										
											2018-01-10 11:35:22 +00:00
										 |  |  | // the inline specifier cannot be used when a friend declaration refers to a
 | 
					
						
							|  |  |  | // specialization of a function template
 | 
					
						
							|  |  |  | #pragma warning(disable : 4396)
 | 
					
						
							| 
									
										
										
										
											2008-11-14 16:11:16 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | namespace boost { | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   namespace unordered { | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> class unordered_set | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #if defined(BOOST_UNORDERED_USE_MOVE)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       BOOST_COPYABLE_AND_MOVABLE(unordered_set) | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename, typename, typename, typename> | 
					
						
							|  |  |  |       friend class unordered_multiset; | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							|  |  |  |       typedef T key_type; | 
					
						
							|  |  |  |       typedef T value_type; | 
					
						
							|  |  |  |       typedef H hasher; | 
					
						
							|  |  |  |       typedef P key_equal; | 
					
						
							|  |  |  |       typedef A allocator_type; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     private: | 
					
						
							|  |  |  |       typedef boost::unordered::detail::set<A, T, H, P> types; | 
					
						
							|  |  |  |       typedef typename types::value_allocator_traits value_allocator_traits; | 
					
						
							|  |  |  |       typedef typename types::table table; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							|  |  |  |       typedef typename value_allocator_traits::pointer pointer; | 
					
						
							|  |  |  |       typedef typename value_allocator_traits::const_pointer const_pointer; | 
					
						
							| 
									
										
										
										
											2011-08-11 21:17:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef value_type& reference; | 
					
						
							|  |  |  |       typedef value_type const& const_reference; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef std::size_t size_type; | 
					
						
							|  |  |  |       typedef std::ptrdiff_t difference_type; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       typedef typename table::c_iterator iterator; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef typename table::c_iterator const_iterator; | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       typedef typename table::cl_iterator local_iterator; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef typename table::cl_iterator const_local_iterator; | 
					
						
							|  |  |  |       typedef typename types::node_type node_type; | 
					
						
							|  |  |  |       typedef typename types::insert_return_type insert_return_type; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     private: | 
					
						
							|  |  |  |       table table_; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							|  |  |  |       // constructors
 | 
					
						
							| 
									
										
										
										
											2009-08-30 16:42:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set(); | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       explicit unordered_set(size_type, const hasher& = hasher(), | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         const key_equal& = key_equal(), | 
					
						
							|  |  |  |         const allocator_type& = allocator_type()); | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class InputIt> | 
					
						
							|  |  |  |       unordered_set(InputIt, InputIt, | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         size_type = boost::unordered::detail::default_bucket_count, | 
					
						
							|  |  |  |         const hasher& = hasher(), const key_equal& = key_equal(), | 
					
						
							|  |  |  |         const allocator_type& = allocator_type()); | 
					
						
							| 
									
										
										
										
											2011-08-03 08:34:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set(unordered_set const&); | 
					
						
							| 
									
										
										
										
											2011-08-07 10:22:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #if defined(BOOST_UNORDERED_USE_MOVE) ||                                       \
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) | 
					
						
							|  |  |  |       unordered_set(BOOST_RV_REF(unordered_set) other) | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         BOOST_NOEXCEPT_IF(table::nothrow_move_constructible) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           : table_(other.table_, boost::unordered::detail::move_tag()) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         // The move is done in table_
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-08-03 08:34:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       explicit unordered_set(allocator_type const&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set(unordered_set const&, allocator_type const&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set(BOOST_RV_REF(unordered_set), allocator_type const&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 22:08:01 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set(std::initializer_list<value_type>, | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         size_type = boost::unordered::detail::default_bucket_count, | 
					
						
							|  |  |  |         const hasher& = hasher(), const key_equal& l = key_equal(), | 
					
						
							|  |  |  |         const allocator_type& = allocator_type()); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       explicit unordered_set(size_type, const allocator_type&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       explicit unordered_set(size_type, const hasher&, const allocator_type&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class InputIt> | 
					
						
							|  |  |  |       unordered_set(InputIt, InputIt, size_type, const allocator_type&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class InputIt> | 
					
						
							|  |  |  |       unordered_set( | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         InputIt, InputIt, size_type, const hasher&, const allocator_type&); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set( | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         std::initializer_list<value_type>, size_type, const allocator_type&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set(std::initializer_list<value_type>, size_type, const hasher&, | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         const allocator_type&); | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // Destructor
 | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       ~unordered_set() BOOST_NOEXCEPT; | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | // Assign
 | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #if defined(BOOST_UNORDERED_USE_MOVE)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set& operator=(BOOST_COPY_ASSIGN_REF(unordered_set) x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.assign(x.table_, boost::unordered::detail::true_type()); | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return *this; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       unordered_set& operator=(BOOST_RV_REF(unordered_set) x) | 
					
						
							| 
									
										
										
										
											2018-01-05 17:54:44 +00:00
										 |  |  |         BOOST_NOEXCEPT_IF(value_allocator_traits::is_always_equal::value&& | 
					
						
							|  |  |  |             boost::is_nothrow_move_assignable<H>::value&& | 
					
						
							|  |  |  |               boost::is_nothrow_move_assignable<P>::value) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.move_assign(x.table_, boost::unordered::detail::true_type()); | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return *this; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set& operator=(unordered_set const& x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.assign(x.table_, boost::unordered::detail::true_type()); | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return *this; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-21 01:21:54 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set& operator=(unordered_set&& x) | 
					
						
							| 
									
										
										
										
											2018-01-05 17:54:44 +00:00
										 |  |  |         BOOST_NOEXCEPT_IF(value_allocator_traits::is_always_equal::value&& | 
					
						
							|  |  |  |             boost::is_nothrow_move_assignable<H>::value&& | 
					
						
							|  |  |  |               boost::is_nothrow_move_assignable<P>::value) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.move_assign(x.table_, boost::unordered::detail::true_type()); | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return *this; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 22:08:01 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_set& operator=(std::initializer_list<value_type>); | 
					
						
							| 
									
										
										
										
											2008-12-04 21:30:19 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       allocator_type get_allocator() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return table_.node_alloc(); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // iterators
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator begin() BOOST_NOEXCEPT { return iterator(table_.begin()); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator begin() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return const_iterator(table_.begin()); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator end() BOOST_NOEXCEPT { return iterator(); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator end() const BOOST_NOEXCEPT { return const_iterator(); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator cbegin() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return const_iterator(table_.begin()); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator cend() const BOOST_NOEXCEPT { return const_iterator(); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // size and capacity
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-23 14:26:28 -08:00
										 |  |  |       BOOST_ATTRIBUTE_NODISCARD bool empty() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         return table_.size_ == 0; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type size() const BOOST_NOEXCEPT { return table_.size_; } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type max_size() const BOOST_NOEXCEPT; | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | // emplace
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-21 01:21:54 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class... Args> | 
					
						
							|  |  |  |       std::pair<iterator, bool> emplace(BOOST_FWD_REF(Args)... args) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return table_.emplace_unique( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           table::extractor::extract(boost::forward<Args>(args)...), | 
					
						
							|  |  |  |           boost::forward<Args>(args)...); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-10 21:25:09 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 18:23:23 +01:00
										 |  |  | #if !BOOST_UNORDERED_SUN_WORKAROUNDS1
 | 
					
						
							| 
									
										
										
										
											2011-11-30 08:21:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // 0 argument emplace requires special treatment in case
 | 
					
						
							|  |  |  |       // the container is instantiated with a value type that
 | 
					
						
							|  |  |  |       // doesn't have a default constructor.
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       std::pair<iterator, bool> emplace( | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         boost::unordered::detail::empty_emplace = | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::empty_emplace(), | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         value_type v = value_type()) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace(boost::move(v)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename A0> | 
					
						
							|  |  |  |       std::pair<iterator, bool> emplace(BOOST_FWD_REF(A0) a0) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return table_.emplace_unique( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           table::extractor::extract(boost::forward<A0>(a0)), | 
					
						
							|  |  |  |           boost::unordered::detail::create_emplace_args( | 
					
						
							|  |  |  |             boost::forward<A0>(a0))); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename A0, typename A1> | 
					
						
							|  |  |  |       std::pair<iterator, bool> emplace( | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         BOOST_FWD_REF(A0) a0, BOOST_FWD_REF(A1) a1) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return table_.emplace_unique( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           table::extractor::extract( | 
					
						
							|  |  |  |             boost::forward<A0>(a0), boost::forward<A1>(a1)), | 
					
						
							|  |  |  |           boost::unordered::detail::create_emplace_args( | 
					
						
							|  |  |  |             boost::forward<A0>(a0), boost::forward<A1>(a1))); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       template <typename A0, typename A1, typename A2> | 
					
						
							|  |  |  |       std::pair<iterator, bool> emplace( | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         BOOST_FWD_REF(A0) a0, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return table_.emplace_unique( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           table::extractor::extract( | 
					
						
							|  |  |  |             boost::forward<A0>(a0), boost::forward<A1>(a1)), | 
					
						
							|  |  |  |           boost::unordered::detail::create_emplace_args(boost::forward<A0>(a0), | 
					
						
							|  |  |  |             boost::forward<A1>(a1), boost::forward<A2>(a2))); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class... Args> | 
					
						
							|  |  |  |       iterator emplace_hint(const_iterator hint, BOOST_FWD_REF(Args)... args) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return table_.emplace_hint_unique(hint, | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           table::extractor::extract(boost::forward<Args>(args)...), | 
					
						
							|  |  |  |           boost::forward<Args>(args)...); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 18:23:23 +01:00
										 |  |  | #if !BOOST_UNORDERED_SUN_WORKAROUNDS1
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator emplace_hint(const_iterator hint, | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         boost::unordered::detail::empty_emplace = | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::empty_emplace(), | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         value_type v = value_type()) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace_hint(hint, boost::move(v)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-11-30 08:21:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename A0> | 
					
						
							|  |  |  |       iterator emplace_hint(const_iterator hint, BOOST_FWD_REF(A0) a0) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return table_.emplace_hint_unique(hint, | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           table::extractor::extract(boost::forward<A0>(a0)), | 
					
						
							|  |  |  |           boost::unordered::detail::create_emplace_args( | 
					
						
							| 
									
										
										
										
											2017-10-05 10:54:22 +01:00
										 |  |  |             boost::forward<A0>(a0))); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename A0, typename A1> | 
					
						
							|  |  |  |       iterator emplace_hint( | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         const_iterator hint, BOOST_FWD_REF(A0) a0, BOOST_FWD_REF(A1) a1) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							|  |  |  |         return table_.emplace_hint_unique(hint, | 
					
						
							| 
									
										
										
										
											2017-10-05 10:54:22 +01:00
										 |  |  |           table::extractor::extract( | 
					
						
							|  |  |  |             boost::forward<A0>(a0), boost::forward<A1>(a1)), | 
					
						
							|  |  |  |           boost::unordered::detail::create_emplace_args( | 
					
						
							|  |  |  |             boost::forward<A0>(a0), boost::forward<A1>(a1))); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       template <typename A0, typename A1, typename A2> | 
					
						
							|  |  |  |       iterator emplace_hint(const_iterator hint, BOOST_FWD_REF(A0) a0, | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-10-05 10:54:22 +01:00
										 |  |  |         return table_.emplace_hint_unique(hint, | 
					
						
							|  |  |  |           table::extractor::extract( | 
					
						
							|  |  |  |             boost::forward<A0>(a0), boost::forward<A1>(a1)), | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::create_emplace_args(boost::forward<A0>(a0), | 
					
						
							|  |  |  |             boost::forward<A1>(a1), boost::forward<A2>(a2))); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | #define BOOST_UNORDERED_EMPLACE(z, n, _)                                       \
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)>                          \ | 
					
						
							|  |  |  |   std::pair<iterator, bool> emplace(                                           \ | 
					
						
							|  |  |  |     BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a))                        \ | 
					
						
							|  |  |  |   {                                                                            \ | 
					
						
							|  |  |  |     return table_.emplace_unique(                                              \ | 
					
						
							|  |  |  |       table::extractor::extract(                                               \ | 
					
						
							|  |  |  |         boost::forward<A0>(a0), boost::forward<A1>(a1)),                       \ | 
					
						
							|  |  |  |       boost::unordered::detail::create_emplace_args(                           \ | 
					
						
							|  |  |  |         BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, a)));               \ | 
					
						
							|  |  |  |   }                                                                            \ | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |                                                                                \ | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)>                          \ | 
					
						
							|  |  |  |   iterator emplace_hint(                                                       \ | 
					
						
							|  |  |  |     const_iterator hint, BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a))   \ | 
					
						
							|  |  |  |   {                                                                            \ | 
					
						
							| 
									
										
										
										
											2017-10-05 10:54:22 +01:00
										 |  |  |     return table_.emplace_hint_unique(hint,                                    \ | 
					
						
							|  |  |  |       table::extractor::extract(                                               \ | 
					
						
							|  |  |  |         boost::forward<A0>(a0), boost::forward<A1>(a1)),                       \ | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       boost::unordered::detail::create_emplace_args(                           \ | 
					
						
							|  |  |  |         BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, a)));               \ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 4, _) | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 5, _) | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 6, _) | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 7, _) | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 8, _) | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 9, _) | 
					
						
							|  |  |  |       BOOST_PP_REPEAT_FROM_TO(10, BOOST_PP_INC(BOOST_UNORDERED_EMPLACE_LIMIT), | 
					
						
							| 
									
										
										
										
											2017-04-23 09:44:56 +01:00
										 |  |  |         BOOST_UNORDERED_EMPLACE, _) | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #undef BOOST_UNORDERED_EMPLACE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       std::pair<iterator, bool> insert(value_type const& x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace(x); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       std::pair<iterator, bool> insert(BOOST_UNORDERED_RV_REF(value_type) x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace(boost::move(x)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator insert(const_iterator hint, value_type const& x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace_hint(hint, x); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator insert(const_iterator hint, BOOST_UNORDERED_RV_REF(value_type) x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace_hint(hint, boost::move(x)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class InputIt> void insert(InputIt, InputIt); | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 22:08:01 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       void insert(std::initializer_list<value_type>); | 
					
						
							| 
									
										
										
										
											2009-10-03 16:41:32 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // extract
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       node_type extract(const_iterator position) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         return node_type( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           table_.extract_by_iterator_unique(position), table_.node_alloc()); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       node_type extract(const key_type& k) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return node_type(table_.extract_by_key_impl(k), table_.node_alloc()); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 10:51:05 -08:00
										 |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c< | 
					
						
							|  |  |  |         detail::transparent_non_iterable<Key, unordered_set>::value, | 
					
						
							|  |  |  |         node_type>::type | 
					
						
							|  |  |  |       extract(const Key& k) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         return node_type(table_.extract_by_key_impl(k), table_.node_alloc()); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       insert_return_type insert(BOOST_RV_REF(node_type) np) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         insert_return_type result; | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         table_.move_insert_node_type_unique(np, result); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         return boost::move(result); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator insert(const_iterator hint, BOOST_RV_REF(node_type) np) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return table_.move_insert_node_type_with_hint_unique(hint, np); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-19 09:42:56 +01:00
										 |  |  | #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) ||                               \
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   (BOOST_COMP_GNUC && BOOST_COMP_GNUC < BOOST_VERSION_NUMBER(4, 6, 0)) | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |       // Note: Use r-value node_type to insert.
 | 
					
						
							|  |  |  |       insert_return_type insert(node_type&); | 
					
						
							|  |  |  |       iterator insert(const_iterator, node_type& np); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator erase(const_iterator); | 
					
						
							|  |  |  |       size_type erase(const key_type&); | 
					
						
							|  |  |  |       iterator erase(const_iterator, const_iterator); | 
					
						
							| 
									
										
										
										
											2021-12-23 13:02:54 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c< | 
					
						
							|  |  |  |         detail::transparent_non_iterable<Key, unordered_set>::value, | 
					
						
							|  |  |  |         size_type>::type | 
					
						
							|  |  |  |       erase(BOOST_FWD_REF(Key) k) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.erase_key_unique_impl(boost::forward<Key>(k)); | 
					
						
							| 
									
										
										
										
											2021-12-23 13:02:54 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       BOOST_UNORDERED_DEPRECATED("Use erase instead") | 
					
						
							|  |  |  |       void quick_erase(const_iterator it) { erase(it); } | 
					
						
							|  |  |  |       BOOST_UNORDERED_DEPRECATED("Use erase instead") | 
					
						
							|  |  |  |       void erase_return_void(const_iterator it) { erase(it); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-05 17:48:13 +00:00
										 |  |  |       void swap(unordered_set&) | 
					
						
							|  |  |  |         BOOST_NOEXCEPT_IF(value_allocator_traits::is_always_equal::value&& | 
					
						
							| 
									
										
										
										
											2018-01-27 09:38:19 +00:00
										 |  |  |             boost::is_nothrow_swappable<H>::value&& | 
					
						
							|  |  |  |               boost::is_nothrow_swappable<P>::value); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       void clear() BOOST_NOEXCEPT { table_.clear_impl(); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename H2, typename P2> | 
					
						
							|  |  |  |       void merge(boost::unordered_set<T, H2, P2, A>& source); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename H2, typename P2> | 
					
						
							|  |  |  |       void merge(boost::unordered_set<T, H2, P2, A>&& source); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename H2, typename P2> | 
					
						
							|  |  |  |       void merge(boost::unordered_multiset<T, H2, P2, A>& source); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename H2, typename P2> | 
					
						
							|  |  |  |       void merge(boost::unordered_multiset<T, H2, P2, A>&& source); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // observers
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       hasher hash_function() const; | 
					
						
							|  |  |  |       key_equal key_eq() const; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // lookup
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator find(const key_type&) const; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-23 09:54:12 -08:00
										 |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c<detail::are_transparent<Key, H, P>::value, | 
					
						
							|  |  |  |         const_iterator>::type | 
					
						
							|  |  |  |       find(const Key& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return const_iterator(table_.find(k)); | 
					
						
							| 
									
										
										
										
											2021-12-23 09:54:12 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class CompatibleKey, class CompatibleHash, | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         class CompatiblePredicate> | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator find(CompatibleKey const&, CompatibleHash const&, | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         CompatiblePredicate const&) const; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-12 15:47:34 -08:00
										 |  |  |       bool contains(key_type const& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.find(k) != this->end(); | 
					
						
							| 
									
										
										
										
											2022-01-12 15:47:34 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c<detail::are_transparent<Key, H, P>::value, | 
					
						
							|  |  |  |         bool>::type | 
					
						
							|  |  |  |       contains(const Key& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.find(k) != this->end(); | 
					
						
							| 
									
										
										
										
											2022-01-12 15:47:34 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type count(const key_type&) const; | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-03 13:35:07 -08:00
										 |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c<detail::are_transparent<Key, H, P>::value, | 
					
						
							|  |  |  |         size_type>::type | 
					
						
							|  |  |  |       count(const Key& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.find(k) != this->end() ? 1 : 0; | 
					
						
							| 
									
										
										
										
											2022-01-03 13:35:07 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       std::pair<const_iterator, const_iterator> equal_range( | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         const key_type&) const; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-27 12:08:01 -08:00
										 |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c<detail::are_transparent<Key, H, P>::value, | 
					
						
							|  |  |  |         std::pair<const_iterator, const_iterator> >::type | 
					
						
							|  |  |  |       equal_range(Key const& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         iterator n = table_.find(k); | 
					
						
							|  |  |  |         iterator m = n; | 
					
						
							|  |  |  |         if (m != this->end()) { | 
					
						
							|  |  |  |           ++m; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-12-27 12:08:01 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return std::make_pair(const_iterator(n), const_iterator(m)); | 
					
						
							| 
									
										
										
										
											2021-12-27 12:08:01 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // bucket interface
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type bucket_count() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.bucket_count(); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type max_bucket_count() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return table_.max_bucket_count(); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type bucket_size(size_type) const; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type bucket(const key_type& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return table_.hash_to_bucket(table_.hash(k)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       local_iterator begin(size_type n) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return local_iterator(table_.begin(n)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_local_iterator begin(size_type n) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return const_local_iterator(table_.begin(n)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       local_iterator end(size_type) { return local_iterator(); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_local_iterator end(size_type) const | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         return const_local_iterator(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_local_iterator cbegin(size_type n) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return const_local_iterator(table_.begin(n)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_local_iterator cend(size_type) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return const_local_iterator(); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // hash policy
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       float load_factor() const BOOST_NOEXCEPT; | 
					
						
							|  |  |  |       float max_load_factor() const BOOST_NOEXCEPT { return table_.mlf_; } | 
					
						
							|  |  |  |       void max_load_factor(float) BOOST_NOEXCEPT; | 
					
						
							|  |  |  |       void rehash(size_type); | 
					
						
							|  |  |  |       void reserve(size_type); | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-31 22:47:48 -04:00
										 |  |  | #if !BOOST_WORKAROUND(BOOST_BORLANDC, < 0x0582)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       friend bool operator== | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         <T, H, P, A>(unordered_set const&, unordered_set const&); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       friend bool operator!= | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         <T, H, P, A>(unordered_set const&, unordered_set const&); | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     }; // class template unordered_set
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-19 12:11:36 +00:00
										 |  |  | #if BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class InputIterator, | 
					
						
							|  |  |  |       class Hash = | 
					
						
							|  |  |  |         boost::hash<typename std::iterator_traits<InputIterator>::value_type>, | 
					
						
							|  |  |  |       class Pred = | 
					
						
							|  |  |  |         std::equal_to<typename std::iterator_traits<InputIterator>::value_type>, | 
					
						
							|  |  |  |       class Allocator = std::allocator< | 
					
						
							|  |  |  |         typename std::iterator_traits<InputIterator>::value_type> > | 
					
						
							|  |  |  |     unordered_set(InputIterator, InputIterator, | 
					
						
							|  |  |  |       std::size_t = boost::unordered::detail::default_bucket_count, | 
					
						
							|  |  |  |       Hash = Hash(), Pred = Pred(), Allocator = Allocator()) | 
					
						
							|  |  |  |       ->unordered_set<typename std::iterator_traits<InputIterator>::value_type, | 
					
						
							|  |  |  |         Hash, Pred, Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class Hash = boost::hash<T>, | 
					
						
							|  |  |  |       class Pred = std::equal_to<T>, class Allocator = std::allocator<T> > | 
					
						
							|  |  |  |     unordered_set(std::initializer_list<T>, | 
					
						
							|  |  |  |       std::size_t = boost::unordered::detail::default_bucket_count, | 
					
						
							|  |  |  |       Hash = Hash(), Pred = Pred(), Allocator = Allocator()) | 
					
						
							|  |  |  |       ->unordered_set<T, Hash, Pred, Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class InputIterator, class Allocator> | 
					
						
							|  |  |  |     unordered_set(InputIterator, InputIterator, std::size_t, Allocator) | 
					
						
							|  |  |  |       ->unordered_set<typename std::iterator_traits<InputIterator>::value_type, | 
					
						
							|  |  |  |         boost::hash<typename std::iterator_traits<InputIterator>::value_type>, | 
					
						
							|  |  |  |         std::equal_to<typename std::iterator_traits<InputIterator>::value_type>, | 
					
						
							|  |  |  |         Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class InputIterator, class Hash, class Allocator> | 
					
						
							|  |  |  |     unordered_set(InputIterator, InputIterator, std::size_t, Hash, Allocator) | 
					
						
							|  |  |  |       ->unordered_set<typename std::iterator_traits<InputIterator>::value_type, | 
					
						
							|  |  |  |         Hash, | 
					
						
							|  |  |  |         std::equal_to<typename std::iterator_traits<InputIterator>::value_type>, | 
					
						
							|  |  |  |         Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class Allocator> | 
					
						
							|  |  |  |     unordered_set(std::initializer_list<T>, std::size_t, Allocator) | 
					
						
							|  |  |  |       ->unordered_set<T, boost::hash<T>, std::equal_to<T>, Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class Hash, class Allocator> | 
					
						
							|  |  |  |     unordered_set(std::initializer_list<T>, std::size_t, Hash, Allocator) | 
					
						
							|  |  |  |       ->unordered_set<T, Hash, std::equal_to<T>, Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> class unordered_multiset | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #if defined(BOOST_UNORDERED_USE_MOVE)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       BOOST_COPYABLE_AND_MOVABLE(unordered_multiset) | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename, typename, typename, typename> | 
					
						
							|  |  |  |       friend class unordered_set; | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							|  |  |  |       typedef T key_type; | 
					
						
							|  |  |  |       typedef T value_type; | 
					
						
							|  |  |  |       typedef H hasher; | 
					
						
							|  |  |  |       typedef P key_equal; | 
					
						
							|  |  |  |       typedef A allocator_type; | 
					
						
							| 
									
										
										
										
											2009-08-30 16:42:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     private: | 
					
						
							|  |  |  |       typedef boost::unordered::detail::set<A, T, H, P> types; | 
					
						
							|  |  |  |       typedef typename types::value_allocator_traits value_allocator_traits; | 
					
						
							|  |  |  |       typedef typename types::table table; | 
					
						
							| 
									
										
										
										
											2009-11-20 08:03:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							|  |  |  |       typedef typename value_allocator_traits::pointer pointer; | 
					
						
							|  |  |  |       typedef typename value_allocator_traits::const_pointer const_pointer; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef value_type& reference; | 
					
						
							|  |  |  |       typedef value_type const& const_reference; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef std::size_t size_type; | 
					
						
							|  |  |  |       typedef std::ptrdiff_t difference_type; | 
					
						
							| 
									
										
										
										
											2011-08-11 21:17:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       typedef typename table::c_iterator iterator; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef typename table::c_iterator const_iterator; | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       typedef typename table::cl_iterator local_iterator; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef typename table::cl_iterator const_local_iterator; | 
					
						
							|  |  |  |       typedef typename types::node_type node_type; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     private: | 
					
						
							|  |  |  |       table table_; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							|  |  |  |       // constructors
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset(); | 
					
						
							| 
									
										
										
										
											2009-08-30 16:42:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       explicit unordered_multiset(size_type, const hasher& = hasher(), | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         const key_equal& = key_equal(), | 
					
						
							|  |  |  |         const allocator_type& = allocator_type()); | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class InputIt> | 
					
						
							|  |  |  |       unordered_multiset(InputIt, InputIt, | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         size_type = boost::unordered::detail::default_bucket_count, | 
					
						
							|  |  |  |         const hasher& = hasher(), const key_equal& = key_equal(), | 
					
						
							|  |  |  |         const allocator_type& = allocator_type()); | 
					
						
							| 
									
										
										
										
											2011-08-03 08:34:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset(unordered_multiset const&); | 
					
						
							| 
									
										
										
										
											2011-08-07 10:22:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #if defined(BOOST_UNORDERED_USE_MOVE) ||                                       \
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) | 
					
						
							|  |  |  |       unordered_multiset(BOOST_RV_REF(unordered_multiset) other) | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         BOOST_NOEXCEPT_IF(table::nothrow_move_constructible) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           : table_(other.table_, boost::unordered::detail::move_tag()) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         // The move is done in table_
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-08-03 08:34:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       explicit unordered_multiset(allocator_type const&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset(unordered_multiset const&, allocator_type const&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset( | 
					
						
							|  |  |  |         BOOST_RV_REF(unordered_multiset), allocator_type const&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 22:08:01 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset(std::initializer_list<value_type>, | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         size_type = boost::unordered::detail::default_bucket_count, | 
					
						
							|  |  |  |         const hasher& = hasher(), const key_equal& l = key_equal(), | 
					
						
							|  |  |  |         const allocator_type& = allocator_type()); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       explicit unordered_multiset(size_type, const allocator_type&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       explicit unordered_multiset( | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         size_type, const hasher&, const allocator_type&); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class InputIt> | 
					
						
							|  |  |  |       unordered_multiset(InputIt, InputIt, size_type, const allocator_type&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class InputIt> | 
					
						
							|  |  |  |       unordered_multiset( | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         InputIt, InputIt, size_type, const hasher&, const allocator_type&); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset( | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         std::initializer_list<value_type>, size_type, const allocator_type&); | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset(std::initializer_list<value_type>, size_type, | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         const hasher&, const allocator_type&); | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // Destructor
 | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       ~unordered_multiset() BOOST_NOEXCEPT; | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | // Assign
 | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #if defined(BOOST_UNORDERED_USE_MOVE)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset& operator=(BOOST_COPY_ASSIGN_REF(unordered_multiset) x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.assign(x.table_, boost::unordered::detail::false_type()); | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return *this; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       unordered_multiset& operator=(BOOST_RV_REF(unordered_multiset) x) | 
					
						
							| 
									
										
										
										
											2018-01-05 17:54:44 +00:00
										 |  |  |         BOOST_NOEXCEPT_IF(value_allocator_traits::is_always_equal::value&& | 
					
						
							|  |  |  |             boost::is_nothrow_move_assignable<H>::value&& | 
					
						
							|  |  |  |               boost::is_nothrow_move_assignable<P>::value) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.move_assign(x.table_, boost::unordered::detail::false_type()); | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return *this; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset& operator=(unordered_multiset const& x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.assign(x.table_, boost::unordered::detail::false_type()); | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return *this; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-21 01:21:54 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset& operator=(unordered_multiset&& x) | 
					
						
							| 
									
										
										
										
											2018-01-05 17:54:44 +00:00
										 |  |  |         BOOST_NOEXCEPT_IF(value_allocator_traits::is_always_equal::value&& | 
					
						
							|  |  |  |             boost::is_nothrow_move_assignable<H>::value&& | 
					
						
							|  |  |  |               boost::is_nothrow_move_assignable<P>::value) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.move_assign(x.table_, boost::unordered::detail::false_type()); | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return *this; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-01-06 08:35:51 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 22:08:01 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       unordered_multiset& operator=(std::initializer_list<value_type>); | 
					
						
							| 
									
										
										
										
											2008-12-04 21:30:19 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       allocator_type get_allocator() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return table_.node_alloc(); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // iterators
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator begin() BOOST_NOEXCEPT { return iterator(table_.begin()); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator begin() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return const_iterator(table_.begin()); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator end() BOOST_NOEXCEPT { return iterator(); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator end() const BOOST_NOEXCEPT { return const_iterator(); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator cbegin() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return const_iterator(table_.begin()); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator cend() const BOOST_NOEXCEPT { return const_iterator(); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // size and capacity
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-23 14:26:28 -08:00
										 |  |  |       BOOST_ATTRIBUTE_NODISCARD bool empty() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         return table_.size_ == 0; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type size() const BOOST_NOEXCEPT { return table_.size_; } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type max_size() const BOOST_NOEXCEPT; | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | // emplace
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-21 01:21:54 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
					
						
							| 
									
										
										
										
											2017-04-23 10:09:18 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class... Args> iterator emplace(BOOST_FWD_REF(Args)... args) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return iterator(table_.emplace_equiv( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::func::construct_node_from_args( | 
					
						
							|  |  |  |             table_.node_alloc(), boost::forward<Args>(args)...))); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-10 21:25:09 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 18:23:23 +01:00
										 |  |  | #if !BOOST_UNORDERED_SUN_WORKAROUNDS1
 | 
					
						
							| 
									
										
										
										
											2011-11-30 08:21:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // 0 argument emplace requires special treatment in case
 | 
					
						
							|  |  |  |       // the container is instantiated with a value type that
 | 
					
						
							|  |  |  |       // doesn't have a default constructor.
 | 
					
						
							| 
									
										
										
										
											2011-11-30 08:21:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator emplace(boost::unordered::detail::empty_emplace = | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |                          boost::unordered::detail::empty_emplace(), | 
					
						
							|  |  |  |         value_type v = value_type()) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace(boost::move(v)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename A0> iterator emplace(BOOST_FWD_REF(A0) a0) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return iterator(table_.emplace_equiv( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::func::construct_node_from_args( | 
					
						
							|  |  |  |             table_.node_alloc(), boost::unordered::detail::create_emplace_args( | 
					
						
							|  |  |  |                                    boost::forward<A0>(a0))))); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       template <typename A0, typename A1> | 
					
						
							|  |  |  |       iterator emplace(BOOST_FWD_REF(A0) a0, BOOST_FWD_REF(A1) a1) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return iterator(table_.emplace_equiv( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::func::construct_node_from_args( | 
					
						
							|  |  |  |             table_.node_alloc(), | 
					
						
							|  |  |  |             boost::unordered::detail::create_emplace_args( | 
					
						
							|  |  |  |               boost::forward<A0>(a0), boost::forward<A1>(a1))))); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename A0, typename A1, typename A2> | 
					
						
							|  |  |  |       iterator emplace( | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         BOOST_FWD_REF(A0) a0, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return iterator(table_.emplace_equiv( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::func::construct_node_from_args( | 
					
						
							|  |  |  |             table_.node_alloc(), | 
					
						
							|  |  |  |             boost::unordered::detail::create_emplace_args( | 
					
						
							|  |  |  |               boost::forward<A0>(a0), boost::forward<A1>(a1), | 
					
						
							|  |  |  |               boost::forward<A2>(a2))))); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class... Args> | 
					
						
							|  |  |  |       iterator emplace_hint(const_iterator hint, BOOST_FWD_REF(Args)... args) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return iterator(table_.emplace_hint_equiv( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           hint, boost::unordered::detail::func::construct_node_from_args( | 
					
						
							|  |  |  |                   table_.node_alloc(), boost::forward<Args>(args)...))); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-16 18:23:23 +01:00
										 |  |  | #if !BOOST_UNORDERED_SUN_WORKAROUNDS1
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator emplace_hint(const_iterator hint, | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         boost::unordered::detail::empty_emplace = | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::empty_emplace(), | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         value_type v = value_type()) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace_hint(hint, boost::move(v)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename A0> | 
					
						
							|  |  |  |       iterator emplace_hint(const_iterator hint, BOOST_FWD_REF(A0) a0) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-10-05 10:54:22 +01:00
										 |  |  |         return iterator(table_.emplace_hint_equiv(hint, | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::func::construct_node_from_args( | 
					
						
							|  |  |  |             table_.node_alloc(), boost::unordered::detail::create_emplace_args( | 
					
						
							|  |  |  |                                    boost::forward<A0>(a0))))); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       template <typename A0, typename A1> | 
					
						
							|  |  |  |       iterator emplace_hint( | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         const_iterator hint, BOOST_FWD_REF(A0) a0, BOOST_FWD_REF(A1) a1) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return iterator(table_.emplace_hint_equiv( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           hint, boost::unordered::detail::func::construct_node_from_args( | 
					
						
							|  |  |  |                   table_.node_alloc(), | 
					
						
							|  |  |  |                   boost::unordered::detail::create_emplace_args( | 
					
						
							|  |  |  |                     boost::forward<A0>(a0), boost::forward<A1>(a1))))); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename A0, typename A1, typename A2> | 
					
						
							|  |  |  |       iterator emplace_hint(const_iterator hint, BOOST_FWD_REF(A0) a0, | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return iterator(table_.emplace_hint_equiv( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           hint, boost::unordered::detail::func::construct_node_from_args( | 
					
						
							|  |  |  |                   table_.node_alloc(), | 
					
						
							|  |  |  |                   boost::unordered::detail::create_emplace_args( | 
					
						
							|  |  |  |                     boost::forward<A0>(a0), boost::forward<A1>(a1), | 
					
						
							|  |  |  |                     boost::forward<A2>(a2))))); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | #define BOOST_UNORDERED_EMPLACE(z, n, _)                                       \
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)>                          \ | 
					
						
							|  |  |  |   iterator emplace(BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a))         \ | 
					
						
							|  |  |  |   {                                                                            \ | 
					
						
							|  |  |  |     return iterator(table_.emplace_equiv(                                      \ | 
					
						
							|  |  |  |       boost::unordered::detail::func::construct_node_from_args(                \ | 
					
						
							|  |  |  |         table_.node_alloc(),                                                   \ | 
					
						
							|  |  |  |         boost::unordered::detail::create_emplace_args(                         \ | 
					
						
							|  |  |  |           BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, a)))));           \ | 
					
						
							|  |  |  |   }                                                                            \ | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |                                                                                \ | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)>                          \ | 
					
						
							|  |  |  |   iterator emplace_hint(                                                       \ | 
					
						
							|  |  |  |     const_iterator hint, BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_FWD_PARAM, a))   \ | 
					
						
							|  |  |  |   {                                                                            \ | 
					
						
							|  |  |  |     return iterator(table_.emplace_hint_equiv(                                 \ | 
					
						
							|  |  |  |       hint, boost::unordered::detail::func::construct_node_from_args(          \ | 
					
						
							|  |  |  |               table_.node_alloc(),                                             \ | 
					
						
							|  |  |  |               boost::unordered::detail::create_emplace_args(                   \ | 
					
						
							|  |  |  |                 BOOST_PP_ENUM_##z(n, BOOST_UNORDERED_CALL_FORWARD, a)))));     \ | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 4, _) | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 5, _) | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 6, _) | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 7, _) | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 8, _) | 
					
						
							|  |  |  |       BOOST_UNORDERED_EMPLACE(1, 9, _) | 
					
						
							|  |  |  |       BOOST_PP_REPEAT_FROM_TO(10, BOOST_PP_INC(BOOST_UNORDERED_EMPLACE_LIMIT), | 
					
						
							| 
									
										
										
										
											2017-04-23 09:44:56 +01:00
										 |  |  |         BOOST_UNORDERED_EMPLACE, _) | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | #undef BOOST_UNORDERED_EMPLACE
 | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator insert(value_type const& x) { return this->emplace(x); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator insert(BOOST_UNORDERED_RV_REF(value_type) x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace(boost::move(x)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator insert(const_iterator hint, value_type const& x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace_hint(hint, x); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator insert(const_iterator hint, BOOST_UNORDERED_RV_REF(value_type) x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return this->emplace_hint(hint, boost::move(x)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class InputIt> void insert(InputIt, InputIt); | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       void insert(std::initializer_list<value_type>); | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // extract
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       node_type extract(const_iterator position) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  |         return node_type( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           table_.extract_by_iterator_equiv(position), table_.node_alloc()); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       node_type extract(const key_type& k) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return node_type(table_.extract_by_key_impl(k), table_.node_alloc()); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 11:37:51 -08:00
										 |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c< | 
					
						
							|  |  |  |         detail::transparent_non_iterable<Key, unordered_multiset>::value, | 
					
						
							|  |  |  |         node_type>::type | 
					
						
							|  |  |  |       extract(const Key& k) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         return node_type(table_.extract_by_key_impl(k), table_.node_alloc()); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator insert(BOOST_RV_REF(node_type) np) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return table_.move_insert_node_type_equiv(np); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator insert(const_iterator hint, BOOST_RV_REF(node_type) np) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         return table_.move_insert_node_type_with_hint_equiv(hint, np); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-19 09:42:56 +01:00
										 |  |  | #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) ||                               \
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   (BOOST_COMP_GNUC && BOOST_COMP_GNUC < BOOST_VERSION_NUMBER(4, 6, 0)) | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |       // Note: Use r-value node_type to insert.
 | 
					
						
							|  |  |  |       iterator insert(node_type&); | 
					
						
							|  |  |  |       iterator insert(const_iterator, node_type& np); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator erase(const_iterator); | 
					
						
							|  |  |  |       size_type erase(const key_type&); | 
					
						
							| 
									
										
										
										
											2021-12-30 11:29:21 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c< | 
					
						
							|  |  |  |         detail::transparent_non_iterable<Key, unordered_multiset>::value, | 
					
						
							|  |  |  |         size_type>::type | 
					
						
							|  |  |  |       erase(const Key& k) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.erase_key_equiv_impl(k); | 
					
						
							| 
									
										
										
										
											2021-12-30 11:29:21 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       iterator erase(const_iterator, const_iterator); | 
					
						
							|  |  |  |       BOOST_UNORDERED_DEPRECATED("Use erase instead") | 
					
						
							|  |  |  |       void quick_erase(const_iterator it) { erase(it); } | 
					
						
							|  |  |  |       BOOST_UNORDERED_DEPRECATED("Use erase instead") | 
					
						
							|  |  |  |       void erase_return_void(const_iterator it) { erase(it); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-05 17:48:13 +00:00
										 |  |  |       void swap(unordered_multiset&) | 
					
						
							|  |  |  |         BOOST_NOEXCEPT_IF(value_allocator_traits::is_always_equal::value&& | 
					
						
							| 
									
										
										
										
											2018-01-27 09:38:19 +00:00
										 |  |  |             boost::is_nothrow_swappable<H>::value&& | 
					
						
							|  |  |  |               boost::is_nothrow_swappable<P>::value); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       void clear() BOOST_NOEXCEPT { table_.clear_impl(); } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename H2, typename P2> | 
					
						
							|  |  |  |       void merge(boost::unordered_multiset<T, H2, P2, A>& source); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename H2, typename P2> | 
					
						
							|  |  |  |       void merge(boost::unordered_multiset<T, H2, P2, A>&& source); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename H2, typename P2> | 
					
						
							|  |  |  |       void merge(boost::unordered_set<T, H2, P2, A>& source); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename H2, typename P2> | 
					
						
							|  |  |  |       void merge(boost::unordered_set<T, H2, P2, A>&& source); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // observers
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       hasher hash_function() const; | 
					
						
							|  |  |  |       key_equal key_eq() const; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // lookup
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator find(const key_type&) const; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-29 11:42:46 -08:00
										 |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c<detail::are_transparent<Key, H, P>::value, | 
					
						
							|  |  |  |         const_iterator>::type | 
					
						
							|  |  |  |       find(const Key& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.find(k); | 
					
						
							| 
									
										
										
										
											2021-12-29 11:42:46 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <class CompatibleKey, class CompatibleHash, | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         class CompatiblePredicate> | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_iterator find(CompatibleKey const&, CompatibleHash const&, | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         CompatiblePredicate const&) const; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-13 09:16:03 -08:00
										 |  |  |       bool contains(const key_type& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.find(k) != this->end(); | 
					
						
							| 
									
										
										
										
											2022-01-13 09:16:03 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c<detail::are_transparent<Key, H, P>::value, | 
					
						
							|  |  |  |         bool>::type | 
					
						
							|  |  |  |       contains(const Key& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.find(k) != this->end(); | 
					
						
							| 
									
										
										
										
											2022-01-13 09:16:03 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type count(const key_type&) const; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-03 14:43:51 -08:00
										 |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c<detail::are_transparent<Key, H, P>::value, | 
					
						
							|  |  |  |         size_type>::type | 
					
						
							|  |  |  |       count(const Key& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.group_count(k); | 
					
						
							| 
									
										
										
										
											2022-01-03 14:43:51 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       std::pair<const_iterator, const_iterator> equal_range( | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         const key_type&) const; | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-29 10:25:09 -08:00
										 |  |  |       template <class Key> | 
					
						
							|  |  |  |       typename boost::enable_if_c<detail::are_transparent<Key, H, P>::value, | 
					
						
							|  |  |  |         std::pair<const_iterator, const_iterator> >::type | 
					
						
							|  |  |  |       equal_range(const Key& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         iterator first = table_.find(k); | 
					
						
							|  |  |  |         iterator last = table_.next_group(k, first); | 
					
						
							|  |  |  |         return std::make_pair(const_iterator(first), const_iterator(last)); | 
					
						
							| 
									
										
										
										
											2021-12-29 10:25:09 -08:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // bucket interface
 | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type bucket_count() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return table_.bucket_count(); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-10-23 13:31:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type max_bucket_count() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return table_.max_bucket_count(); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type bucket_size(size_type) const; | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       size_type bucket(const key_type& k) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return table_.hash_to_bucket(table_.hash(k)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-10-23 13:31:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       local_iterator begin(size_type n) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return local_iterator(table_.begin(n)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-10-23 13:31:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_local_iterator begin(size_type n) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return const_local_iterator(table_.begin(n)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       local_iterator end(size_type) { return local_iterator(); } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_local_iterator end(size_type) const | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         return const_local_iterator(); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_local_iterator cbegin(size_type n) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |         return const_local_iterator(table_.begin(n)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       const_local_iterator cend(size_type) const | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         return const_local_iterator(); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // hash policy
 | 
					
						
							| 
									
										
										
										
											2016-10-23 13:31:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       float load_factor() const BOOST_NOEXCEPT; | 
					
						
							|  |  |  |       float max_load_factor() const BOOST_NOEXCEPT { return table_.mlf_; } | 
					
						
							|  |  |  |       void max_load_factor(float) BOOST_NOEXCEPT; | 
					
						
							|  |  |  |       void rehash(size_type); | 
					
						
							|  |  |  |       void reserve(size_type); | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-31 22:47:48 -04:00
										 |  |  | #if !BOOST_WORKAROUND(BOOST_BORLANDC, < 0x0582)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       friend bool operator== | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         <T, H, P, A>(unordered_multiset const&, unordered_multiset const&); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       friend bool operator!= | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         <T, H, P, A>(unordered_multiset const&, unordered_multiset const&); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     }; // class template unordered_multiset
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-19 12:11:36 +00:00
										 |  |  | #if BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class InputIterator, | 
					
						
							|  |  |  |       class Hash = | 
					
						
							|  |  |  |         boost::hash<typename std::iterator_traits<InputIterator>::value_type>, | 
					
						
							|  |  |  |       class Pred = | 
					
						
							|  |  |  |         std::equal_to<typename std::iterator_traits<InputIterator>::value_type>, | 
					
						
							|  |  |  |       class Allocator = std::allocator< | 
					
						
							|  |  |  |         typename std::iterator_traits<InputIterator>::value_type> > | 
					
						
							|  |  |  |     unordered_multiset(InputIterator, InputIterator, | 
					
						
							|  |  |  |       std::size_t = boost::unordered::detail::default_bucket_count, | 
					
						
							|  |  |  |       Hash = Hash(), Pred = Pred(), Allocator = Allocator()) | 
					
						
							|  |  |  |       ->unordered_multiset< | 
					
						
							|  |  |  |         typename std::iterator_traits<InputIterator>::value_type, Hash, Pred, | 
					
						
							|  |  |  |         Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class Hash = boost::hash<T>, | 
					
						
							|  |  |  |       class Pred = std::equal_to<T>, class Allocator = std::allocator<T> > | 
					
						
							|  |  |  |     unordered_multiset(std::initializer_list<T>, | 
					
						
							|  |  |  |       std::size_t = boost::unordered::detail::default_bucket_count, | 
					
						
							|  |  |  |       Hash = Hash(), Pred = Pred(), Allocator = Allocator()) | 
					
						
							|  |  |  |       ->unordered_multiset<T, Hash, Pred, Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class InputIterator, class Allocator> | 
					
						
							|  |  |  |     unordered_multiset(InputIterator, InputIterator, std::size_t, Allocator) | 
					
						
							|  |  |  |       ->unordered_multiset< | 
					
						
							|  |  |  |         typename std::iterator_traits<InputIterator>::value_type, | 
					
						
							|  |  |  |         boost::hash<typename std::iterator_traits<InputIterator>::value_type>, | 
					
						
							|  |  |  |         std::equal_to<typename std::iterator_traits<InputIterator>::value_type>, | 
					
						
							|  |  |  |         Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class InputIterator, class Hash, class Allocator> | 
					
						
							|  |  |  |     unordered_multiset( | 
					
						
							|  |  |  |       InputIterator, InputIterator, std::size_t, Hash, Allocator) | 
					
						
							|  |  |  |       ->unordered_multiset< | 
					
						
							|  |  |  |         typename std::iterator_traits<InputIterator>::value_type, Hash, | 
					
						
							|  |  |  |         std::equal_to<typename std::iterator_traits<InputIterator>::value_type>, | 
					
						
							|  |  |  |         Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class Allocator> | 
					
						
							|  |  |  |     unordered_multiset(std::initializer_list<T>, std::size_t, Allocator) | 
					
						
							|  |  |  |       ->unordered_multiset<T, boost::hash<T>, std::equal_to<T>, Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class Hash, class Allocator> | 
					
						
							|  |  |  |     unordered_multiset(std::initializer_list<T>, std::size_t, Hash, Allocator) | 
					
						
							|  |  |  |       ->unordered_multiset<T, Hash, std::equal_to<T>, Allocator>; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     ////////////////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set(size_type n, const hasher& hf, | 
					
						
							|  |  |  |       const key_equal& eql, const allocator_type& a) | 
					
						
							|  |  |  |         : table_(n, hf, eql, a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <class InputIt> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set(InputIt f, InputIt l, size_type n, | 
					
						
							|  |  |  |       const hasher& hf, const key_equal& eql, const allocator_type& a) | 
					
						
							|  |  |  |         : table_(boost::unordered::detail::initial_size(f, l, n), hf, eql, a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(f, l); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set(unordered_set const& other) | 
					
						
							|  |  |  |         : table_(other.table_, | 
					
						
							|  |  |  |             unordered_set::value_allocator_traits:: | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |               select_on_container_copy_construction(other.get_allocator())) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       if (other.size()) { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.copy_buckets( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           other.table_, boost::unordered::detail::true_type()); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set(allocator_type const& a) | 
					
						
							|  |  |  |         : table_(boost::unordered::detail::default_bucket_count, hasher(), | 
					
						
							|  |  |  |             key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set( | 
					
						
							|  |  |  |       unordered_set const& other, allocator_type const& a) | 
					
						
							|  |  |  |         : table_(other.table_, a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       if (other.table_.size_) { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.copy_buckets( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           other.table_, boost::unordered::detail::true_type()); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set( | 
					
						
							|  |  |  |       BOOST_RV_REF(unordered_set) other, allocator_type const& a) | 
					
						
							|  |  |  |         : table_(other.table_, a, boost::unordered::detail::move_tag()) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-10-05 10:54:23 +01:00
										 |  |  |       table_.move_construct_buckets(other.table_); | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set( | 
					
						
							|  |  |  |       std::initializer_list<value_type> list, size_type n, const hasher& hf, | 
					
						
							|  |  |  |       const key_equal& eql, const allocator_type& a) | 
					
						
							|  |  |  |         : table_( | 
					
						
							|  |  |  |             boost::unordered::detail::initial_size(list.begin(), list.end(), n), | 
					
						
							|  |  |  |             hf, eql, a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(list.begin(), list.end()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set( | 
					
						
							|  |  |  |       size_type n, const allocator_type& a) | 
					
						
							|  |  |  |         : table_(n, hasher(), key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set( | 
					
						
							|  |  |  |       size_type n, const hasher& hf, const allocator_type& a) | 
					
						
							|  |  |  |         : table_(n, hf, key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <class InputIt> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set( | 
					
						
							|  |  |  |       InputIt f, InputIt l, size_type n, const allocator_type& a) | 
					
						
							|  |  |  |         : table_(boost::unordered::detail::initial_size(f, l, n), hasher(), | 
					
						
							|  |  |  |             key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(f, l); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <class InputIt> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set(InputIt f, InputIt l, size_type n, | 
					
						
							|  |  |  |       const hasher& hf, const allocator_type& a) | 
					
						
							|  |  |  |         : table_( | 
					
						
							|  |  |  |             boost::unordered::detail::initial_size(f, l, n), hf, key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(f, l); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 22:08:01 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set( | 
					
						
							|  |  |  |       std::initializer_list<value_type> list, size_type n, | 
					
						
							|  |  |  |       const allocator_type& a) | 
					
						
							|  |  |  |         : table_( | 
					
						
							|  |  |  |             boost::unordered::detail::initial_size(list.begin(), list.end(), n), | 
					
						
							|  |  |  |             hasher(), key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(list.begin(), list.end()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::unordered_set( | 
					
						
							|  |  |  |       std::initializer_list<value_type> list, size_type n, const hasher& hf, | 
					
						
							|  |  |  |       const allocator_type& a) | 
					
						
							|  |  |  |         : table_( | 
					
						
							|  |  |  |             boost::unordered::detail::initial_size(list.begin(), list.end(), n), | 
					
						
							|  |  |  |             hf, key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(list.begin(), list.end()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::~unordered_set() BOOST_NOEXCEPT | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>& unordered_set<T, H, P, A>::operator=( | 
					
						
							|  |  |  |       std::initializer_list<value_type> list) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->clear(); | 
					
						
							|  |  |  |       this->insert(list.begin(), list.end()); | 
					
						
							|  |  |  |       return *this; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     // size and capacity
 | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     std::size_t unordered_set<T, H, P, A>::max_size() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       using namespace std; | 
					
						
							| 
									
										
										
										
											2017-04-23 10:09:18 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // size < mlf_ * count
 | 
					
						
							|  |  |  |       return boost::unordered::detail::double_to_size( | 
					
						
							| 
									
										
										
										
											2017-04-23 10:09:18 +01:00
										 |  |  |                ceil(static_cast<double>(table_.mlf_) * | 
					
						
							|  |  |  |                     static_cast<double>(table_.max_bucket_count()))) - | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |              1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     // modifiers
 | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <class InputIt> | 
					
						
							|  |  |  |     void unordered_set<T, H, P, A>::insert(InputIt first, InputIt last) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       if (first != last) { | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |         table_.insert_range_unique( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           table::extractor::extract(*first), first, last); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-23 10:09:18 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     void unordered_set<T, H, P, A>::insert( | 
					
						
							|  |  |  |       std::initializer_list<value_type> list) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(list.begin(), list.end()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_set<T, H, P, A>::iterator | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::erase(const_iterator position) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-07-25 11:35:38 -07:00
										 |  |  |       return table_.erase_node(position); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_set<T, H, P, A>::size_type | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::erase(const key_type& k) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       return table_.erase_key_unique_impl(k); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_set<T, H, P, A>::iterator | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::erase(const_iterator first, const_iterator last) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       return table_.erase_nodes_range(first, last); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     void unordered_set<T, H, P, A>::swap(unordered_set& other) | 
					
						
							| 
									
										
										
										
											2018-01-05 17:48:13 +00:00
										 |  |  |       BOOST_NOEXCEPT_IF(value_allocator_traits::is_always_equal::value&& | 
					
						
							| 
									
										
										
										
											2018-01-27 09:38:19 +00:00
										 |  |  |           boost::is_nothrow_swappable<H>::value&& | 
					
						
							|  |  |  |             boost::is_nothrow_swappable<P>::value) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |       table_.swap(other.table_); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // observers
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_set<T, H, P, A>::hasher | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::hash_function() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return table_.hash_function(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_set<T, H, P, A>::key_equal | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::key_eq() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return table_.key_eq(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <typename H2, typename P2> | 
					
						
							|  |  |  |     void unordered_set<T, H, P, A>::merge( | 
					
						
							|  |  |  |       boost::unordered_set<T, H2, P2, A>& source) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       table_.merge_unique(source.table_); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <typename H2, typename P2> | 
					
						
							|  |  |  |     void unordered_set<T, H, P, A>::merge( | 
					
						
							|  |  |  |       boost::unordered_set<T, H2, P2, A>&& source) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       table_.merge_unique(source.table_); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <typename H2, typename P2> | 
					
						
							|  |  |  |     void unordered_set<T, H, P, A>::merge( | 
					
						
							|  |  |  |       boost::unordered_multiset<T, H2, P2, A>& source) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       table_.merge_unique(source.table_); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <typename H2, typename P2> | 
					
						
							|  |  |  |     void unordered_set<T, H, P, A>::merge( | 
					
						
							|  |  |  |       boost::unordered_multiset<T, H2, P2, A>&& source) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       table_.merge_unique(source.table_); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     // lookup
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_set<T, H, P, A>::const_iterator | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::find(const key_type& k) const | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       return const_iterator(table_.find(k)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <class CompatibleKey, class CompatibleHash, | 
					
						
							|  |  |  |       class CompatiblePredicate> | 
					
						
							|  |  |  |     typename unordered_set<T, H, P, A>::const_iterator | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::find(CompatibleKey const& k, | 
					
						
							|  |  |  |       CompatibleHash const& hash, CompatiblePredicate const& eq) const | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       return table_.transparent_find(k, hash, eq); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_set<T, H, P, A>::size_type | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::count(const key_type& k) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return table_.find_node(k) ? 1 : 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     std::pair<typename unordered_set<T, H, P, A>::const_iterator, | 
					
						
							|  |  |  |       typename unordered_set<T, H, P, A>::const_iterator> | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::equal_range(const key_type& k) const | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       iterator first = table_.find(k); | 
					
						
							|  |  |  |       iterator second = first; | 
					
						
							|  |  |  |       if (second != this->end()) { | 
					
						
							|  |  |  |         ++second; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       return std::make_pair(first, second); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_set<T, H, P, A>::size_type | 
					
						
							|  |  |  |     unordered_set<T, H, P, A>::bucket_size(size_type n) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return table_.bucket_size(n); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // hash policy
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     float unordered_set<T, H, P, A>::load_factor() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-08-16 14:34:58 -07:00
										 |  |  |       if (table_.size_ == 0) { | 
					
						
							|  |  |  |         return 0.0f; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       BOOST_ASSERT(table_.bucket_count() != 0); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       return static_cast<float>(table_.size_) / | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |              static_cast<float>(table_.bucket_count()); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     void unordered_set<T, H, P, A>::max_load_factor(float m) BOOST_NOEXCEPT | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       table_.max_load_factor(m); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     void unordered_set<T, H, P, A>::rehash(size_type n) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       table_.rehash(n); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     void unordered_set<T, H, P, A>::reserve(size_type n) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       table_.reserve(n); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     inline bool operator==( | 
					
						
							|  |  |  |       unordered_set<T, H, P, A> const& m1, unordered_set<T, H, P, A> const& m2) | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-03-31 22:47:48 -04:00
										 |  |  | #if BOOST_WORKAROUND(BOOST_CODEGEARC, BOOST_TESTED_AT(0x0613))
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       struct dummy | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         unordered_set<T, H, P, A> x; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       return m1.table_.equals_unique(m2.table_); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     inline bool operator!=( | 
					
						
							|  |  |  |       unordered_set<T, H, P, A> const& m1, unordered_set<T, H, P, A> const& m2) | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-03-31 22:47:48 -04:00
										 |  |  | #if BOOST_WORKAROUND(BOOST_CODEGEARC, BOOST_TESTED_AT(0x0613))
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       struct dummy | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         unordered_set<T, H, P, A> x; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       return !m1.table_.equals_unique(m2.table_); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     inline void swap( | 
					
						
							|  |  |  |       unordered_set<T, H, P, A>& m1, unordered_set<T, H, P, A>& m2) | 
					
						
							|  |  |  |       BOOST_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(m1.swap(m2))) | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-03-31 22:47:48 -04:00
										 |  |  | #if BOOST_WORKAROUND(BOOST_CODEGEARC, BOOST_TESTED_AT(0x0613))
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       struct dummy | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         unordered_set<T, H, P, A> x; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       m1.swap(m2); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-22 15:14:14 -08:00
										 |  |  |     template <class K, class H, class P, class A, class Predicate> | 
					
						
							|  |  |  |     typename unordered_set<K, H, P, A>::size_type erase_if( | 
					
						
							|  |  |  |       unordered_set<K, H, P, A>& c, Predicate pred) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return detail::erase_if(c, pred); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     ////////////////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset(size_type n, | 
					
						
							|  |  |  |       const hasher& hf, const key_equal& eql, const allocator_type& a) | 
					
						
							|  |  |  |         : table_(n, hf, eql, a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <class InputIt> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset(InputIt f, InputIt l, | 
					
						
							|  |  |  |       size_type n, const hasher& hf, const key_equal& eql, | 
					
						
							|  |  |  |       const allocator_type& a) | 
					
						
							|  |  |  |         : table_(boost::unordered::detail::initial_size(f, l, n), hf, eql, a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(f, l); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset( | 
					
						
							|  |  |  |       unordered_multiset const& other) | 
					
						
							|  |  |  |         : table_(other.table_, | 
					
						
							|  |  |  |             unordered_multiset::value_allocator_traits:: | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |               select_on_container_copy_construction(other.get_allocator())) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |       if (other.table_.size_) { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.copy_buckets( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           other.table_, boost::unordered::detail::false_type()); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset(allocator_type const& a) | 
					
						
							|  |  |  |         : table_(boost::unordered::detail::default_bucket_count, hasher(), | 
					
						
							|  |  |  |             key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset( | 
					
						
							|  |  |  |       unordered_multiset const& other, allocator_type const& a) | 
					
						
							|  |  |  |         : table_(other.table_, a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       if (other.table_.size_) { | 
					
						
							| 
									
										
										
										
											2017-05-06 04:58:57 +01:00
										 |  |  |         table_.copy_buckets( | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           other.table_, boost::unordered::detail::false_type()); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-10-23 13:31:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset( | 
					
						
							|  |  |  |       BOOST_RV_REF(unordered_multiset) other, allocator_type const& a) | 
					
						
							|  |  |  |         : table_(other.table_, a, boost::unordered::detail::move_tag()) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-10-05 10:54:23 +01:00
										 |  |  |       table_.move_construct_buckets(other.table_); | 
					
						
							| 
									
										
										
										
											2017-04-24 09:46:05 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset( | 
					
						
							|  |  |  |       std::initializer_list<value_type> list, size_type n, const hasher& hf, | 
					
						
							|  |  |  |       const key_equal& eql, const allocator_type& a) | 
					
						
							|  |  |  |         : table_( | 
					
						
							|  |  |  |             boost::unordered::detail::initial_size(list.begin(), list.end(), n), | 
					
						
							|  |  |  |             hf, eql, a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(list.begin(), list.end()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset( | 
					
						
							|  |  |  |       size_type n, const allocator_type& a) | 
					
						
							|  |  |  |         : table_(n, hasher(), key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset( | 
					
						
							|  |  |  |       size_type n, const hasher& hf, const allocator_type& a) | 
					
						
							|  |  |  |         : table_(n, hf, key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <class InputIt> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset( | 
					
						
							|  |  |  |       InputIt f, InputIt l, size_type n, const allocator_type& a) | 
					
						
							|  |  |  |         : table_(boost::unordered::detail::initial_size(f, l, n), hasher(), | 
					
						
							|  |  |  |             key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(f, l); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <class InputIt> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset(InputIt f, InputIt l, | 
					
						
							|  |  |  |       size_type n, const hasher& hf, const allocator_type& a) | 
					
						
							|  |  |  |         : table_( | 
					
						
							|  |  |  |             boost::unordered::detail::initial_size(f, l, n), hf, key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(f, l); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 22:08:01 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset( | 
					
						
							|  |  |  |       std::initializer_list<value_type> list, size_type n, | 
					
						
							|  |  |  |       const allocator_type& a) | 
					
						
							|  |  |  |         : table_( | 
					
						
							|  |  |  |             boost::unordered::detail::initial_size(list.begin(), list.end(), n), | 
					
						
							|  |  |  |             hasher(), key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(list.begin(), list.end()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::unordered_multiset( | 
					
						
							|  |  |  |       std::initializer_list<value_type> list, size_type n, const hasher& hf, | 
					
						
							|  |  |  |       const allocator_type& a) | 
					
						
							|  |  |  |         : table_( | 
					
						
							|  |  |  |             boost::unordered::detail::initial_size(list.begin(), list.end(), n), | 
					
						
							|  |  |  |             hf, key_equal(), a) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(list.begin(), list.end()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::~unordered_multiset() BOOST_NOEXCEPT | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-04-20 22:59:00 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2016-10-23 13:31:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>& unordered_multiset<T, H, P, A>::operator=( | 
					
						
							|  |  |  |       std::initializer_list<value_type> list) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->clear(); | 
					
						
							|  |  |  |       this->insert(list.begin(), list.end()); | 
					
						
							|  |  |  |       return *this; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-10-05 19:45:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     // size and capacity
 | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     std::size_t unordered_multiset<T, H, P, A>::max_size() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       using namespace std; | 
					
						
							| 
									
										
										
										
											2017-04-23 10:09:18 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       // size < mlf_ * count
 | 
					
						
							|  |  |  |       return boost::unordered::detail::double_to_size( | 
					
						
							| 
									
										
										
										
											2017-04-23 10:09:18 +01:00
										 |  |  |                ceil(static_cast<double>(table_.mlf_) * | 
					
						
							|  |  |  |                     static_cast<double>(table_.max_bucket_count()))) - | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |              1; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     // modifiers
 | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <class InputIt> | 
					
						
							|  |  |  |     void unordered_multiset<T, H, P, A>::insert(InputIt first, InputIt last) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       table_.insert_range_equiv(first, last); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 22:08:01 +00:00
										 |  |  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     void unordered_multiset<T, H, P, A>::insert( | 
					
						
							|  |  |  |       std::initializer_list<value_type> list) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       this->insert(list.begin(), list.end()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-16 18:47:33 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_multiset<T, H, P, A>::iterator | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::erase(const_iterator position) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       BOOST_ASSERT(position != this->end()); | 
					
						
							| 
									
										
										
										
											2022-07-25 11:35:38 -07:00
										 |  |  |       return table_.erase_node(position); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_multiset<T, H, P, A>::size_type | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::erase(const key_type& k) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return table_.erase_key_equiv(k); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_multiset<T, H, P, A>::iterator | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::erase( | 
					
						
							|  |  |  |       const_iterator first, const_iterator last) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       return table_.erase_nodes_range(first, last); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     void unordered_multiset<T, H, P, A>::swap(unordered_multiset& other) | 
					
						
							| 
									
										
										
										
											2018-01-05 17:48:13 +00:00
										 |  |  |       BOOST_NOEXCEPT_IF(value_allocator_traits::is_always_equal::value&& | 
					
						
							| 
									
										
										
										
											2018-01-27 09:38:19 +00:00
										 |  |  |           boost::is_nothrow_swappable<H>::value&& | 
					
						
							|  |  |  |             boost::is_nothrow_swappable<P>::value) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |       table_.swap(other.table_); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // observers
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_multiset<T, H, P, A>::hasher | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::hash_function() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return table_.hash_function(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_multiset<T, H, P, A>::key_equal | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::key_eq() const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return table_.key_eq(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <typename H2, typename P2> | 
					
						
							|  |  |  |     void unordered_multiset<T, H, P, A>::merge( | 
					
						
							|  |  |  |       boost::unordered_multiset<T, H2, P2, A>& source) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       while (!source.empty()) { | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         insert(source.extract(source.begin())); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <typename H2, typename P2> | 
					
						
							|  |  |  |     void unordered_multiset<T, H, P, A>::merge( | 
					
						
							|  |  |  |       boost::unordered_multiset<T, H2, P2, A>&& source) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       while (!source.empty()) { | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         insert(source.extract(source.begin())); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <typename H2, typename P2> | 
					
						
							|  |  |  |     void unordered_multiset<T, H, P, A>::merge( | 
					
						
							|  |  |  |       boost::unordered_set<T, H2, P2, A>& source) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       while (!source.empty()) { | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         insert(source.extract(source.begin())); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <typename H2, typename P2> | 
					
						
							|  |  |  |     void unordered_multiset<T, H, P, A>::merge( | 
					
						
							|  |  |  |       boost::unordered_set<T, H2, P2, A>&& source) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       while (!source.empty()) { | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         insert(source.extract(source.begin())); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     // lookup
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_multiset<T, H, P, A>::const_iterator | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::find(const key_type& k) const | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       return const_iterator(table_.find(k)); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     template <class CompatibleKey, class CompatibleHash, | 
					
						
							|  |  |  |       class CompatiblePredicate> | 
					
						
							|  |  |  |     typename unordered_multiset<T, H, P, A>::const_iterator | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::find(CompatibleKey const& k, | 
					
						
							|  |  |  |       CompatibleHash const& hash, CompatiblePredicate const& eq) const | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       return table_.transparent_find(k, hash, eq); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_multiset<T, H, P, A>::size_type | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::count(const key_type& k) const | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       return table_.group_count(k); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     std::pair<typename unordered_multiset<T, H, P, A>::const_iterator, | 
					
						
							|  |  |  |       typename unordered_multiset<T, H, P, A>::const_iterator> | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::equal_range(const key_type& k) const | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       iterator n = table_.find(k); | 
					
						
							|  |  |  |       return std::make_pair(const_iterator(n), | 
					
						
							|  |  |  |         const_iterator(n == end() ? n : table_.next_group(k, n))); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     typename unordered_multiset<T, H, P, A>::size_type | 
					
						
							|  |  |  |     unordered_multiset<T, H, P, A>::bucket_size(size_type n) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return table_.bucket_size(n); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // hash policy
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     float unordered_multiset<T, H, P, A>::load_factor() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-08-16 14:34:58 -07:00
										 |  |  |       if (table_.size_ == 0) { | 
					
						
							|  |  |  |         return 0.0f; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       BOOST_ASSERT(table_.bucket_count() != 0); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       return static_cast<float>(table_.size_) / | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |              static_cast<float>(table_.bucket_count()); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     void unordered_multiset<T, H, P, A>::max_load_factor(float m) BOOST_NOEXCEPT | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       table_.max_load_factor(m); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     void unordered_multiset<T, H, P, A>::rehash(size_type n) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       table_.rehash(n); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     void unordered_multiset<T, H, P, A>::reserve(size_type n) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       table_.reserve(n); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-05-07 10:58:32 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     inline bool operator==(unordered_multiset<T, H, P, A> const& m1, | 
					
						
							|  |  |  |       unordered_multiset<T, H, P, A> const& m2) | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-03-31 22:47:48 -04:00
										 |  |  | #if BOOST_WORKAROUND(BOOST_CODEGEARC, BOOST_TESTED_AT(0x0613))
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       struct dummy | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         unordered_multiset<T, H, P, A> x; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2009-12-04 00:51:50 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       return m1.table_.equals_equiv(m2.table_); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     inline bool operator!=(unordered_multiset<T, H, P, A> const& m1, | 
					
						
							|  |  |  |       unordered_multiset<T, H, P, A> const& m2) | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-03-31 22:47:48 -04:00
										 |  |  | #if BOOST_WORKAROUND(BOOST_CODEGEARC, BOOST_TESTED_AT(0x0613))
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       struct dummy | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         unordered_multiset<T, H, P, A> x; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2009-12-04 00:51:50 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       return !m1.table_.equals_equiv(m2.table_); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     template <class T, class H, class P, class A> | 
					
						
							|  |  |  |     inline void swap( | 
					
						
							|  |  |  |       unordered_multiset<T, H, P, A>& m1, unordered_multiset<T, H, P, A>& m2) | 
					
						
							|  |  |  |       BOOST_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(m1.swap(m2))) | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-03-31 22:47:48 -04:00
										 |  |  | #if BOOST_WORKAROUND(BOOST_CODEGEARC, BOOST_TESTED_AT(0x0613))
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       struct dummy | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-19 13:05:17 +00:00
										 |  |  |         unordered_multiset<T, H, P, A> x; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       }; | 
					
						
							| 
									
										
										
										
											2009-12-04 00:51:50 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       m1.swap(m2); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-22 15:14:14 -08:00
										 |  |  |     template <class K, class H, class P, class A, class Predicate> | 
					
						
							|  |  |  |     typename unordered_multiset<K, H, P, A>::size_type erase_if( | 
					
						
							|  |  |  |       unordered_multiset<K, H, P, A>& c, Predicate pred) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       return detail::erase_if(c, pred); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <typename N, typename T, typename A> class node_handle_set | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       BOOST_MOVABLE_BUT_NOT_COPYABLE(node_handle_set) | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       template <typename Types> friend struct ::boost::unordered::detail::table; | 
					
						
							|  |  |  |       template <class T2, class H2, class P2, class A2> | 
					
						
							|  |  |  |       friend class unordered_set; | 
					
						
							|  |  |  |       template <class T2, class H2, class P2, class A2> | 
					
						
							|  |  |  |       friend class unordered_multiset; | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef typename boost::unordered::detail::rebind_wrap<A, T>::type | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         value_allocator; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef boost::unordered::detail::allocator_traits<value_allocator> | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         value_allocator_traits; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef N node; | 
					
						
							|  |  |  |       typedef typename boost::unordered::detail::rebind_wrap<A, node>::type | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         node_allocator; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef boost::unordered::detail::allocator_traits<node_allocator> | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         node_allocator_traits; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       typedef typename node_allocator_traits::pointer node_pointer; | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							|  |  |  |       typedef T value_type; | 
					
						
							|  |  |  |       typedef A allocator_type; | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     private: | 
					
						
							|  |  |  |       node_pointer ptr_; | 
					
						
							|  |  |  |       bool has_alloc_; | 
					
						
							| 
									
										
										
										
											2018-01-03 20:55:44 +00:00
										 |  |  |       boost::unordered::detail::optional<value_allocator> alloc_; | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       node_handle_set(node_pointer ptr, allocator_type const& a) | 
					
						
							| 
									
										
										
										
											2018-01-03 20:55:44 +00:00
										 |  |  |           : ptr_(ptr), alloc_(a) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       { | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							|  |  |  |       BOOST_CONSTEXPR node_handle_set() BOOST_NOEXCEPT : ptr_(), | 
					
						
							|  |  |  |                                                          has_alloc_(false) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-04-15 17:35:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       ~node_handle_set() | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2018-01-03 20:55:44 +00:00
										 |  |  |         if (ptr_) { | 
					
						
							|  |  |  |           node_allocator node_alloc(*alloc_); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::node_tmp<node_allocator> tmp( | 
					
						
							|  |  |  |             ptr_, node_alloc); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       node_handle_set(BOOST_RV_REF(node_handle_set) n) BOOST_NOEXCEPT | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         : ptr_(n.ptr_), | 
					
						
							| 
									
										
										
										
											2018-01-03 20:55:44 +00:00
										 |  |  |           alloc_(boost::move(n.alloc_)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         n.ptr_ = node_pointer(); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       node_handle_set& operator=(BOOST_RV_REF(node_handle_set) n) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2018-01-03 20:55:44 +00:00
										 |  |  |         BOOST_ASSERT(!alloc_.has_value() || | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |                      value_allocator_traits:: | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |                        propagate_on_container_move_assignment::value || | 
					
						
							| 
									
										
										
										
											2018-01-03 20:55:44 +00:00
										 |  |  |                      (n.alloc_.has_value() && alloc_ == n.alloc_)); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (ptr_) { | 
					
						
							| 
									
										
										
										
											2018-01-03 20:55:44 +00:00
										 |  |  |           node_allocator node_alloc(*alloc_); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |           boost::unordered::detail::node_tmp<node_allocator> tmp( | 
					
						
							|  |  |  |             ptr_, node_alloc); | 
					
						
							|  |  |  |           ptr_ = node_pointer(); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-03 20:55:44 +00:00
										 |  |  |         if (!alloc_.has_value() || | 
					
						
							|  |  |  |             value_allocator_traits::propagate_on_container_move_assignment:: | 
					
						
							|  |  |  |               value) { | 
					
						
							|  |  |  |           alloc_ = boost::move(n.alloc_); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         ptr_ = n.ptr_; | 
					
						
							|  |  |  |         n.ptr_ = node_pointer(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return *this; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       value_type& value() const { return ptr_->value(); } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-03 20:55:44 +00:00
										 |  |  |       allocator_type get_allocator() const { return *alloc_; } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       BOOST_EXPLICIT_OPERATOR_BOOL_NOEXCEPT() | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       bool operator!() const BOOST_NOEXCEPT { return ptr_ ? 0 : 1; } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-23 14:26:28 -08:00
										 |  |  |       BOOST_ATTRIBUTE_NODISCARD bool empty() const BOOST_NOEXCEPT | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         return ptr_ ? 0 : 1; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       void swap(node_handle_set& n) BOOST_NOEXCEPT_IF( | 
					
						
							| 
									
										
										
										
											2018-01-03 20:55:44 +00:00
										 |  |  |         value_allocator_traits::propagate_on_container_swap::value || | 
					
						
							|  |  |  |         value_allocator_traits::is_always_equal::value) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         BOOST_ASSERT( | 
					
						
							|  |  |  |           !alloc_.has_value() || !n.alloc_.has_value() || | 
					
						
							|  |  |  |           value_allocator_traits::propagate_on_container_swap::value || | 
					
						
							|  |  |  |           alloc_ == n.alloc_); | 
					
						
							|  |  |  |         if (value_allocator_traits::propagate_on_container_swap::value || | 
					
						
							|  |  |  |             !alloc_.has_value() || !n.alloc_.has_value()) { | 
					
						
							|  |  |  |           boost::swap(alloc_, n.alloc_); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |         boost::swap(ptr_, n.ptr_); | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     template <typename N, typename T, typename A> | 
					
						
							|  |  |  |     void swap(node_handle_set<N, T, A>& x, node_handle_set<N, T, A>& y) | 
					
						
							|  |  |  |       BOOST_NOEXCEPT_IF(BOOST_NOEXCEPT_EXPR(x.swap(y))) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       x.swap(y); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |     template <class Iter, class NodeType> struct insert_return_type_set | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |     private: | 
					
						
							|  |  |  |       BOOST_MOVABLE_BUT_NOT_COPYABLE(insert_return_type_set) | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       // typedef typename boost::unordered::detail::rebind_wrap<A, T>::type
 | 
					
						
							|  |  |  |       //   value_allocator;
 | 
					
						
							|  |  |  |       // typedef N node_;
 | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     public: | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       Iter position; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       bool inserted; | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       NodeType node; | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       insert_return_type_set() : position(), inserted(false), node() {} | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       insert_return_type_set(BOOST_RV_REF(insert_return_type_set) | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |           x) BOOST_NOEXCEPT : position(x.position), | 
					
						
							|  |  |  |                               inserted(x.inserted), | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |                               node(boost::move(x.node)) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       insert_return_type_set& operator=(BOOST_RV_REF(insert_return_type_set) x) | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |         inserted = x.inserted; | 
					
						
							|  |  |  |         position = x.position; | 
					
						
							|  |  |  |         node = boost::move(x.node); | 
					
						
							|  |  |  |         return *this; | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |       } | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |     template <class Iter, class NodeType> | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     void swap( | 
					
						
							| 
									
										
										
										
											2022-05-20 14:33:35 -07:00
										 |  |  |       insert_return_type_set<Iter, NodeType>& x, insert_return_type_set<Iter, NodeType>& y) | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |       boost::swap(x.node, y.node); | 
					
						
							|  |  |  |       boost::swap(x.inserted, y.inserted); | 
					
						
							|  |  |  |       boost::swap(x.position, y.position); | 
					
						
							| 
									
										
										
										
											2017-02-27 03:59:02 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-06-11 20:55:59 +01:00
										 |  |  |   } // namespace unordered
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | } // namespace boost
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-14 16:11:16 +00:00
										 |  |  | #if defined(BOOST_MSVC)
 | 
					
						
							|  |  |  | #pragma warning(pop)
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-16 21:49:41 +00:00
										 |  |  | #endif // BOOST_UNORDERED_UNORDERED_SET_HPP_INCLUDED
 |