mirror of
https://github.com/boostorg/container.git
synced 2025-08-03 14:34:27 +02:00
Added C++17's is_always_equal to allocator_traits and scoped_allocator_adaptor
This commit is contained in:
@@ -749,7 +749,8 @@ C++11 further improves stateful allocator support through
|
|||||||
an allocator writer can customize its behaviour (should the container propagate it in
|
an allocator writer can customize its behaviour (should the container propagate it in
|
||||||
move constructor, swap, etc.?) following `allocator_traits` requirements. [*Boost.Container]
|
move constructor, swap, etc.?) following `allocator_traits` requirements. [*Boost.Container]
|
||||||
not only supports this model with C++11 but also [*backports it to C++03] via
|
not only supports this model with C++11 but also [*backports it to C++03] via
|
||||||
[classref boost::container::allocator_traits boost::container::allocator_traits]. This class
|
[classref boost::container::allocator_traits boost::container::allocator_traits] including some
|
||||||
|
C++17 changes. This class
|
||||||
offers some workarounds for C++03 compilers to achieve the same allocator guarantees as
|
offers some workarounds for C++03 compilers to achieve the same allocator guarantees as
|
||||||
`std::allocator_traits`.
|
`std::allocator_traits`.
|
||||||
|
|
||||||
@@ -1084,6 +1085,7 @@ use [*Boost.Container]? There are several reasons for that:
|
|||||||
* Massive dependency reorganization. Now [*Boost.Container depends on very basic utilities like Boost.Core
|
* Massive dependency reorganization. Now [*Boost.Container depends on very basic utilities like Boost.Core
|
||||||
and [*Boost.Intrusive]. Preprocessed code size have decreased considerably and compilation times have improved.
|
and [*Boost.Intrusive]. Preprocessed code size have decreased considerably and compilation times have improved.
|
||||||
* Added `nth` and `index_of` functions to containers with random-access iterators (except `basic_string`).
|
* Added `nth` and `index_of` functions to containers with random-access iterators (except `basic_string`).
|
||||||
|
* Added C++17's `allocator_traits<Allocator>::is_always_equal`.
|
||||||
* Fixed bugs:
|
* Fixed bugs:
|
||||||
* [@https://svn.boost.org/trac/boost/ticket/10790 Trac #10790 (['long long errors from container"])].
|
* [@https://svn.boost.org/trac/boost/ticket/10790 Trac #10790 (['long long errors from container"])].
|
||||||
* [@https://svn.boost.org/trac/boost/ticket/10808 Trac #10808 (['compare equal operator of vector is broken"])].
|
* [@https://svn.boost.org/trac/boost/ticket/10808 Trac #10808 (['compare equal operator of vector is broken"])].
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
// container
|
// container
|
||||||
#include <boost/container/container_fwd.hpp>
|
#include <boost/container/container_fwd.hpp>
|
||||||
#include <boost/container/detail/mpl.hpp>
|
#include <boost/container/detail/mpl.hpp>
|
||||||
|
#include <boost/container/detail/type_traits.hpp> //is_empty
|
||||||
#include <boost/container/detail/placement_new.hpp>
|
#include <boost/container/detail/placement_new.hpp>
|
||||||
#ifndef BOOST_CONTAINER_DETAIL_STD_FWD_HPP
|
#ifndef BOOST_CONTAINER_DETAIL_STD_FWD_HPP
|
||||||
#include <boost/container/detail/std_fwd.hpp>
|
#include <boost/container/detail/std_fwd.hpp>
|
||||||
@@ -94,6 +95,7 @@ BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(size_type)
|
|||||||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_copy_assignment)
|
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_copy_assignment)
|
||||||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_move_assignment)
|
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_move_assignment)
|
||||||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_swap)
|
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(propagate_on_container_swap)
|
||||||
|
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(is_always_equal)
|
||||||
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(difference_type)
|
BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(difference_type)
|
||||||
|
|
||||||
} //namespace container_detail {
|
} //namespace container_detail {
|
||||||
@@ -138,12 +140,15 @@ struct allocator_traits
|
|||||||
//! Allocator::propagate_on_container_copy_assignment if such a type exists, otherwise a type
|
//! Allocator::propagate_on_container_copy_assignment if such a type exists, otherwise a type
|
||||||
//! with an internal constant static boolean member <code>value</code> == false.
|
//! with an internal constant static boolean member <code>value</code> == false.
|
||||||
typedef see_documentation propagate_on_container_copy_assignment;
|
typedef see_documentation propagate_on_container_copy_assignment;
|
||||||
//! Allocator::propagate_on_container_move_assignment if such a type exists, otherwise otherwise a type
|
//! Allocator::propagate_on_container_move_assignment if such a type exists, otherwise a type
|
||||||
//! with an internal constant static boolean member <code>value</code> == false.
|
//! with an internal constant static boolean member <code>value</code> == false.
|
||||||
typedef see_documentation propagate_on_container_move_assignment;
|
typedef see_documentation propagate_on_container_move_assignment;
|
||||||
//! Allocator::propagate_on_container_swap if such a type exists, otherwise an otherwise a type
|
//! Allocator::propagate_on_container_swap if such a type exists, otherwise a type
|
||||||
//! with an internal constant static boolean member <code>value</code> == false.
|
//! with an internal constant static boolean member <code>value</code> == false.
|
||||||
typedef see_documentation propagate_on_container_swap;
|
typedef see_documentation propagate_on_container_swap;
|
||||||
|
//! Allocator::is_always_equal if such a type exists, otherwise a type
|
||||||
|
//! with an internal constant static boolean member <code>value</code> == is_empty<Allocator>::value
|
||||||
|
typedef see_documentation is_always_equal;
|
||||||
//! Defines an allocator: Allocator::rebind<T>::other if such a type exists; otherwise, Allocator<T, Args>
|
//! Defines an allocator: Allocator::rebind<T>::other if such a type exists; otherwise, Allocator<T, Args>
|
||||||
//! if Allocator is a class template instantiation of the form Allocator<U, Args>, where Args is zero or
|
//! if Allocator is a class template instantiation of the form Allocator<U, Args>, where Args is zero or
|
||||||
//! more type arguments ; otherwise, the instantiation of rebind_alloc is ill-formed.
|
//! more type arguments ; otherwise, the instantiation of rebind_alloc is ill-formed.
|
||||||
@@ -210,7 +215,10 @@ struct allocator_traits
|
|||||||
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator,
|
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator,
|
||||||
propagate_on_container_swap, container_detail::false_type)
|
propagate_on_container_swap, container_detail::false_type)
|
||||||
propagate_on_container_swap;
|
propagate_on_container_swap;
|
||||||
|
//is_always_equal
|
||||||
|
typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(boost::container::container_detail::, Allocator,
|
||||||
|
is_always_equal, container_detail::is_empty<Allocator>)
|
||||||
|
is_always_equal;
|
||||||
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
#if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
|
||||||
//C++11
|
//C++11
|
||||||
template <typename T> using rebind_alloc = typename boost::intrusive::pointer_rebind<Allocator, T>::type;
|
template <typename T> using rebind_alloc = typename boost::intrusive::pointer_rebind<Allocator, T>::type;
|
||||||
|
@@ -38,6 +38,7 @@ using ::boost::move_detail::is_floating_point;
|
|||||||
using ::boost::move_detail::is_integral;
|
using ::boost::move_detail::is_integral;
|
||||||
using ::boost::move_detail::is_enum;
|
using ::boost::move_detail::is_enum;
|
||||||
using ::boost::move_detail::is_pod;
|
using ::boost::move_detail::is_pod;
|
||||||
|
using ::boost::move_detail::is_empty;
|
||||||
using ::boost::move_detail::is_trivially_destructible;
|
using ::boost::move_detail::is_trivially_destructible;
|
||||||
using ::boost::move_detail::is_trivially_default_constructible;
|
using ::boost::move_detail::is_trivially_default_constructible;
|
||||||
using ::boost::move_detail::is_trivially_copy_constructible;
|
using ::boost::move_detail::is_trivially_copy_constructible;
|
||||||
|
@@ -474,6 +474,10 @@ class scoped_allocator_adaptor_base
|
|||||||
outer_traits_type::propagate_on_container_swap::value ||
|
outer_traits_type::propagate_on_container_swap::value ||
|
||||||
inner_allocator_type::propagate_on_container_swap::value
|
inner_allocator_type::propagate_on_container_swap::value
|
||||||
> propagate_on_container_swap;
|
> propagate_on_container_swap;
|
||||||
|
typedef container_detail::bool_<
|
||||||
|
outer_traits_type::is_always_equal::value &&
|
||||||
|
inner_allocator_type::is_always_equal::value
|
||||||
|
> is_always_equal;
|
||||||
|
|
||||||
scoped_allocator_adaptor_base()
|
scoped_allocator_adaptor_base()
|
||||||
{}
|
{}
|
||||||
@@ -613,6 +617,11 @@ class scoped_allocator_adaptor_base<OuterAlloc, true, BOOST_MOVE_TARG##N>\
|
|||||||
inner_allocator_type::propagate_on_container_swap::value\
|
inner_allocator_type::propagate_on_container_swap::value\
|
||||||
> propagate_on_container_swap;\
|
> propagate_on_container_swap;\
|
||||||
\
|
\
|
||||||
|
typedef container_detail::bool_<\
|
||||||
|
outer_traits_type::is_always_equal::value &&\
|
||||||
|
inner_allocator_type::is_always_equal::value\
|
||||||
|
> is_always_equal;\
|
||||||
|
\
|
||||||
scoped_allocator_adaptor_base(){}\
|
scoped_allocator_adaptor_base(){}\
|
||||||
\
|
\
|
||||||
template <class OuterA2>\
|
template <class OuterA2>\
|
||||||
@@ -746,6 +755,8 @@ class scoped_allocator_adaptor_base< OuterAlloc BOOST_CONTAINER_SCOPEDALLOC_DUMM
|
|||||||
propagate_on_container_move_assignment propagate_on_container_move_assignment;
|
propagate_on_container_move_assignment propagate_on_container_move_assignment;
|
||||||
typedef typename outer_traits_type::
|
typedef typename outer_traits_type::
|
||||||
propagate_on_container_swap propagate_on_container_swap;
|
propagate_on_container_swap propagate_on_container_swap;
|
||||||
|
typedef typename outer_traits_type::
|
||||||
|
is_always_equal is_always_equal;
|
||||||
|
|
||||||
scoped_allocator_adaptor_base()
|
scoped_allocator_adaptor_base()
|
||||||
{}
|
{}
|
||||||
@@ -913,21 +924,27 @@ class scoped_allocator_adaptor
|
|||||||
typedef typename outer_traits_type::const_void_pointer const_void_pointer;
|
typedef typename outer_traits_type::const_void_pointer const_void_pointer;
|
||||||
//! Type: A type with a constant boolean <code>value</code> == true if
|
//! Type: A type with a constant boolean <code>value</code> == true if
|
||||||
//!<code>allocator_traits<Allocator>::propagate_on_container_copy_assignment::value</code> is
|
//!<code>allocator_traits<Allocator>::propagate_on_container_copy_assignment::value</code> is
|
||||||
//! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>; otherwise, false otherwise.
|
//! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>, false otherwise.
|
||||||
typedef typename base_type::
|
typedef typename base_type::
|
||||||
propagate_on_container_copy_assignment propagate_on_container_copy_assignment;
|
propagate_on_container_copy_assignment propagate_on_container_copy_assignment;
|
||||||
//! Type: A type with a constant boolean <code>value</code> == true if
|
//! Type: A type with a constant boolean <code>value</code> == true if
|
||||||
//!<code>allocator_traits<Allocator>::propagate_on_container_move_assignment::value</code> is
|
//!<code>allocator_traits<Allocator>::propagate_on_container_move_assignment::value</code> is
|
||||||
//! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>; otherwise, false otherwise.
|
//! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>, false otherwise.
|
||||||
typedef typename base_type::
|
typedef typename base_type::
|
||||||
propagate_on_container_move_assignment propagate_on_container_move_assignment;
|
propagate_on_container_move_assignment propagate_on_container_move_assignment;
|
||||||
|
|
||||||
//! Type: A type with a constant boolean <code>value</code> == true if
|
//! Type: A type with a constant boolean <code>value</code> == true if
|
||||||
//!<code>allocator_traits<Allocator>::propagate_on_container_swap::value</code> is
|
//!<code>allocator_traits<Allocator>::propagate_on_container_swap::value</code> is
|
||||||
//! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>; otherwise, false otherwise.
|
//! true for any <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>, false otherwise.
|
||||||
typedef typename base_type::
|
typedef typename base_type::
|
||||||
propagate_on_container_swap propagate_on_container_swap;
|
propagate_on_container_swap propagate_on_container_swap;
|
||||||
|
|
||||||
|
//! Type: A type with a constant boolean <code>value</code> == true if
|
||||||
|
//!<code>allocator_traits<Allocator>::is_always_equal::value</code> is
|
||||||
|
//! true for all <code>Allocator</code> in the set of <code>OuterAlloc</code> and <code>InnerAllocs...</code>, false otherwise.
|
||||||
|
typedef typename base_type::
|
||||||
|
is_always_equal is_always_equal;
|
||||||
|
|
||||||
//! Type: Rebinds scoped allocator to
|
//! Type: Rebinds scoped allocator to
|
||||||
//! <code>typedef scoped_allocator_adaptor
|
//! <code>typedef scoped_allocator_adaptor
|
||||||
//! < typename outer_traits_type::template portable_rebind_alloc<U>::type
|
//! < typename outer_traits_type::template portable_rebind_alloc<U>::type
|
||||||
|
@@ -103,6 +103,8 @@ class ComplexAllocator
|
|||||||
true_type propagate_on_container_move_assignment;
|
true_type propagate_on_container_move_assignment;
|
||||||
typedef boost::container::container_detail::
|
typedef boost::container::container_detail::
|
||||||
true_type propagate_on_container_swap;
|
true_type propagate_on_container_swap;
|
||||||
|
typedef boost::container::container_detail::
|
||||||
|
true_type is_always_equal;
|
||||||
|
|
||||||
ComplexAllocator()
|
ComplexAllocator()
|
||||||
: allocate_called_(false)
|
: allocate_called_(false)
|
||||||
@@ -247,6 +249,8 @@ int main()
|
|||||||
< SimpleAllocator<int> >::propagate_on_container_move_assignment::value == false ));
|
< SimpleAllocator<int> >::propagate_on_container_move_assignment::value == false ));
|
||||||
BOOST_STATIC_ASSERT(( boost::container::allocator_traits
|
BOOST_STATIC_ASSERT(( boost::container::allocator_traits
|
||||||
< SimpleAllocator<int> >::propagate_on_container_swap::value == false ));
|
< SimpleAllocator<int> >::propagate_on_container_swap::value == false ));
|
||||||
|
BOOST_STATIC_ASSERT(( boost::container::allocator_traits
|
||||||
|
< SimpleAllocator<int> >::is_always_equal::value == false ));
|
||||||
BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits
|
BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits
|
||||||
< SimpleAllocator<int> >::rebind_traits<double>::allocator_type
|
< SimpleAllocator<int> >::rebind_traits<double>::allocator_type
|
||||||
, SimpleAllocator<double> >::value ));
|
, SimpleAllocator<double> >::value ));
|
||||||
@@ -275,6 +279,8 @@ int main()
|
|||||||
< ComplexAllocator<int> >::propagate_on_container_move_assignment::value == true ));
|
< ComplexAllocator<int> >::propagate_on_container_move_assignment::value == true ));
|
||||||
BOOST_STATIC_ASSERT(( boost::container::allocator_traits
|
BOOST_STATIC_ASSERT(( boost::container::allocator_traits
|
||||||
< ComplexAllocator<int> >::propagate_on_container_swap::value == true ));
|
< ComplexAllocator<int> >::propagate_on_container_swap::value == true ));
|
||||||
|
BOOST_STATIC_ASSERT(( boost::container::allocator_traits
|
||||||
|
< ComplexAllocator<int> >::is_always_equal::value == true ));
|
||||||
BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits
|
BOOST_STATIC_ASSERT(( is_same<boost::container::allocator_traits
|
||||||
< ComplexAllocator<int> >::rebind_traits<double>::allocator_type
|
< ComplexAllocator<int> >::rebind_traits<double>::allocator_type
|
||||||
, ComplexAllocator<double> >::value ));
|
, ComplexAllocator<double> >::value ));
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
using namespace boost::container;
|
using namespace boost::container;
|
||||||
|
|
||||||
template<class T, unsigned int Id, bool Propagate = false>
|
template<class T, unsigned int Id, bool HasTrueTypes = false>
|
||||||
class test_allocator
|
class test_allocator
|
||||||
{
|
{
|
||||||
BOOST_COPYABLE_AND_MOVABLE(test_allocator)
|
BOOST_COPYABLE_AND_MOVABLE(test_allocator)
|
||||||
@@ -30,12 +30,13 @@ class test_allocator
|
|||||||
template<class U>
|
template<class U>
|
||||||
struct rebind
|
struct rebind
|
||||||
{
|
{
|
||||||
typedef test_allocator<U, Id, Propagate> other;
|
typedef test_allocator<U, Id, HasTrueTypes> other;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef container_detail::bool_<Propagate> propagate_on_container_copy_assignment;
|
typedef container_detail::bool_<HasTrueTypes> propagate_on_container_copy_assignment;
|
||||||
typedef container_detail::bool_<Propagate> propagate_on_container_move_assignment;
|
typedef container_detail::bool_<HasTrueTypes> propagate_on_container_move_assignment;
|
||||||
typedef container_detail::bool_<Propagate> propagate_on_container_swap;
|
typedef container_detail::bool_<HasTrueTypes> propagate_on_container_swap;
|
||||||
|
typedef container_detail::bool_<HasTrueTypes> is_always_equal;
|
||||||
typedef T value_type;
|
typedef T value_type;
|
||||||
|
|
||||||
test_allocator()
|
test_allocator()
|
||||||
@@ -51,12 +52,12 @@ class test_allocator
|
|||||||
{}
|
{}
|
||||||
|
|
||||||
template<class U>
|
template<class U>
|
||||||
test_allocator(BOOST_RV_REF_BEG test_allocator<U, Id, Propagate> BOOST_RV_REF_END)
|
test_allocator(BOOST_RV_REF_BEG test_allocator<U, Id, HasTrueTypes> BOOST_RV_REF_END)
|
||||||
: m_move_contructed(true), m_move_assigned(false)
|
: m_move_contructed(true), m_move_assigned(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
template<class U>
|
template<class U>
|
||||||
test_allocator(const test_allocator<U, Id, Propagate> &)
|
test_allocator(const test_allocator<U, Id, HasTrueTypes> &)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
test_allocator & operator=(BOOST_COPY_ASSIGN_REF(test_allocator))
|
test_allocator & operator=(BOOST_COPY_ASSIGN_REF(test_allocator))
|
||||||
@@ -83,14 +84,14 @@ class test_allocator
|
|||||||
bool m_move_assigned;
|
bool m_move_assigned;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T1, class T2, unsigned int Id, bool Propagate>
|
template <class T1, class T2, unsigned int Id, bool HasTrueTypes>
|
||||||
bool operator==( const test_allocator<T1, Id, Propagate>&
|
bool operator==( const test_allocator<T1, Id, HasTrueTypes>&
|
||||||
, const test_allocator<T2, Id, Propagate>&)
|
, const test_allocator<T2, Id, HasTrueTypes>&)
|
||||||
{ return true; }
|
{ return true; }
|
||||||
|
|
||||||
template <class T1, class T2, unsigned int Id, bool Propagate>
|
template <class T1, class T2, unsigned int Id, bool HasTrueTypes>
|
||||||
bool operator!=( const test_allocator<T1, Id, Propagate>&
|
bool operator!=( const test_allocator<T1, Id, HasTrueTypes>&
|
||||||
, const test_allocator<T2, Id, Propagate>&)
|
, const test_allocator<T2, Id, HasTrueTypes>&)
|
||||||
{ return false; }
|
{ return false; }
|
||||||
|
|
||||||
|
|
||||||
@@ -269,12 +270,12 @@ int main()
|
|||||||
typedef test_allocator<tagged_integer<2>, 2> InnerAlloc2;
|
typedef test_allocator<tagged_integer<2>, 2> InnerAlloc2;
|
||||||
typedef test_allocator<tagged_integer<1>, 11> Inner11IdAlloc1;
|
typedef test_allocator<tagged_integer<1>, 11> Inner11IdAlloc1;
|
||||||
|
|
||||||
typedef test_allocator<tagged_integer<0>, 0, false> OuterAllocFalsePropagate;
|
typedef test_allocator<tagged_integer<0>, 0, false> OuterAllocFalseHasTrueTypes;
|
||||||
typedef test_allocator<tagged_integer<0>, 0, true> OuterAllocTruePropagate;
|
typedef test_allocator<tagged_integer<0>, 0, true> OuterAllocTrueHasTrueTypes;
|
||||||
typedef test_allocator<tagged_integer<1>, 1, false> InnerAlloc1FalsePropagate;
|
typedef test_allocator<tagged_integer<1>, 1, false> InnerAlloc1FalseHasTrueTypes;
|
||||||
typedef test_allocator<tagged_integer<1>, 1, true> InnerAlloc1TruePropagate;
|
typedef test_allocator<tagged_integer<1>, 1, true> InnerAlloc1TrueHasTrueTypes;
|
||||||
typedef test_allocator<tagged_integer<2>, 2, false> InnerAlloc2FalsePropagate;
|
typedef test_allocator<tagged_integer<2>, 2, false> InnerAlloc2FalseHasTrueTypes;
|
||||||
typedef test_allocator<tagged_integer<2>, 2, true> InnerAlloc2TruePropagate;
|
typedef test_allocator<tagged_integer<2>, 2, true> InnerAlloc2TrueHasTrueTypes;
|
||||||
|
|
||||||
//
|
//
|
||||||
typedef scoped_allocator_adaptor< OuterAlloc > Scoped0Inner;
|
typedef scoped_allocator_adaptor< OuterAlloc > Scoped0Inner;
|
||||||
@@ -379,40 +380,40 @@ int main()
|
|||||||
|
|
||||||
{
|
{
|
||||||
//Propagation test
|
//Propagation test
|
||||||
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate > Scoped0InnerF;
|
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes > Scoped0InnerF;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocTruePropagate > Scoped0InnerT;
|
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes > Scoped0InnerT;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
|
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
|
||||||
, InnerAlloc1FalsePropagate > Scoped1InnerFF;
|
, InnerAlloc1FalseHasTrueTypes > Scoped1InnerFF;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
|
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
|
||||||
, InnerAlloc1TruePropagate > Scoped1InnerFT;
|
, InnerAlloc1TrueHasTrueTypes > Scoped1InnerFT;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
|
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
|
||||||
, InnerAlloc1FalsePropagate > Scoped1InnerTF;
|
, InnerAlloc1FalseHasTrueTypes > Scoped1InnerTF;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
|
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
|
||||||
, InnerAlloc1TruePropagate > Scoped1InnerTT;
|
, InnerAlloc1TrueHasTrueTypes > Scoped1InnerTT;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
|
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
|
||||||
, InnerAlloc1FalsePropagate
|
, InnerAlloc1FalseHasTrueTypes
|
||||||
, InnerAlloc2FalsePropagate > Scoped2InnerFFF;
|
, InnerAlloc2FalseHasTrueTypes > Scoped2InnerFFF;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
|
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
|
||||||
, InnerAlloc1FalsePropagate
|
, InnerAlloc1FalseHasTrueTypes
|
||||||
, InnerAlloc2TruePropagate > Scoped2InnerFFT;
|
, InnerAlloc2TrueHasTrueTypes > Scoped2InnerFFT;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
|
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
|
||||||
, InnerAlloc1TruePropagate
|
, InnerAlloc1TrueHasTrueTypes
|
||||||
, InnerAlloc2FalsePropagate > Scoped2InnerFTF;
|
, InnerAlloc2FalseHasTrueTypes > Scoped2InnerFTF;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
|
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
|
||||||
, InnerAlloc1TruePropagate
|
, InnerAlloc1TrueHasTrueTypes
|
||||||
, InnerAlloc2TruePropagate > Scoped2InnerFTT;
|
, InnerAlloc2TrueHasTrueTypes > Scoped2InnerFTT;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
|
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
|
||||||
, InnerAlloc1FalsePropagate
|
, InnerAlloc1FalseHasTrueTypes
|
||||||
, InnerAlloc2FalsePropagate > Scoped2InnerTFF;
|
, InnerAlloc2FalseHasTrueTypes > Scoped2InnerTFF;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
|
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
|
||||||
, InnerAlloc1FalsePropagate
|
, InnerAlloc1FalseHasTrueTypes
|
||||||
, InnerAlloc2TruePropagate > Scoped2InnerTFT;
|
, InnerAlloc2TrueHasTrueTypes > Scoped2InnerTFT;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
|
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
|
||||||
, InnerAlloc1TruePropagate
|
, InnerAlloc1TrueHasTrueTypes
|
||||||
, InnerAlloc2FalsePropagate > Scoped2InnerTTF;
|
, InnerAlloc2FalseHasTrueTypes > Scoped2InnerTTF;
|
||||||
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
|
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
|
||||||
, InnerAlloc1TruePropagate
|
, InnerAlloc1TrueHasTrueTypes
|
||||||
, InnerAlloc2TruePropagate > Scoped2InnerTTT;
|
, InnerAlloc2TrueHasTrueTypes > Scoped2InnerTTT;
|
||||||
|
|
||||||
//propagate_on_container_copy_assignment
|
//propagate_on_container_copy_assignment
|
||||||
//0 inner
|
//0 inner
|
||||||
@@ -470,6 +471,24 @@ int main()
|
|||||||
BOOST_STATIC_ASSERT(( Scoped2InnerTFT::propagate_on_container_swap::value ));
|
BOOST_STATIC_ASSERT(( Scoped2InnerTFT::propagate_on_container_swap::value ));
|
||||||
BOOST_STATIC_ASSERT(( Scoped2InnerTTF::propagate_on_container_swap::value ));
|
BOOST_STATIC_ASSERT(( Scoped2InnerTTF::propagate_on_container_swap::value ));
|
||||||
BOOST_STATIC_ASSERT(( Scoped2InnerTTT::propagate_on_container_swap::value ));
|
BOOST_STATIC_ASSERT(( Scoped2InnerTTT::propagate_on_container_swap::value ));
|
||||||
|
//is_always_equal
|
||||||
|
//0 inner
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped0InnerF::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( Scoped0InnerT::is_always_equal::value ));
|
||||||
|
//1 inner
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped1InnerFF::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped1InnerFT::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped1InnerTF::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( Scoped1InnerTT::is_always_equal::value ));
|
||||||
|
//2 inner
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped2InnerFFF::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped2InnerFFT::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped2InnerFTF::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped2InnerFTT::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped2InnerTFF::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped2InnerTFT::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( !Scoped2InnerTTF::is_always_equal::value ));
|
||||||
|
BOOST_STATIC_ASSERT(( Scoped2InnerTTT::is_always_equal::value ));
|
||||||
}
|
}
|
||||||
|
|
||||||
//Default constructor
|
//Default constructor
|
||||||
|
Reference in New Issue
Block a user