mirror of
https://github.com/boostorg/container.git
synced 2025-08-03 06:24:26 +02:00
Merge branch 'develop'
This commit is contained in:
@@ -4,8 +4,8 @@
|
|||||||
// @date Aug 14, 2011
|
// @date Aug 14, 2011
|
||||||
// @author Andrew Hundt <ATHundt@gmail.com>
|
// @author Andrew Hundt <ATHundt@gmail.com>
|
||||||
//
|
//
|
||||||
// (C) 2011-2013 Andrew Hundt <ATHundt@gmail.com>
|
// (C) Copyright 2011-2013 Andrew Hundt <ATHundt@gmail.com>
|
||||||
// (C) 2013-2013 Ion Gaztanaga
|
// (C) Copyright 2013-2013 Ion Gaztanaga
|
||||||
//
|
//
|
||||||
// Distributed under the Boost Software License, Version 1.0. (See
|
// Distributed under the Boost Software License, Version 1.0. (See
|
||||||
// accompanying file LICENSE_1_0.txt or copy at
|
// accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
@@ -549,7 +549,7 @@ shortly after new elements are added to the container.
|
|||||||
|
|
||||||
[*Boost.Container] offers two new members for `vector`, `static_vector` and `stable_vector`:
|
[*Boost.Container] offers two new members for `vector`, `static_vector` and `stable_vector`:
|
||||||
`explicit container::container(size_type n, default_init_t)` and
|
`explicit container::container(size_type n, default_init_t)` and
|
||||||
`explicit container::resize(size_type n, default_init_t)`, where new elements are constructed
|
`container::resize(size_type n, default_init_t)`, where new elements are constructed
|
||||||
using [@http://en.cppreference.com/w/cpp/language/default_initialization default initialization].
|
using [@http://en.cppreference.com/w/cpp/language/default_initialization default initialization].
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
@@ -1213,6 +1213,14 @@ use [*Boost.Container]? There are several reasons for that:
|
|||||||
|
|
||||||
[section:release_notes Release Notes]
|
[section:release_notes Release Notes]
|
||||||
|
|
||||||
|
|
||||||
|
[section:release_notes_boost_1_64_00 Boost 1.64 Release]
|
||||||
|
|
||||||
|
* Fixed bugs:
|
||||||
|
* [@https://svn.boost.org/trac/boost/ticket/12749 Trac #12749 : ['"container::pmr::polymorphic_allocator compilation error"]].
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
|
||||||
[section:release_notes_boost_1_63_00 Boost 1.63 Release]
|
[section:release_notes_boost_1_63_00 Boost 1.63 Release]
|
||||||
|
|
||||||
* Fixed bugs:
|
* Fixed bugs:
|
||||||
|
@@ -289,18 +289,18 @@ struct allocator_traits
|
|||||||
|
|
||||||
//! <b>Returns</b>: <code>a.allocate(n)</code>
|
//! <b>Returns</b>: <code>a.allocate(n)</code>
|
||||||
//!
|
//!
|
||||||
static pointer allocate(Allocator &a, size_type n)
|
BOOST_CONTAINER_FORCEINLINE static pointer allocate(Allocator &a, size_type n)
|
||||||
{ return a.allocate(n); }
|
{ return a.allocate(n); }
|
||||||
|
|
||||||
//! <b>Returns</b>: <code>a.deallocate(p, n)</code>
|
//! <b>Returns</b>: <code>a.deallocate(p, n)</code>
|
||||||
//!
|
//!
|
||||||
//! <b>Throws</b>: Nothing
|
//! <b>Throws</b>: Nothing
|
||||||
static void deallocate(Allocator &a, pointer p, size_type n)
|
BOOST_CONTAINER_FORCEINLINE static void deallocate(Allocator &a, pointer p, size_type n)
|
||||||
{ a.deallocate(p, n); }
|
{ a.deallocate(p, n); }
|
||||||
|
|
||||||
//! <b>Effects</b>: calls <code>a.allocate(n, p)</code> if that call is well-formed;
|
//! <b>Effects</b>: calls <code>a.allocate(n, p)</code> if that call is well-formed;
|
||||||
//! otherwise, invokes <code>a.allocate(n)</code>
|
//! otherwise, invokes <code>a.allocate(n)</code>
|
||||||
static pointer allocate(Allocator &a, size_type n, const_void_pointer p)
|
BOOST_CONTAINER_FORCEINLINE static pointer allocate(Allocator &a, size_type n, const_void_pointer p)
|
||||||
{
|
{
|
||||||
const bool value = boost::container::container_detail::
|
const bool value = boost::container::container_detail::
|
||||||
has_member_function_callable_with_allocate
|
has_member_function_callable_with_allocate
|
||||||
@@ -312,7 +312,7 @@ struct allocator_traits
|
|||||||
//! <b>Effects</b>: calls <code>a.destroy(p)</code> if that call is well-formed;
|
//! <b>Effects</b>: calls <code>a.destroy(p)</code> if that call is well-formed;
|
||||||
//! otherwise, invokes <code>p->~T()</code>.
|
//! otherwise, invokes <code>p->~T()</code>.
|
||||||
template<class T>
|
template<class T>
|
||||||
static void destroy(Allocator &a, T*p) BOOST_NOEXCEPT_OR_NOTHROW
|
BOOST_CONTAINER_FORCEINLINE static void destroy(Allocator &a, T*p) BOOST_NOEXCEPT_OR_NOTHROW
|
||||||
{
|
{
|
||||||
typedef T* destroy_pointer;
|
typedef T* destroy_pointer;
|
||||||
const bool value = boost::container::container_detail::
|
const bool value = boost::container::container_detail::
|
||||||
@@ -324,7 +324,7 @@ struct allocator_traits
|
|||||||
|
|
||||||
//! <b>Returns</b>: <code>a.max_size()</code> if that expression is well-formed; otherwise,
|
//! <b>Returns</b>: <code>a.max_size()</code> if that expression is well-formed; otherwise,
|
||||||
//! <code>numeric_limits<size_type>::max()</code>.
|
//! <code>numeric_limits<size_type>::max()</code>.
|
||||||
static size_type max_size(const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW
|
BOOST_CONTAINER_FORCEINLINE static size_type max_size(const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW
|
||||||
{
|
{
|
||||||
const bool value = allocator_traits_detail::has_max_size<Allocator, size_type (Allocator::*)() const>::value;
|
const bool value = allocator_traits_detail::has_max_size<Allocator, size_type (Allocator::*)() const>::value;
|
||||||
container_detail::bool_<value> flag;
|
container_detail::bool_<value> flag;
|
||||||
@@ -333,7 +333,7 @@ struct allocator_traits
|
|||||||
|
|
||||||
//! <b>Returns</b>: <code>a.select_on_container_copy_construction()</code> if that expression is well-formed;
|
//! <b>Returns</b>: <code>a.select_on_container_copy_construction()</code> if that expression is well-formed;
|
||||||
//! otherwise, a.
|
//! otherwise, a.
|
||||||
static BOOST_CONTAINER_DOC1ST(Allocator,
|
BOOST_CONTAINER_FORCEINLINE static BOOST_CONTAINER_DOC1ST(Allocator,
|
||||||
typename container_detail::if_c
|
typename container_detail::if_c
|
||||||
< allocator_traits_detail::has_select_on_container_copy_construction<Allocator BOOST_MOVE_I Allocator (Allocator::*)() const>::value
|
< allocator_traits_detail::has_select_on_container_copy_construction<Allocator BOOST_MOVE_I Allocator (Allocator::*)() const>::value
|
||||||
BOOST_MOVE_I Allocator BOOST_MOVE_I const Allocator & >::type)
|
BOOST_MOVE_I Allocator BOOST_MOVE_I const Allocator & >::type)
|
||||||
@@ -349,7 +349,7 @@ struct allocator_traits
|
|||||||
//! <b>Effects</b>: calls <code>a.construct(p, std::forward<Args>(args)...)</code> if that call is well-formed;
|
//! <b>Effects</b>: calls <code>a.construct(p, std::forward<Args>(args)...)</code> if that call is well-formed;
|
||||||
//! otherwise, invokes <code>::new (static_cast<void*>(p)) T(std::forward<Args>(args)...)</code>
|
//! otherwise, invokes <code>::new (static_cast<void*>(p)) T(std::forward<Args>(args)...)</code>
|
||||||
template <class T, class ...Args>
|
template <class T, class ...Args>
|
||||||
static void construct(Allocator & a, T* p, BOOST_FWD_REF(Args)... args)
|
BOOST_CONTAINER_FORCEINLINE static void construct(Allocator & a, T* p, BOOST_FWD_REF(Args)... args)
|
||||||
{
|
{
|
||||||
static const bool value = ::boost::move_detail::and_
|
static const bool value = ::boost::move_detail::and_
|
||||||
< container_detail::is_not_std_allocator<Allocator>
|
< container_detail::is_not_std_allocator<Allocator>
|
||||||
@@ -363,7 +363,7 @@ struct allocator_traits
|
|||||||
|
|
||||||
//! <b>Returns</b>: <code>a.storage_is_unpropagable(p)</code> if is_partially_propagable::value is true; otherwise,
|
//! <b>Returns</b>: <code>a.storage_is_unpropagable(p)</code> if is_partially_propagable::value is true; otherwise,
|
||||||
//! <code>false</code>.
|
//! <code>false</code>.
|
||||||
static bool storage_is_unpropagable(const Allocator &a, pointer p) BOOST_NOEXCEPT_OR_NOTHROW
|
BOOST_CONTAINER_FORCEINLINE static bool storage_is_unpropagable(const Allocator &a, pointer p) BOOST_NOEXCEPT_OR_NOTHROW
|
||||||
{
|
{
|
||||||
container_detail::bool_<is_partially_propagable::value> flag;
|
container_detail::bool_<is_partially_propagable::value> flag;
|
||||||
return allocator_traits::priv_storage_is_unpropagable(flag, a, p);
|
return allocator_traits::priv_storage_is_unpropagable(flag, a, p);
|
||||||
@@ -371,7 +371,7 @@ struct allocator_traits
|
|||||||
|
|
||||||
//! <b>Returns</b>: <code>true</code> if <code>is_always_equal::value == true</code>, otherwise,
|
//! <b>Returns</b>: <code>true</code> if <code>is_always_equal::value == true</code>, otherwise,
|
||||||
//! <code>a == b</code>.
|
//! <code>a == b</code>.
|
||||||
static bool equal(const Allocator &a, const Allocator &b) BOOST_NOEXCEPT_OR_NOTHROW
|
BOOST_CONTAINER_FORCEINLINE static bool equal(const Allocator &a, const Allocator &b) BOOST_NOEXCEPT_OR_NOTHROW
|
||||||
{
|
{
|
||||||
container_detail::bool_<is_always_equal::value> flag;
|
container_detail::bool_<is_always_equal::value> flag;
|
||||||
return allocator_traits::priv_equal(flag, a, b);
|
return allocator_traits::priv_equal(flag, a, b);
|
||||||
@@ -379,46 +379,46 @@ struct allocator_traits
|
|||||||
|
|
||||||
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
#if !defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
||||||
private:
|
private:
|
||||||
static pointer priv_allocate(container_detail::true_type, Allocator &a, size_type n, const_void_pointer p)
|
BOOST_CONTAINER_FORCEINLINE static pointer priv_allocate(container_detail::true_type, Allocator &a, size_type n, const_void_pointer p)
|
||||||
{ return a.allocate(n, p); }
|
{ return a.allocate(n, p); }
|
||||||
|
|
||||||
static pointer priv_allocate(container_detail::false_type, Allocator &a, size_type n, const_void_pointer)
|
BOOST_CONTAINER_FORCEINLINE static pointer priv_allocate(container_detail::false_type, Allocator &a, size_type n, const_void_pointer)
|
||||||
{ return a.allocate(n); }
|
{ return a.allocate(n); }
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
static void priv_destroy(container_detail::true_type, Allocator &a, T* p) BOOST_NOEXCEPT_OR_NOTHROW
|
BOOST_CONTAINER_FORCEINLINE static void priv_destroy(container_detail::true_type, Allocator &a, T* p) BOOST_NOEXCEPT_OR_NOTHROW
|
||||||
{ a.destroy(p); }
|
{ a.destroy(p); }
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
static void priv_destroy(container_detail::false_type, Allocator &, T* p) BOOST_NOEXCEPT_OR_NOTHROW
|
BOOST_CONTAINER_FORCEINLINE static void priv_destroy(container_detail::false_type, Allocator &, T* p) BOOST_NOEXCEPT_OR_NOTHROW
|
||||||
{ p->~T(); (void)p; }
|
{ p->~T(); (void)p; }
|
||||||
|
|
||||||
static size_type priv_max_size(container_detail::true_type, const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW
|
BOOST_CONTAINER_FORCEINLINE static size_type priv_max_size(container_detail::true_type, const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW
|
||||||
{ return a.max_size(); }
|
{ return a.max_size(); }
|
||||||
|
|
||||||
static size_type priv_max_size(container_detail::false_type, const Allocator &) BOOST_NOEXCEPT_OR_NOTHROW
|
BOOST_CONTAINER_FORCEINLINE static size_type priv_max_size(container_detail::false_type, const Allocator &) BOOST_NOEXCEPT_OR_NOTHROW
|
||||||
{ return size_type(-1)/sizeof(value_type); }
|
{ return size_type(-1)/sizeof(value_type); }
|
||||||
|
|
||||||
static Allocator priv_select_on_container_copy_construction(container_detail::true_type, const Allocator &a)
|
BOOST_CONTAINER_FORCEINLINE static Allocator priv_select_on_container_copy_construction(container_detail::true_type, const Allocator &a)
|
||||||
{ return a.select_on_container_copy_construction(); }
|
{ return a.select_on_container_copy_construction(); }
|
||||||
|
|
||||||
static const Allocator &priv_select_on_container_copy_construction(container_detail::false_type, const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW
|
BOOST_CONTAINER_FORCEINLINE static const Allocator &priv_select_on_container_copy_construction(container_detail::false_type, const Allocator &a) BOOST_NOEXCEPT_OR_NOTHROW
|
||||||
{ return a; }
|
{ return a; }
|
||||||
|
|
||||||
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||||
template<class T, class ...Args>
|
template<class T, class ...Args>
|
||||||
static void priv_construct(container_detail::true_type, Allocator &a, T *p, BOOST_FWD_REF(Args) ...args)
|
BOOST_CONTAINER_FORCEINLINE static void priv_construct(container_detail::true_type, Allocator &a, T *p, BOOST_FWD_REF(Args) ...args)
|
||||||
{ a.construct( p, ::boost::forward<Args>(args)...); }
|
{ a.construct( p, ::boost::forward<Args>(args)...); }
|
||||||
|
|
||||||
template<class T, class ...Args>
|
template<class T, class ...Args>
|
||||||
static void priv_construct(container_detail::false_type, Allocator &, T *p, BOOST_FWD_REF(Args) ...args)
|
BOOST_CONTAINER_FORCEINLINE static void priv_construct(container_detail::false_type, Allocator &, T *p, BOOST_FWD_REF(Args) ...args)
|
||||||
{ ::new((void*)p, boost_container_new_t()) T(::boost::forward<Args>(args)...); }
|
{ ::new((void*)p, boost_container_new_t()) T(::boost::forward<Args>(args)...); }
|
||||||
#else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
#else // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||||
public:
|
public:
|
||||||
|
|
||||||
#define BOOST_CONTAINER_ALLOCATOR_TRAITS_CONSTRUCT_IMPL(N) \
|
#define BOOST_CONTAINER_ALLOCATOR_TRAITS_CONSTRUCT_IMPL(N) \
|
||||||
template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
|
template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
|
||||||
static void construct(Allocator &a, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
|
BOOST_CONTAINER_FORCEINLINE static void construct(Allocator &a, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
|
||||||
{\
|
{\
|
||||||
static const bool value = ::boost::move_detail::and_ \
|
static const bool value = ::boost::move_detail::and_ \
|
||||||
< container_detail::is_not_std_allocator<Allocator> \
|
< container_detail::is_not_std_allocator<Allocator> \
|
||||||
@@ -438,11 +438,11 @@ struct allocator_traits
|
|||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
#define BOOST_CONTAINER_ALLOCATOR_TRAITS_PRIV_CONSTRUCT_IMPL(N) \
|
#define BOOST_CONTAINER_ALLOCATOR_TRAITS_PRIV_CONSTRUCT_IMPL(N) \
|
||||||
template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
|
template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
|
||||||
static void priv_construct(container_detail::true_type, Allocator &a, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
|
BOOST_CONTAINER_FORCEINLINE static void priv_construct(container_detail::true_type, Allocator &a, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
|
||||||
{ a.construct( p BOOST_MOVE_I##N BOOST_MOVE_FWD##N ); }\
|
{ a.construct( p BOOST_MOVE_I##N BOOST_MOVE_FWD##N ); }\
|
||||||
\
|
\
|
||||||
template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
|
template<class T BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
|
||||||
static void priv_construct(container_detail::false_type, Allocator &, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
|
BOOST_CONTAINER_FORCEINLINE static void priv_construct(container_detail::false_type, Allocator &, T *p BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
|
||||||
{ ::new((void*)p, boost_container_new_t()) T(BOOST_MOVE_FWD##N); }\
|
{ ::new((void*)p, boost_container_new_t()) T(BOOST_MOVE_FWD##N); }\
|
||||||
//
|
//
|
||||||
BOOST_MOVE_ITERATE_0TO8(BOOST_CONTAINER_ALLOCATOR_TRAITS_PRIV_CONSTRUCT_IMPL)
|
BOOST_MOVE_ITERATE_0TO8(BOOST_CONTAINER_ALLOCATOR_TRAITS_PRIV_CONSTRUCT_IMPL)
|
||||||
@@ -451,19 +451,19 @@ struct allocator_traits
|
|||||||
#endif // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
#endif // #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
static void priv_construct(container_detail::false_type, Allocator &, T *p, const ::boost::container::default_init_t&)
|
BOOST_CONTAINER_FORCEINLINE static void priv_construct(container_detail::false_type, Allocator &, T *p, const ::boost::container::default_init_t&)
|
||||||
{ ::new((void*)p, boost_container_new_t()) T; }
|
{ ::new((void*)p, boost_container_new_t()) T; }
|
||||||
|
|
||||||
static bool priv_storage_is_unpropagable(container_detail::true_type, const Allocator &a, pointer p)
|
BOOST_CONTAINER_FORCEINLINE static bool priv_storage_is_unpropagable(container_detail::true_type, const Allocator &a, pointer p)
|
||||||
{ return a.storage_is_unpropagable(p); }
|
{ return a.storage_is_unpropagable(p); }
|
||||||
|
|
||||||
static bool priv_storage_is_unpropagable(container_detail::false_type, const Allocator &, pointer)
|
BOOST_CONTAINER_FORCEINLINE static bool priv_storage_is_unpropagable(container_detail::false_type, const Allocator &, pointer)
|
||||||
{ return false; }
|
{ return false; }
|
||||||
|
|
||||||
static bool priv_equal(container_detail::true_type, const Allocator &, const Allocator &)
|
BOOST_CONTAINER_FORCEINLINE static bool priv_equal(container_detail::true_type, const Allocator &, const Allocator &)
|
||||||
{ return true; }
|
{ return true; }
|
||||||
|
|
||||||
static bool priv_equal(container_detail::false_type, const Allocator &a, const Allocator &b)
|
BOOST_CONTAINER_FORCEINLINE static bool priv_equal(container_detail::false_type, const Allocator &a, const Allocator &b)
|
||||||
{ return a == b; }
|
{ return a == b; }
|
||||||
|
|
||||||
#endif //#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
#endif //#if defined(BOOST_CONTAINER_DOXYGEN_INVOKED)
|
||||||
|
@@ -287,7 +287,7 @@ template< typename ConstructAlloc, typename ArgAlloc, class Pair \
|
|||||||
, template<class, class, class, class, class, class, class, class, class, class> class BoostTuple \
|
, template<class, class, class, class, class, class, class, class, class, class> class BoostTuple \
|
||||||
BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \
|
BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \
|
||||||
typename container_detail::enable_if< container_detail::is_pair<Pair> >::type\
|
typename container_detail::enable_if< container_detail::is_pair<Pair> >::type\
|
||||||
dispatch_uses_allocator( ConstructAlloc & construct_alloc, ArgAlloc & arg_alloc, Pair* pair, piecewise_construct_t\
|
dispatch_uses_allocator( ConstructAlloc & construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, Pair* pair, piecewise_construct_t\
|
||||||
, BoostTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,N),::boost::tuples::null_type)> p\
|
, BoostTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,N),::boost::tuples::null_type)> p\
|
||||||
, BoostTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,M),::boost::tuples::null_type)> q)\
|
, BoostTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,M),::boost::tuples::null_type)> q)\
|
||||||
{\
|
{\
|
||||||
@@ -313,7 +313,7 @@ BOOST_MOVE_ITER2D_0TOMAX(9, BOOST_DISPATCH_USES_ALLOCATOR_PIECEWISE_CONSTRUCT_BO
|
|||||||
|
|
||||||
template< typename ConstructAlloc, typename ArgAlloc, class Pair
|
template< typename ConstructAlloc, typename ArgAlloc, class Pair
|
||||||
, template<class ...> class Tuple, class... Args1, class... Args2, size_t... Indexes1, size_t... Indexes2>
|
, template<class ...> class Tuple, class... Args1, class... Args2, size_t... Indexes1, size_t... Indexes2>
|
||||||
void dispatch_uses_allocator_index( ConstructAlloc & construct_alloc, ArgAlloc & arg_alloc, Pair* pair
|
void dispatch_uses_allocator_index( ConstructAlloc & construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, Pair* pair
|
||||||
, Tuple<Args1...>& t1, Tuple<Args2...>& t2, index_tuple<Indexes1...>, index_tuple<Indexes2...>)
|
, Tuple<Args1...>& t1, Tuple<Args2...>& t2, index_tuple<Indexes1...>, index_tuple<Indexes2...>)
|
||||||
{
|
{
|
||||||
(void)t1; (void)t2;
|
(void)t1; (void)t2;
|
||||||
@@ -331,7 +331,7 @@ BOOST_MOVE_ITER2D_0TOMAX(9, BOOST_DISPATCH_USES_ALLOCATOR_PIECEWISE_CONSTRUCT_BO
|
|||||||
template< typename ConstructAlloc, typename ArgAlloc, class Pair
|
template< typename ConstructAlloc, typename ArgAlloc, class Pair
|
||||||
, template<class ...> class Tuple, class... Args1, class... Args2>
|
, template<class ...> class Tuple, class... Args1, class... Args2>
|
||||||
typename container_detail::enable_if< container_detail::is_pair<Pair> >::type
|
typename container_detail::enable_if< container_detail::is_pair<Pair> >::type
|
||||||
dispatch_uses_allocator( ConstructAlloc & construct_alloc, ArgAlloc & arg_alloc, Pair* pair, piecewise_construct_t
|
dispatch_uses_allocator( ConstructAlloc & construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, Pair* pair, piecewise_construct_t
|
||||||
, Tuple<Args1...> t1, Tuple<Args2...> t2)
|
, Tuple<Args1...> t1, Tuple<Args2...> t2)
|
||||||
{
|
{
|
||||||
(dispatch_uses_allocator_index)( construct_alloc, arg_alloc, pair, t1, t2
|
(dispatch_uses_allocator_index)( construct_alloc, arg_alloc, pair, t1, t2
|
||||||
@@ -347,7 +347,7 @@ BOOST_MOVE_ITER2D_0TOMAX(9, BOOST_DISPATCH_USES_ALLOCATOR_PIECEWISE_CONSTRUCT_BO
|
|||||||
, template<class, class, class, class, class, class, class, class, class, class> class StdTuple\
|
, template<class, class, class, class, class, class, class, class, class, class> class StdTuple\
|
||||||
BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \
|
BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \
|
||||||
typename container_detail::enable_if< container_detail::is_pair<Pair> >::type\
|
typename container_detail::enable_if< container_detail::is_pair<Pair> >::type\
|
||||||
dispatch_uses_allocator(ConstructAlloc & construct_alloc, ArgAlloc & arg_alloc, Pair* pair, piecewise_construct_t\
|
dispatch_uses_allocator(ConstructAlloc & construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, Pair* pair, piecewise_construct_t\
|
||||||
, StdTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,N),::std::tr1::_Nil)> p\
|
, StdTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,N),::std::tr1::_Nil)> p\
|
||||||
, StdTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,M),::std::tr1::_Nil)> q)\
|
, StdTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(10,M),::std::tr1::_Nil)> q)\
|
||||||
{\
|
{\
|
||||||
@@ -382,7 +382,7 @@ BOOST_MOVE_ITER2D_0TOMAX(9, BOOST_DISPATCH_USES_ALLOCATOR_PIECEWISE_CONSTRUCT_BO
|
|||||||
BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \
|
BOOST_MOVE_I_IF(BOOST_MOVE_OR(N,M)) BOOST_MOVE_CLASS##N BOOST_MOVE_I_IF(BOOST_MOVE_AND(N,M)) BOOST_MOVE_CLASSQ##M > \
|
||||||
typename container_detail::enable_if< container_detail::is_pair<Pair> >::type\
|
typename container_detail::enable_if< container_detail::is_pair<Pair> >::type\
|
||||||
dispatch_uses_allocator\
|
dispatch_uses_allocator\
|
||||||
( ConstructAlloc & construct_alloc, ArgAlloc & arg_alloc, Pair* pair, piecewise_construct_t\
|
( ConstructAlloc & construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, Pair* pair, piecewise_construct_t\
|
||||||
, StdTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(BOOST_MOVE_ADD(_VARIADIC_MAX, 3),N),::std::_Nil) > p\
|
, StdTuple<BOOST_MOVE_TARG##N BOOST_MOVE_I##N BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(BOOST_MOVE_ADD(_VARIADIC_MAX, 3),N),::std::_Nil) > p\
|
||||||
, StdTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(BOOST_MOVE_ADD(_VARIADIC_MAX, 3),M),::std::_Nil) > q)\
|
, StdTuple<BOOST_MOVE_TARGQ##M BOOST_MOVE_I##M BOOST_MOVE_REPEAT(BOOST_MOVE_SUB(BOOST_MOVE_ADD(_VARIADIC_MAX, 3),M),::std::_Nil) > q)\
|
||||||
{\
|
{\
|
||||||
@@ -406,6 +406,52 @@ BOOST_MOVE_ITER2D_0TOMAX(9, BOOST_DISPATCH_USES_ALLOCATOR_PIECEWISE_CONSTRUCT_BO
|
|||||||
|
|
||||||
#endif //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
#endif //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||||
|
|
||||||
|
#if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||||
|
|
||||||
|
template < typename ConstructAlloc
|
||||||
|
, typename ArgAlloc
|
||||||
|
, class Pair, class KeyType, class ... Args>
|
||||||
|
typename container_detail::enable_if< container_detail::is_pair<Pair>, void >::type
|
||||||
|
dispatch_uses_allocator
|
||||||
|
(ConstructAlloc & construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, Pair* p, try_emplace_t, BOOST_FWD_REF(KeyType) k, BOOST_FWD_REF(Args) ...args)
|
||||||
|
{
|
||||||
|
(dispatch_uses_allocator)(construct_alloc, arg_alloc, container_detail::addressof(p->first), ::boost::forward<KeyType>(k));
|
||||||
|
BOOST_TRY{
|
||||||
|
(dispatch_uses_allocator)(construct_alloc, arg_alloc, container_detail::addressof(p->second), ::boost::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
BOOST_CATCH(...) {
|
||||||
|
allocator_traits<ConstructAlloc>::destroy(construct_alloc, container_detail::addressof(p->first));
|
||||||
|
BOOST_RETHROW
|
||||||
|
}
|
||||||
|
BOOST_CATCH_END
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define BOOST_CONTAINER_DISPATCH_USES_ALLOCATOR_PAIR_TRY_EMPLACE_CODE(N) \
|
||||||
|
template <typename ConstructAlloc, typename ArgAlloc, class Pair, class KeyType BOOST_MOVE_I##N BOOST_MOVE_CLASS##N >\
|
||||||
|
inline typename container_detail::enable_if\
|
||||||
|
< container_detail::is_pair<Pair>, void >::type\
|
||||||
|
dispatch_uses_allocator\
|
||||||
|
(ConstructAlloc &construct_alloc, BOOST_FWD_REF(ArgAlloc) arg_alloc, Pair* p, try_emplace_t, \
|
||||||
|
BOOST_FWD_REF(KeyType) k BOOST_MOVE_I##N BOOST_MOVE_UREF##N)\
|
||||||
|
{\
|
||||||
|
(dispatch_uses_allocator)(construct_alloc, arg_alloc, container_detail::addressof(p->first), ::boost::forward<KeyType>(k));\
|
||||||
|
BOOST_TRY{\
|
||||||
|
(dispatch_uses_allocator)(construct_alloc, arg_alloc, container_detail::addressof(p->second) BOOST_MOVE_I##N BOOST_MOVE_FWD##N);\
|
||||||
|
}\
|
||||||
|
BOOST_CATCH(...) {\
|
||||||
|
allocator_traits<ConstructAlloc>::destroy(construct_alloc, container_detail::addressof(p->first));\
|
||||||
|
BOOST_RETHROW\
|
||||||
|
}\
|
||||||
|
BOOST_CATCH_END\
|
||||||
|
}\
|
||||||
|
//
|
||||||
|
BOOST_MOVE_ITERATE_0TO9(BOOST_CONTAINER_DISPATCH_USES_ALLOCATOR_PAIR_TRY_EMPLACE_CODE)
|
||||||
|
#undef BOOST_CONTAINER_DISPATCH_USES_ALLOCATOR_PAIR_TRY_EMPLACE_CODE
|
||||||
|
|
||||||
|
#endif //!defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||||
|
|
||||||
} //namespace container_detail
|
} //namespace container_detail
|
||||||
|
|
||||||
}} // namespace boost { namespace container {
|
}} // namespace boost { namespace container {
|
||||||
|
@@ -1,383 +0,0 @@
|
|||||||
/*
|
|
||||||
template <class Value, unsigned int Options = 0, class Hash = hash<Value>, class Pred = equal_to<Value>,
|
|
||||||
class Allocator = allocator<Value> >
|
|
||||||
class hash_set
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// types
|
|
||||||
typedef Value key_type;
|
|
||||||
typedef key_type value_type;
|
|
||||||
typedef Hash hasher;
|
|
||||||
typedef Pred key_equal;
|
|
||||||
typedef Allocator allocator_type;
|
|
||||||
typedef value_type& reference;
|
|
||||||
typedef const value_type& const_reference;
|
|
||||||
typedef typename allocator_traits<allocator_type>::pointer pointer;
|
|
||||||
typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
|
|
||||||
typedef typename allocator_traits<allocator_type>::size_type size_type;
|
|
||||||
typedef typename allocator_traits<allocator_type>::difference_type difference_type;
|
|
||||||
|
|
||||||
typedef /unspecified/ iterator;
|
|
||||||
typedef /unspecified/ const_iterator;
|
|
||||||
typedef /unspecified/ local_iterator;
|
|
||||||
typedef /unspecified/ const_local_iterator;
|
|
||||||
|
|
||||||
hash_set()
|
|
||||||
noexcept(
|
|
||||||
is_nothrow_default_constructible<hasher>::value &&
|
|
||||||
is_nothrow_default_constructible<key_equal>::value &&
|
|
||||||
is_nothrow_default_constructible<allocator_type>::value);
|
|
||||||
explicit hash_set(size_type n, const hasher& hf = hasher(),
|
|
||||||
const key_equal& eql = key_equal(),
|
|
||||||
const allocator_type& a = allocator_type());
|
|
||||||
template <class InputIterator>
|
|
||||||
hash_set(InputIterator f, InputIterator l,
|
|
||||||
size_type n = 0, const hasher& hf = hasher(),
|
|
||||||
const key_equal& eql = key_equal(),
|
|
||||||
const allocator_type& a = allocator_type());
|
|
||||||
explicit hash_set(const allocator_type&);
|
|
||||||
hash_set(const hash_set&);
|
|
||||||
hash_set(const hash_set&, const Allocator&);
|
|
||||||
hash_set(hash_set&&)
|
|
||||||
noexcept(
|
|
||||||
is_nothrow_move_constructible<hasher>::value &&
|
|
||||||
is_nothrow_move_constructible<key_equal>::value &&
|
|
||||||
is_nothrow_move_constructible<allocator_type>::value);
|
|
||||||
hash_set(hash_set&&, const Allocator&);
|
|
||||||
hash_set(initializer_list<value_type>, size_type n = 0,
|
|
||||||
const hasher& hf = hasher(), const key_equal& eql = key_equal(),
|
|
||||||
const allocator_type& a = allocator_type());
|
|
||||||
~hash_set();
|
|
||||||
hash_set& operator=(const hash_set&);
|
|
||||||
hash_set& operator=(hash_set&&)
|
|
||||||
noexcept(
|
|
||||||
allocator_type::propagate_on_container_move_assignment::value &&
|
|
||||||
is_nothrow_move_assignable<allocator_type>::value &&
|
|
||||||
is_nothrow_move_assignable<hasher>::value &&
|
|
||||||
is_nothrow_move_assignable<key_equal>::value);
|
|
||||||
hash_set& operator=(initializer_list<value_type>);
|
|
||||||
|
|
||||||
allocator_type get_allocator() const noexcept;
|
|
||||||
|
|
||||||
bool empty() const noexcept;
|
|
||||||
size_type size() const noexcept;
|
|
||||||
size_type max_size() const noexcept;
|
|
||||||
|
|
||||||
iterator begin() noexcept;
|
|
||||||
iterator end() noexcept;
|
|
||||||
const_iterator begin() const noexcept;
|
|
||||||
const_iterator end() const noexcept;
|
|
||||||
const_iterator cbegin() const noexcept;
|
|
||||||
const_iterator cend() const noexcept;
|
|
||||||
|
|
||||||
template <class... Args>
|
|
||||||
pair<iterator, bool> emplace(BOOST_FWD_REF(Args)... args);
|
|
||||||
template <class... Args>
|
|
||||||
iterator emplace_hint(const_iterator position, BOOST_FWD_REF(Args)... args);
|
|
||||||
pair<iterator, bool> insert(const value_type& obj);
|
|
||||||
pair<iterator, bool> insert(value_type&& obj);
|
|
||||||
iterator insert(const_iterator hint, const value_type& obj);
|
|
||||||
iterator insert(const_iterator hint, value_type&& obj);
|
|
||||||
template <class InputIterator>
|
|
||||||
void insert(InputIterator first, InputIterator last);
|
|
||||||
void insert(initializer_list<value_type>);
|
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
|
||||||
size_type erase(const key_type& k);
|
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
|
||||||
void clear() noexcept;
|
|
||||||
|
|
||||||
void swap(hash_set&)
|
|
||||||
noexcept(
|
|
||||||
(!allocator_type::propagate_on_container_swap::value ||
|
|
||||||
__is_nothrow_swappable<allocator_type>::value) &&
|
|
||||||
__is_nothrow_swappable<hasher>::value &&
|
|
||||||
__is_nothrow_swappable<key_equal>::value);
|
|
||||||
|
|
||||||
hasher hash_function() const;
|
|
||||||
key_equal key_eq() const;
|
|
||||||
|
|
||||||
iterator find(const key_type& k);
|
|
||||||
const_iterator find(const key_type& k) const;
|
|
||||||
size_type count(const key_type& k) const;
|
|
||||||
pair<iterator, iterator> equal_range(const key_type& k);
|
|
||||||
pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
|
|
||||||
|
|
||||||
size_type bucket_count() const noexcept;
|
|
||||||
size_type max_bucket_count() const noexcept;
|
|
||||||
|
|
||||||
size_type bucket_size(size_type n) const;
|
|
||||||
size_type bucket(const key_type& k) const;
|
|
||||||
|
|
||||||
local_iterator begin(size_type n);
|
|
||||||
local_iterator end(size_type n);
|
|
||||||
const_local_iterator begin(size_type n) const;
|
|
||||||
const_local_iterator end(size_type n) const;
|
|
||||||
const_local_iterator cbegin(size_type n) const;
|
|
||||||
const_local_iterator cend(size_type n) const;
|
|
||||||
|
|
||||||
float load_factor() const noexcept;
|
|
||||||
float max_load_factor() const noexcept;
|
|
||||||
void max_load_factor(float z);
|
|
||||||
void rehash(size_type n);
|
|
||||||
void reserve(size_type n);
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class Key, class T, unsigned int Options = 0, class Hash = hash<Key>, class Pred = equal_to<Key>,
|
|
||||||
class Allocator = allocator<pair<const Key, T> > >
|
|
||||||
class hash_map
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// types
|
|
||||||
typedef Key key_type;
|
|
||||||
typedef T mapped_type;
|
|
||||||
typedef Hash hasher;
|
|
||||||
typedef Pred key_equal;
|
|
||||||
typedef Allocator allocator_type;
|
|
||||||
typedef pair<const key_type, mapped_type> value_type;
|
|
||||||
typedef value_type& reference;
|
|
||||||
typedef const value_type& const_reference;
|
|
||||||
typedef typename allocator_traits<allocator_type>::pointer pointer;
|
|
||||||
typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
|
|
||||||
typedef typename allocator_traits<allocator_type>::size_type size_type;
|
|
||||||
typedef typename allocator_traits<allocator_type>::difference_type difference_type;
|
|
||||||
|
|
||||||
typedef /unspecified/ iterator;
|
|
||||||
typedef /unspecified/ const_iterator;
|
|
||||||
typedef /unspecified/ local_iterator;
|
|
||||||
typedef /unspecified/ const_local_iterator;
|
|
||||||
|
|
||||||
hash_map()
|
|
||||||
noexcept(
|
|
||||||
is_nothrow_default_constructible<hasher>::value &&
|
|
||||||
is_nothrow_default_constructible<key_equal>::value &&
|
|
||||||
is_nothrow_default_constructible<allocator_type>::value);
|
|
||||||
explicit hash_map(size_type n, const hasher& hf = hasher(),
|
|
||||||
const key_equal& eql = key_equal(),
|
|
||||||
const allocator_type& a = allocator_type());
|
|
||||||
template <class InputIterator>
|
|
||||||
hash_map(InputIterator f, InputIterator l,
|
|
||||||
size_type n = 0, const hasher& hf = hasher(),
|
|
||||||
const key_equal& eql = key_equal(),
|
|
||||||
const allocator_type& a = allocator_type());
|
|
||||||
explicit hash_map(const allocator_type&);
|
|
||||||
hash_map(const hash_map&);
|
|
||||||
hash_map(const hash_map&, const Allocator&);
|
|
||||||
hash_map(hash_map&&)
|
|
||||||
noexcept(
|
|
||||||
is_nothrow_move_constructible<hasher>::value &&
|
|
||||||
is_nothrow_move_constructible<key_equal>::value &&
|
|
||||||
is_nothrow_move_constructible<allocator_type>::value);
|
|
||||||
hash_map(hash_map&&, const Allocator&);
|
|
||||||
hash_map(initializer_list<value_type>, size_type n = 0,
|
|
||||||
const hasher& hf = hasher(), const key_equal& eql = key_equal(),
|
|
||||||
const allocator_type& a = allocator_type());
|
|
||||||
~hash_map();
|
|
||||||
hash_map& operator=(const hash_map&);
|
|
||||||
hash_map& operator=(hash_map&&)
|
|
||||||
noexcept(
|
|
||||||
allocator_type::propagate_on_container_move_assignment::value &&
|
|
||||||
is_nothrow_move_assignable<allocator_type>::value &&
|
|
||||||
is_nothrow_move_assignable<hasher>::value &&
|
|
||||||
is_nothrow_move_assignable<key_equal>::value);
|
|
||||||
hash_map& operator=(initializer_list<value_type>);
|
|
||||||
|
|
||||||
allocator_type get_allocator() const noexcept;
|
|
||||||
|
|
||||||
bool empty() const noexcept;
|
|
||||||
size_type size() const noexcept;
|
|
||||||
size_type max_size() const noexcept;
|
|
||||||
|
|
||||||
iterator begin() noexcept;
|
|
||||||
iterator end() noexcept;
|
|
||||||
const_iterator begin() const noexcept;
|
|
||||||
const_iterator end() const noexcept;
|
|
||||||
const_iterator cbegin() const noexcept;
|
|
||||||
const_iterator cend() const noexcept;
|
|
||||||
|
|
||||||
template <class... Args>
|
|
||||||
pair<iterator, bool> emplace(BOOST_FWD_REF(Args)... args);
|
|
||||||
template <class... Args>
|
|
||||||
iterator emplace_hint(const_iterator position, BOOST_FWD_REF(Args)... args);
|
|
||||||
pair<iterator, bool> insert(const value_type& obj);
|
|
||||||
template <class P>
|
|
||||||
pair<iterator, bool> insert(P&& obj);
|
|
||||||
iterator insert(const_iterator hint, const value_type& obj);
|
|
||||||
template <class P>
|
|
||||||
iterator insert(const_iterator hint, P&& obj);
|
|
||||||
template <class InputIterator>
|
|
||||||
void insert(InputIterator first, InputIterator last);
|
|
||||||
void insert(initializer_list<value_type>);
|
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
|
||||||
size_type erase(const key_type& k);
|
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
|
||||||
void clear() noexcept;
|
|
||||||
|
|
||||||
void swap(hash_map&)
|
|
||||||
noexcept(
|
|
||||||
(!allocator_type::propagate_on_container_swap::value ||
|
|
||||||
__is_nothrow_swappable<allocator_type>::value) &&
|
|
||||||
__is_nothrow_swappable<hasher>::value &&
|
|
||||||
__is_nothrow_swappable<key_equal>::value);
|
|
||||||
|
|
||||||
hasher hash_function() const;
|
|
||||||
key_equal key_eq() const;
|
|
||||||
|
|
||||||
iterator find(const key_type& k);
|
|
||||||
const_iterator find(const key_type& k) const;
|
|
||||||
size_type count(const key_type& k) const;
|
|
||||||
pair<iterator, iterator> equal_range(const key_type& k);
|
|
||||||
pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
|
|
||||||
|
|
||||||
mapped_type& operator[](const key_type& k);
|
|
||||||
mapped_type& operator[](key_type&& k);
|
|
||||||
|
|
||||||
mapped_type& at(const key_type& k);
|
|
||||||
const mapped_type& at(const key_type& k) const;
|
|
||||||
|
|
||||||
size_type bucket_count() const noexcept;
|
|
||||||
size_type max_bucket_count() const noexcept;
|
|
||||||
|
|
||||||
size_type bucket_size(size_type n) const;
|
|
||||||
size_type bucket(const key_type& k) const;
|
|
||||||
|
|
||||||
local_iterator begin(size_type n);
|
|
||||||
local_iterator end(size_type n);
|
|
||||||
const_local_iterator begin(size_type n) const;
|
|
||||||
const_local_iterator end(size_type n) const;
|
|
||||||
const_local_iterator cbegin(size_type n) const;
|
|
||||||
const_local_iterator cend(size_type n) const;
|
|
||||||
|
|
||||||
float load_factor() const noexcept;
|
|
||||||
float max_load_factor() const noexcept;
|
|
||||||
void max_load_factor(float z);
|
|
||||||
void rehash(size_type n);
|
|
||||||
void reserve(size_type n);
|
|
||||||
};
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
template <class Key, class Value, class KeyOfValue, unsigned int Options = 0, class Hash = hash<Key>, class Pred = equal_to<Key>,
|
|
||||||
class Allocator = allocator<Value> >
|
|
||||||
class hash_table
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
// types
|
|
||||||
typedef Value key_type;
|
|
||||||
typedef key_type value_type;
|
|
||||||
typedef Hash hasher;
|
|
||||||
typedef Pred key_equal;
|
|
||||||
typedef Allocator allocator_type;
|
|
||||||
typedef value_type& reference;
|
|
||||||
typedef const value_type& const_reference;
|
|
||||||
typedef typename allocator_traits<allocator_type>::pointer pointer;
|
|
||||||
typedef typename allocator_traits<allocator_type>::const_pointer const_pointer;
|
|
||||||
typedef typename allocator_traits<allocator_type>::size_type size_type;
|
|
||||||
typedef typename allocator_traits<allocator_type>::difference_type difference_type;
|
|
||||||
|
|
||||||
typedef /unspecified/ iterator;
|
|
||||||
typedef /unspecified/ const_iterator;
|
|
||||||
typedef /unspecified/ local_iterator;
|
|
||||||
typedef /unspecified/ const_local_iterator;
|
|
||||||
|
|
||||||
hash_set()
|
|
||||||
noexcept(
|
|
||||||
is_nothrow_default_constructible<hasher>::value &&
|
|
||||||
is_nothrow_default_constructible<key_equal>::value &&
|
|
||||||
is_nothrow_default_constructible<allocator_type>::value);
|
|
||||||
explicit hash_set(size_type n, const hasher& hf = hasher(),
|
|
||||||
const key_equal& eql = key_equal(),
|
|
||||||
const allocator_type& a = allocator_type());
|
|
||||||
template <class InputIterator>
|
|
||||||
hash_set(InputIterator f, InputIterator l,
|
|
||||||
size_type n = 0, const hasher& hf = hasher(),
|
|
||||||
const key_equal& eql = key_equal(),
|
|
||||||
const allocator_type& a = allocator_type());
|
|
||||||
explicit hash_set(const allocator_type&);
|
|
||||||
hash_set(const hash_set&);
|
|
||||||
hash_set(const hash_set&, const Allocator&);
|
|
||||||
hash_set(hash_set&&)
|
|
||||||
noexcept(
|
|
||||||
is_nothrow_move_constructible<hasher>::value &&
|
|
||||||
is_nothrow_move_constructible<key_equal>::value &&
|
|
||||||
is_nothrow_move_constructible<allocator_type>::value);
|
|
||||||
hash_set(hash_set&&, const Allocator&);
|
|
||||||
hash_set(initializer_list<value_type>, size_type n = 0,
|
|
||||||
const hasher& hf = hasher(), const key_equal& eql = key_equal(),
|
|
||||||
const allocator_type& a = allocator_type());
|
|
||||||
~hash_set();
|
|
||||||
hash_set& operator=(const hash_set&);
|
|
||||||
hash_set& operator=(hash_set&&)
|
|
||||||
noexcept(
|
|
||||||
allocator_type::propagate_on_container_move_assignment::value &&
|
|
||||||
is_nothrow_move_assignable<allocator_type>::value &&
|
|
||||||
is_nothrow_move_assignable<hasher>::value &&
|
|
||||||
is_nothrow_move_assignable<key_equal>::value);
|
|
||||||
hash_set& operator=(initializer_list<value_type>);
|
|
||||||
|
|
||||||
allocator_type get_allocator() const noexcept;
|
|
||||||
|
|
||||||
bool empty() const noexcept;
|
|
||||||
size_type size() const noexcept;
|
|
||||||
size_type max_size() const noexcept;
|
|
||||||
|
|
||||||
iterator begin() noexcept;
|
|
||||||
iterator end() noexcept;
|
|
||||||
const_iterator begin() const noexcept;
|
|
||||||
const_iterator end() const noexcept;
|
|
||||||
const_iterator cbegin() const noexcept;
|
|
||||||
const_iterator cend() const noexcept;
|
|
||||||
|
|
||||||
template <class... Args>
|
|
||||||
pair<iterator, bool> emplace(BOOST_FWD_REF(Args)... args);
|
|
||||||
template <class... Args>
|
|
||||||
iterator emplace_hint(const_iterator position, BOOST_FWD_REF(Args)... args);
|
|
||||||
pair<iterator, bool> insert(const value_type& obj);
|
|
||||||
pair<iterator, bool> insert(value_type&& obj);
|
|
||||||
iterator insert(const_iterator hint, const value_type& obj);
|
|
||||||
iterator insert(const_iterator hint, value_type&& obj);
|
|
||||||
template <class InputIterator>
|
|
||||||
void insert(InputIterator first, InputIterator last);
|
|
||||||
void insert(initializer_list<value_type>);
|
|
||||||
|
|
||||||
iterator erase(const_iterator position);
|
|
||||||
size_type erase(const key_type& k);
|
|
||||||
iterator erase(const_iterator first, const_iterator last);
|
|
||||||
void clear() noexcept;
|
|
||||||
|
|
||||||
void swap(hash_set&)
|
|
||||||
noexcept(
|
|
||||||
(!allocator_type::propagate_on_container_swap::value ||
|
|
||||||
__is_nothrow_swappable<allocator_type>::value) &&
|
|
||||||
__is_nothrow_swappable<hasher>::value &&
|
|
||||||
__is_nothrow_swappable<key_equal>::value);
|
|
||||||
|
|
||||||
hasher hash_function() const;
|
|
||||||
key_equal key_eq() const;
|
|
||||||
|
|
||||||
iterator find(const key_type& k);
|
|
||||||
const_iterator find(const key_type& k) const;
|
|
||||||
size_type count(const key_type& k) const;
|
|
||||||
pair<iterator, iterator> equal_range(const key_type& k);
|
|
||||||
pair<const_iterator, const_iterator> equal_range(const key_type& k) const;
|
|
||||||
|
|
||||||
size_type bucket_count() const noexcept;
|
|
||||||
size_type max_bucket_count() const noexcept;
|
|
||||||
|
|
||||||
size_type bucket_size(size_type n) const;
|
|
||||||
size_type bucket(const key_type& k) const;
|
|
||||||
|
|
||||||
local_iterator begin(size_type n);
|
|
||||||
local_iterator end(size_type n);
|
|
||||||
const_local_iterator begin(size_type n) const;
|
|
||||||
const_local_iterator end(size_type n) const;
|
|
||||||
const_local_iterator cbegin(size_type n) const;
|
|
||||||
const_local_iterator cend(size_type n) const;
|
|
||||||
|
|
||||||
float load_factor() const noexcept;
|
|
||||||
float max_load_factor() const noexcept;
|
|
||||||
void max_load_factor(float z);
|
|
||||||
void rehash(size_type n);
|
|
||||||
void reserve(size_type n);
|
|
||||||
};
|
|
@@ -1,14 +1,9 @@
|
|||||||
// Copyright (C) 2000 Stephen Cleary
|
|
||||||
//
|
|
||||||
// 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 for updates, documentation, and revision history.
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// (C) Copyright Ion Gaztanaga 2007-2013. Distributed under the Boost
|
// (C) Copyright Stephen Cleary 2000
|
||||||
|
// (C) Copyright Ion Gaztanaga 2015-2017.
|
||||||
|
//
|
||||||
|
// Distributed under the Boost
|
||||||
// Software License, Version 1.0. (See accompanying file
|
// Software License, Version 1.0. (See accompanying file
|
||||||
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
//
|
//
|
||||||
|
@@ -43,8 +43,7 @@
|
|||||||
ProgramDatabaseFile="$(OutDir)/static_vector_test.pdb"
|
ProgramDatabaseFile="$(OutDir)/static_vector_test.pdb"
|
||||||
SubSystem="1"
|
SubSystem="1"
|
||||||
TargetMachine="1"
|
TargetMachine="1"
|
||||||
FixedBaseAddress="1"
|
FixedBaseAddress="1"/>
|
||||||
/>
|
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCMIDLTool"/>
|
Name="VCMIDLTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
@@ -82,7 +81,7 @@
|
|||||||
UsePrecompiledHeader="0"
|
UsePrecompiledHeader="0"
|
||||||
WarningLevel="4"
|
WarningLevel="4"
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
Detect64BitPortabilityProblems="TRUE"
|
||||||
DebugInformationFormat="0"/>
|
DebugInformationFormat="3"/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCCustomBuildTool"/>
|
Name="VCCustomBuildTool"/>
|
||||||
<Tool
|
<Tool
|
||||||
|
@@ -1331,6 +1331,44 @@ int main()
|
|||||||
dummy.~MarkTypePair();
|
dummy.~MarkTypePair();
|
||||||
}
|
}
|
||||||
#endif //BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE
|
#endif //BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE
|
||||||
|
|
||||||
|
//Check construction with try_emplace_t 0/1 arguments for each pair
|
||||||
|
{
|
||||||
|
typedef ::allocator_argument_tester<NotUsesAllocator, 0> MarkType;
|
||||||
|
typedef pair<MarkType, MarkType> MarkTypePair;
|
||||||
|
MarkTypePair dummy;
|
||||||
|
dummy.~MarkTypePair();
|
||||||
|
s0i.construct(&dummy, try_emplace_t(), 5, 1);
|
||||||
|
BOOST_TEST(dummy.first.construction_type == NotUsesAllocator);
|
||||||
|
BOOST_TEST(dummy.second.construction_type == NotUsesAllocator);
|
||||||
|
BOOST_TEST(dummy.first.value == 5);
|
||||||
|
BOOST_TEST(dummy.second.value == 1);
|
||||||
|
dummy.~MarkTypePair();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
typedef ::allocator_argument_tester<ConstructibleSuffix, 0> MarkType;
|
||||||
|
typedef pair<MarkType, MarkType> MarkTypePair;
|
||||||
|
MarkTypePair dummy;
|
||||||
|
dummy.~MarkTypePair();
|
||||||
|
s0i.construct(&dummy, try_emplace_t(), 6);
|
||||||
|
BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix);
|
||||||
|
BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix);
|
||||||
|
BOOST_TEST(dummy.first.value == 6);
|
||||||
|
BOOST_TEST(dummy.second.value == 0);
|
||||||
|
dummy.~MarkTypePair();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
typedef ::allocator_argument_tester<ConstructiblePrefix, 0> MarkType;
|
||||||
|
typedef pair<MarkType, MarkType> MarkTypePair;
|
||||||
|
MarkTypePair dummy;
|
||||||
|
dummy.~MarkTypePair();
|
||||||
|
s0i.construct(&dummy, try_emplace_t(), 7, 2);
|
||||||
|
BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix);
|
||||||
|
BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix);
|
||||||
|
BOOST_TEST(dummy.first.value == 7);
|
||||||
|
BOOST_TEST(dummy.second.value == 2);
|
||||||
|
dummy.~MarkTypePair();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -650,10 +650,13 @@ void test_sv_elem(T const& t)
|
|||||||
|
|
||||||
bool default_init_test()//Test for default initialization
|
bool default_init_test()//Test for default initialization
|
||||||
{
|
{
|
||||||
typedef static_vector<int, 100> di_vector_t;
|
|
||||||
|
|
||||||
const std::size_t Capacity = 100;
|
const std::size_t Capacity = 100;
|
||||||
|
|
||||||
|
typedef static_vector<int, Capacity> di_vector_t;
|
||||||
|
|
||||||
|
{
|
||||||
|
di_vector_t v(Capacity, default_init);
|
||||||
|
}
|
||||||
{
|
{
|
||||||
di_vector_t v;
|
di_vector_t v;
|
||||||
int *p = v.data();
|
int *p = v.data();
|
||||||
@@ -662,7 +665,7 @@ bool default_init_test()//Test for default initialization
|
|||||||
*p = static_cast<int>(i);
|
*p = static_cast<int>(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Destroy the vector, p stilll pointing to the storage
|
//Destroy the vector, p still pointing to the storage
|
||||||
v.~di_vector_t();
|
v.~di_vector_t();
|
||||||
|
|
||||||
di_vector_t &rv = *::new(&v)di_vector_t(Capacity, default_init);
|
di_vector_t &rv = *::new(&v)di_vector_t(Capacity, default_init);
|
||||||
|
Reference in New Issue
Block a user