Added C++17's is_always_equal to allocator_traits and scoped_allocator_adaptor

This commit is contained in:
Ion Gaztañaga
2015-01-18 11:22:52 +01:00
parent 1012987897
commit f0f35a830d
6 changed files with 113 additions and 60 deletions
+72 -53
View File
@@ -21,7 +21,7 @@
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
{
BOOST_COPYABLE_AND_MOVABLE(test_allocator)
@@ -30,12 +30,13 @@ class test_allocator
template<class U>
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_<Propagate> propagate_on_container_move_assignment;
typedef container_detail::bool_<Propagate> propagate_on_container_swap;
typedef container_detail::bool_<HasTrueTypes> propagate_on_container_copy_assignment;
typedef container_detail::bool_<HasTrueTypes> propagate_on_container_move_assignment;
typedef container_detail::bool_<HasTrueTypes> propagate_on_container_swap;
typedef container_detail::bool_<HasTrueTypes> is_always_equal;
typedef T value_type;
test_allocator()
@@ -51,12 +52,12 @@ class test_allocator
{}
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)
{}
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))
@@ -83,14 +84,14 @@ class test_allocator
bool m_move_assigned;
};
template <class T1, class T2, unsigned int Id, bool Propagate>
bool operator==( const test_allocator<T1, Id, Propagate>&
, const test_allocator<T2, Id, Propagate>&)
template <class T1, class T2, unsigned int Id, bool HasTrueTypes>
bool operator==( const test_allocator<T1, Id, HasTrueTypes>&
, const test_allocator<T2, Id, HasTrueTypes>&)
{ return true; }
template <class T1, class T2, unsigned int Id, bool Propagate>
bool operator!=( const test_allocator<T1, Id, Propagate>&
, const test_allocator<T2, Id, Propagate>&)
template <class T1, class T2, unsigned int Id, bool HasTrueTypes>
bool operator!=( const test_allocator<T1, Id, HasTrueTypes>&
, const test_allocator<T2, Id, HasTrueTypes>&)
{ return false; }
@@ -269,12 +270,12 @@ int main()
typedef test_allocator<tagged_integer<2>, 2> InnerAlloc2;
typedef test_allocator<tagged_integer<1>, 11> Inner11IdAlloc1;
typedef test_allocator<tagged_integer<0>, 0, false> OuterAllocFalsePropagate;
typedef test_allocator<tagged_integer<0>, 0, true> OuterAllocTruePropagate;
typedef test_allocator<tagged_integer<1>, 1, false> InnerAlloc1FalsePropagate;
typedef test_allocator<tagged_integer<1>, 1, true> InnerAlloc1TruePropagate;
typedef test_allocator<tagged_integer<2>, 2, false> InnerAlloc2FalsePropagate;
typedef test_allocator<tagged_integer<2>, 2, true> InnerAlloc2TruePropagate;
typedef test_allocator<tagged_integer<0>, 0, false> OuterAllocFalseHasTrueTypes;
typedef test_allocator<tagged_integer<0>, 0, true> OuterAllocTrueHasTrueTypes;
typedef test_allocator<tagged_integer<1>, 1, false> InnerAlloc1FalseHasTrueTypes;
typedef test_allocator<tagged_integer<1>, 1, true> InnerAlloc1TrueHasTrueTypes;
typedef test_allocator<tagged_integer<2>, 2, false> InnerAlloc2FalseHasTrueTypes;
typedef test_allocator<tagged_integer<2>, 2, true> InnerAlloc2TrueHasTrueTypes;
//
typedef scoped_allocator_adaptor< OuterAlloc > Scoped0Inner;
@@ -379,40 +380,40 @@ int main()
{
//Propagation test
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate > Scoped0InnerF;
typedef scoped_allocator_adaptor< OuterAllocTruePropagate > Scoped0InnerT;
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
, InnerAlloc1FalsePropagate > Scoped1InnerFF;
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
, InnerAlloc1TruePropagate > Scoped1InnerFT;
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
, InnerAlloc1FalsePropagate > Scoped1InnerTF;
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
, InnerAlloc1TruePropagate > Scoped1InnerTT;
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
, InnerAlloc1FalsePropagate
, InnerAlloc2FalsePropagate > Scoped2InnerFFF;
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
, InnerAlloc1FalsePropagate
, InnerAlloc2TruePropagate > Scoped2InnerFFT;
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
, InnerAlloc1TruePropagate
, InnerAlloc2FalsePropagate > Scoped2InnerFTF;
typedef scoped_allocator_adaptor< OuterAllocFalsePropagate
, InnerAlloc1TruePropagate
, InnerAlloc2TruePropagate > Scoped2InnerFTT;
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
, InnerAlloc1FalsePropagate
, InnerAlloc2FalsePropagate > Scoped2InnerTFF;
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
, InnerAlloc1FalsePropagate
, InnerAlloc2TruePropagate > Scoped2InnerTFT;
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
, InnerAlloc1TruePropagate
, InnerAlloc2FalsePropagate > Scoped2InnerTTF;
typedef scoped_allocator_adaptor< OuterAllocTruePropagate
, InnerAlloc1TruePropagate
, InnerAlloc2TruePropagate > Scoped2InnerTTT;
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes > Scoped0InnerF;
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes > Scoped0InnerT;
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
, InnerAlloc1FalseHasTrueTypes > Scoped1InnerFF;
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
, InnerAlloc1TrueHasTrueTypes > Scoped1InnerFT;
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
, InnerAlloc1FalseHasTrueTypes > Scoped1InnerTF;
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
, InnerAlloc1TrueHasTrueTypes > Scoped1InnerTT;
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
, InnerAlloc1FalseHasTrueTypes
, InnerAlloc2FalseHasTrueTypes > Scoped2InnerFFF;
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
, InnerAlloc1FalseHasTrueTypes
, InnerAlloc2TrueHasTrueTypes > Scoped2InnerFFT;
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
, InnerAlloc1TrueHasTrueTypes
, InnerAlloc2FalseHasTrueTypes > Scoped2InnerFTF;
typedef scoped_allocator_adaptor< OuterAllocFalseHasTrueTypes
, InnerAlloc1TrueHasTrueTypes
, InnerAlloc2TrueHasTrueTypes > Scoped2InnerFTT;
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
, InnerAlloc1FalseHasTrueTypes
, InnerAlloc2FalseHasTrueTypes > Scoped2InnerTFF;
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
, InnerAlloc1FalseHasTrueTypes
, InnerAlloc2TrueHasTrueTypes > Scoped2InnerTFT;
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
, InnerAlloc1TrueHasTrueTypes
, InnerAlloc2FalseHasTrueTypes > Scoped2InnerTTF;
typedef scoped_allocator_adaptor< OuterAllocTrueHasTrueTypes
, InnerAlloc1TrueHasTrueTypes
, InnerAlloc2TrueHasTrueTypes > Scoped2InnerTTT;
//propagate_on_container_copy_assignment
//0 inner
@@ -470,6 +471,24 @@ int main()
BOOST_STATIC_ASSERT(( Scoped2InnerTFT::propagate_on_container_swap::value ));
BOOST_STATIC_ASSERT(( Scoped2InnerTTF::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