////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2011-2013. 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/container for documentation. // ////////////////////////////////////////////////////////////////////////////// #include #include // container/detail #include // move #include #include //boost #include // std #include #include #if defined(BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE) #include #endif //test #include #include "allocator_argument_tester.hpp" template struct tagged_integer {}; struct mark_on_destructor { mark_on_destructor() { destroyed = false; } ~mark_on_destructor() { destroyed = true; } static bool destroyed; }; bool mark_on_destructor::destroyed = false; #include #include #include #include int main() { using namespace boost::container; typedef propagation_test_allocator, 0> OuterAlloc; typedef propagation_test_allocator, 10> Outer10IdAlloc; typedef propagation_test_allocator, 0> Rebound9OuterAlloc; typedef propagation_test_allocator, 1> InnerAlloc1; typedef propagation_test_allocator, 2> InnerAlloc2; typedef propagation_test_allocator, 11> Inner11IdAlloc1; typedef propagation_test_allocator, 0, false> OuterAllocFalseHasTrueTypes; typedef propagation_test_allocator, 0, true> OuterAllocTrueHasTrueTypes; typedef propagation_test_allocator, 1, false> InnerAlloc1FalseHasTrueTypes; typedef propagation_test_allocator, 1, true> InnerAlloc1TrueHasTrueTypes; typedef propagation_test_allocator, 2, false> InnerAlloc2FalseHasTrueTypes; typedef propagation_test_allocator, 2, true> InnerAlloc2TrueHasTrueTypes; // typedef scoped_allocator_adaptor< OuterAlloc > Scoped0Inner; typedef scoped_allocator_adaptor< OuterAlloc , InnerAlloc1 > Scoped1Inner; typedef scoped_allocator_adaptor< OuterAlloc , InnerAlloc1 , InnerAlloc2 > Scoped2Inner; typedef scoped_allocator_adaptor < scoped_allocator_adaptor > ScopedScoped0Inner; typedef scoped_allocator_adaptor < scoped_allocator_adaptor , InnerAlloc1 > ScopedScoped1Inner; typedef scoped_allocator_adaptor< Rebound9OuterAlloc > Rebound9Scoped0Inner; typedef scoped_allocator_adaptor< Rebound9OuterAlloc , InnerAlloc1 > Rebound9Scoped1Inner; typedef scoped_allocator_adaptor< Rebound9OuterAlloc , InnerAlloc1 , InnerAlloc2 > Rebound9Scoped2Inner; //outer_allocator_type BOOST_STATIC_ASSERT(( dtl::is_same< OuterAlloc , Scoped0Inner::outer_allocator_type>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< OuterAlloc , Scoped1Inner::outer_allocator_type>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< OuterAlloc , Scoped2Inner::outer_allocator_type>::value )); //value_type BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::value_type , Scoped0Inner::value_type>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::value_type , Scoped1Inner::value_type>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::value_type , Scoped2Inner::value_type>::value )); //size_type BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::size_type , Scoped0Inner::size_type>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::size_type , Scoped1Inner::size_type>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::size_type , Scoped2Inner::size_type>::value )); //difference_type BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::difference_type , Scoped0Inner::difference_type>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::difference_type , Scoped1Inner::difference_type>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::difference_type , Scoped2Inner::difference_type>::value )); //pointer BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::pointer , Scoped0Inner::pointer>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::pointer , Scoped1Inner::pointer>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::pointer , Scoped2Inner::pointer>::value )); //const_pointer BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::const_pointer , Scoped0Inner::const_pointer>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::const_pointer , Scoped1Inner::const_pointer>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::const_pointer , Scoped2Inner::const_pointer>::value )); //void_pointer BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::void_pointer , Scoped0Inner::void_pointer>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::void_pointer , Scoped1Inner::void_pointer>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::void_pointer , Scoped2Inner::void_pointer>::value )); //const_void_pointer BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::const_void_pointer , Scoped0Inner::const_void_pointer>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::const_void_pointer , Scoped1Inner::const_void_pointer>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits::const_void_pointer , Scoped2Inner::const_void_pointer>::value )); //rebind BOOST_STATIC_ASSERT(( dtl::is_same >::other , Rebound9Scoped0Inner >::value )); BOOST_STATIC_ASSERT(( dtl::is_same >::other , Rebound9Scoped1Inner >::value )); BOOST_STATIC_ASSERT(( dtl::is_same >::other , Rebound9Scoped2Inner >::value )); //inner_allocator_type BOOST_STATIC_ASSERT(( dtl::is_same< Scoped0Inner , Scoped0Inner::inner_allocator_type>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< scoped_allocator_adaptor , Scoped1Inner::inner_allocator_type>::value )); BOOST_STATIC_ASSERT(( dtl::is_same< scoped_allocator_adaptor , Scoped2Inner::inner_allocator_type>::value )); { //Propagation test 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 BOOST_STATIC_ASSERT(( !Scoped0InnerF::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped0InnerT::propagate_on_container_copy_assignment::value )); //1 inner BOOST_STATIC_ASSERT(( !Scoped1InnerFF::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped1InnerFT::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped1InnerTF::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped1InnerTT::propagate_on_container_copy_assignment::value )); //2 inner BOOST_STATIC_ASSERT(( !Scoped2InnerFFF::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerFFT::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerFTF::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerFTT::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerTFF::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerTFT::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerTTF::propagate_on_container_copy_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerTTT::propagate_on_container_copy_assignment::value )); //propagate_on_container_move_assignment //0 inner BOOST_STATIC_ASSERT(( !Scoped0InnerF::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped0InnerT::propagate_on_container_move_assignment::value )); //1 inner BOOST_STATIC_ASSERT(( !Scoped1InnerFF::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped1InnerFT::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped1InnerTF::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped1InnerTT::propagate_on_container_move_assignment::value )); //2 inner BOOST_STATIC_ASSERT(( !Scoped2InnerFFF::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerFFT::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerFTF::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerFTT::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerTFF::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerTFT::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerTTF::propagate_on_container_move_assignment::value )); BOOST_STATIC_ASSERT(( Scoped2InnerTTT::propagate_on_container_move_assignment::value )); //propagate_on_container_swap //0 inner BOOST_STATIC_ASSERT(( !Scoped0InnerF::propagate_on_container_swap::value )); BOOST_STATIC_ASSERT(( Scoped0InnerT::propagate_on_container_swap::value )); //1 inner BOOST_STATIC_ASSERT(( !Scoped1InnerFF::propagate_on_container_swap::value )); BOOST_STATIC_ASSERT(( Scoped1InnerFT::propagate_on_container_swap::value )); BOOST_STATIC_ASSERT(( Scoped1InnerTF::propagate_on_container_swap::value )); BOOST_STATIC_ASSERT(( Scoped1InnerTT::propagate_on_container_swap::value )); //2 inner BOOST_STATIC_ASSERT(( !Scoped2InnerFFF::propagate_on_container_swap::value )); BOOST_STATIC_ASSERT(( Scoped2InnerFFT::propagate_on_container_swap::value )); BOOST_STATIC_ASSERT(( Scoped2InnerFTF::propagate_on_container_swap::value )); BOOST_STATIC_ASSERT(( Scoped2InnerFTT::propagate_on_container_swap::value )); BOOST_STATIC_ASSERT(( Scoped2InnerTFF::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(( 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 { Scoped0Inner s0i; Scoped1Inner s1i; //Swap { Scoped0Inner s0i2; Scoped1Inner s1i2; boost::adl_move_swap(s0i, s0i2); boost::adl_move_swap(s1i, s1i2); } } //Default constructor { Scoped0Inner s0i; Scoped1Inner s1i; } //Copy constructor/assignment { Scoped0Inner s0i; Scoped1Inner s1i; Scoped2Inner s2i; Scoped0Inner s0i_b(s0i); Scoped1Inner s1i_b(s1i); Scoped2Inner s2i_b(s2i); BOOST_TEST(s0i == s0i_b); BOOST_TEST(s1i == s1i_b); BOOST_TEST(s2i == s2i_b); s0i_b = s0i; s1i_b = s1i; s2i_b = s2i; BOOST_TEST(s0i == s0i_b); BOOST_TEST(s1i == s1i_b); BOOST_TEST(s2i == s2i_b); } //Copy/move constructor/assignment { Scoped0Inner s0i; Scoped1Inner s1i; Scoped2Inner s2i; Scoped0Inner s0i_b(::boost::move(s0i)); Scoped1Inner s1i_b(::boost::move(s1i)); Scoped2Inner s2i_b(::boost::move(s2i)); BOOST_TEST(s0i_b.outer_allocator().m_move_contructed); BOOST_TEST(s1i_b.outer_allocator().m_move_contructed); BOOST_TEST(s2i_b.outer_allocator().m_move_contructed); s0i_b = ::boost::move(s0i); s1i_b = ::boost::move(s1i); s2i_b = ::boost::move(s2i); BOOST_TEST(s0i_b.outer_allocator().m_move_assigned); BOOST_TEST(s1i_b.outer_allocator().m_move_assigned); BOOST_TEST(s2i_b.outer_allocator().m_move_assigned); } //inner_allocator() { Scoped0Inner s0i; Scoped1Inner s1i; Scoped2Inner s2i; const Scoped0Inner const_s0i; const Scoped1Inner const_s1i; const Scoped2Inner const_s2i; Scoped0Inner::inner_allocator_type &s0i_inner = s0i.inner_allocator(); (void)s0i_inner; const Scoped0Inner::inner_allocator_type &const_s0i_inner = const_s0i.inner_allocator(); (void)const_s0i_inner; Scoped1Inner::inner_allocator_type &s1i_inner = s1i.inner_allocator(); (void)s1i_inner; const Scoped1Inner::inner_allocator_type &const_s1i_inner = const_s1i.inner_allocator(); (void)const_s1i_inner; Scoped2Inner::inner_allocator_type &s2i_inner = s2i.inner_allocator(); (void)s2i_inner; const Scoped2Inner::inner_allocator_type &const_s2i_inner = const_s2i.inner_allocator(); (void)const_s2i_inner; } //operator==/!= { const Scoped0Inner const_s0i; const Rebound9Scoped0Inner const_rs0i; BOOST_TEST(const_s0i == const_s0i); BOOST_TEST(const_rs0i == const_s0i); BOOST_TEST(const_s0i == const_s0i); BOOST_TEST(const_s0i == const_rs0i); const Scoped1Inner const_s1i; const Rebound9Scoped1Inner const_rs1i; BOOST_TEST(const_s1i == const_s1i); BOOST_TEST(const_rs1i == const_s1i); BOOST_TEST(const_s1i == const_s1i); BOOST_TEST(const_s1i == const_rs1i); const Scoped2Inner const_s2i; const Rebound9Scoped2Inner const_rs2i; BOOST_TEST(const_s2i == const_s2i); BOOST_TEST(const_s2i == const_rs2i); BOOST_TEST(const_s2i == const_s2i); BOOST_TEST(const_s2i == const_rs2i); } //outer_allocator() { Scoped0Inner s0i; Scoped1Inner s1i; Scoped2Inner s2i; const Scoped0Inner const_s0i; const Scoped1Inner const_s1i; const Scoped2Inner const_s2i; Scoped0Inner::outer_allocator_type &s0i_inner = s0i.outer_allocator(); (void)s0i_inner; const Scoped0Inner::outer_allocator_type &const_s0i_inner = const_s0i.outer_allocator(); (void)const_s0i_inner; Scoped1Inner::outer_allocator_type &s1i_inner = s1i.outer_allocator(); (void)s1i_inner; const Scoped1Inner::outer_allocator_type &const_s1i_inner = const_s1i.outer_allocator(); (void)const_s1i_inner; Scoped2Inner::outer_allocator_type &s2i_inner = s2i.outer_allocator(); (void)s2i_inner; const Scoped2Inner::outer_allocator_type &const_s2i_inner = const_s2i.outer_allocator(); (void)const_s2i_inner; } //max_size() { const Scoped0Inner const_s0i; const Scoped1Inner const_s1i; const Scoped2Inner const_s2i; const OuterAlloc const_oa; const InnerAlloc1 const_ia1; const InnerAlloc2 const_ia2; BOOST_TEST(const_s0i.max_size() == const_oa.max_size()); BOOST_TEST(const_s1i.max_size() == const_oa.max_size()); BOOST_TEST(const_s2i.max_size() == const_oa.max_size()); BOOST_TEST(const_s1i.inner_allocator().max_size() == const_ia1.max_size()); BOOST_TEST(const_s2i.inner_allocator().inner_allocator().max_size() == const_ia2.max_size()); } //Copy and move operations { //Construction { Scoped0Inner s0i_a, s0i_b(s0i_a), s0i_c(::boost::move(s0i_b)); Scoped1Inner s1i_a, s1i_b(s1i_a), s1i_c(::boost::move(s1i_b)); Scoped2Inner s2i_a, s2i_b(s2i_a), s2i_c(::boost::move(s2i_b)); } //Assignment { Scoped0Inner s0i_a, s0i_b; s0i_a = s0i_b; s0i_a = ::boost::move(s0i_b); Scoped1Inner s1i_a, s1i_b; s1i_a = s1i_b; s1i_a = ::boost::move(s1i_b); Scoped2Inner s2i_a, s2i_b; s2i_a = s2i_b; s2i_a = ::boost::move(s2i_b); } OuterAlloc oa; InnerAlloc1 ia1; InnerAlloc2 ia2; Rebound9OuterAlloc roa; Rebound9Scoped0Inner rs0i; Rebound9Scoped1Inner rs1i; Rebound9Scoped2Inner rs2i; //Copy from outer { Scoped0Inner s0i(oa); Scoped1Inner s1i(oa, ia1); Scoped2Inner s2i(oa, ia1, ia2); } //Move from outer { Scoped0Inner s0i(::boost::move(oa)); Scoped1Inner s1i(::boost::move(oa), ia1); Scoped2Inner s2i(::boost::move(oa), ia1, ia2); } //Copy from rebound outer { Scoped0Inner s0i(roa); Scoped1Inner s1i(roa, ia1); Scoped2Inner s2i(roa, ia1, ia2); } //Move from rebound outer { Scoped0Inner s0i(::boost::move(roa)); Scoped1Inner s1i(::boost::move(roa), ia1); Scoped2Inner s2i(::boost::move(roa), ia1, ia2); } //Copy from rebound scoped { Scoped0Inner s0i(rs0i); Scoped1Inner s1i(rs1i); Scoped2Inner s2i(rs2i); } //Move from rebound scoped { Scoped0Inner s0i(::boost::move(rs0i)); Scoped1Inner s1i(::boost::move(rs1i)); Scoped2Inner s2i(::boost::move(rs2i)); } } { vector > > dummy; dummy.push_back(0); } //destroy() { { Scoped0Inner s0i; mark_on_destructor mod; s0i.destroy(&mod); BOOST_TEST(mark_on_destructor::destroyed); } { Scoped1Inner s1i; mark_on_destructor mod; s1i.destroy(&mod); BOOST_TEST(mark_on_destructor::destroyed); } { Scoped2Inner s2i; mark_on_destructor mod; s2i.destroy(&mod); BOOST_TEST(mark_on_destructor::destroyed); } } //construct { //////////////////////////////////////////////////////////// //First check scoped allocator with just OuterAlloc. //In this case OuterAlloc (propagation_test_allocator with tag 0) should be //used to construct types. //////////////////////////////////////////////////////////// { Scoped0Inner s0i; //Check construction with 0 user arguments { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s0i.construct(&dummy); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 0 ); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s0i.construct(&dummy); BOOST_TEST(dummy.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s0i.construct(&dummy); BOOST_TEST(dummy.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } //Check construction with 1 user arguments { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s0i.construct(&dummy, 1); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 1); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s0i.construct(&dummy, 2); BOOST_TEST(dummy.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.value == 2); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s0i.construct(&dummy, 3); BOOST_TEST(dummy.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.value == 3); dummy.~MarkType(); } } //////////////////////////////////////////////////////////// //Then check scoped allocator with OuterAlloc and InnerAlloc. //In this case InnerAlloc (propagation_test_allocator with tag 1) should be //used to construct types. //////////////////////////////////////////////////////////// { Scoped1Inner s1i; //Check construction with 0 user arguments { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s1i.construct(&dummy); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s1i.construct(&dummy); BOOST_TEST(dummy.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s1i.construct(&dummy); BOOST_TEST(dummy.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } //Check construction with 1 user arguments { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s1i.construct(&dummy, 1); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 1); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s1i.construct(&dummy, 2); BOOST_TEST(dummy.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.value == 2); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); s1i.construct(&dummy, 3); BOOST_TEST(dummy.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.value == 3); dummy.~MarkType(); } } ////////////////////////////////////////////////////////////////////////////////// //Now test recursive OuterAllocator types (OuterAllocator is a scoped_allocator) ////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //First check scoped allocator with just OuterAlloc. //In this case OuterAlloc (propagation_test_allocator with tag 0) should be //used to construct types. //////////////////////////////////////////////////////////// { //Check outer_allocator_type is scoped BOOST_STATIC_ASSERT(( is_scoped_allocator ::value )); BOOST_STATIC_ASSERT(( dtl::is_same < outermost_allocator::type , Outer10IdAlloc >::value )); BOOST_STATIC_ASSERT(( dtl::is_same < ScopedScoped0Inner::outer_allocator_type , scoped_allocator_adaptor >::value )); BOOST_STATIC_ASSERT(( dtl::is_same < scoped_allocator_adaptor::outer_allocator_type , Outer10IdAlloc >::value )); ScopedScoped0Inner ssro0i; Outer10IdAlloc & val = outermost_allocator::get(ssro0i); (void)val; //Check construction with 0 user arguments { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro0i.construct(&dummy); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro0i.construct(&dummy); BOOST_TEST(dummy.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro0i.construct(&dummy); BOOST_TEST(dummy.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } //Check construction with 1 user arguments { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro0i.construct(&dummy, 1); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 1); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro0i.construct(&dummy, 2); BOOST_TEST(dummy.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.value == 2); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro0i.construct(&dummy, 3); BOOST_TEST(dummy.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.value == 3); dummy.~MarkType(); } } //////////////////////////////////////////////////////////// //Then check scoped allocator with OuterAlloc and InnerAlloc. //In this case inner_allocator_type is not convertible to //::allocator_argument_tester so uses_allocator //should be false on all tests. //////////////////////////////////////////////////////////// { //Check outer_allocator_type is scoped BOOST_STATIC_ASSERT(( is_scoped_allocator ::value )); BOOST_STATIC_ASSERT(( dtl::is_same < outermost_allocator::type , Outer10IdAlloc >::value )); BOOST_STATIC_ASSERT(( dtl::is_same < ScopedScoped1Inner::outer_allocator_type , scoped_allocator_adaptor >::value )); BOOST_STATIC_ASSERT(( dtl::is_same < scoped_allocator_adaptor::outer_allocator_type , Outer10IdAlloc >::value )); BOOST_STATIC_ASSERT(( ! uses_allocator < ::allocator_argument_tester , ScopedScoped1Inner::inner_allocator_type::outer_allocator_type >::value )); ScopedScoped1Inner ssro1i; Outer10IdAlloc & val = outermost_allocator::get(ssro1i); (void)val; //Check construction with 0 user arguments { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro1i.construct(&dummy); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro1i.construct(&dummy); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro1i.construct(&dummy); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 0); dummy.~MarkType(); } //Check construction with 1 user arguments { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro1i.construct(&dummy, 1); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 1); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro1i.construct(&dummy, 2); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 2); dummy.~MarkType(); } { typedef ::allocator_argument_tester MarkType; MarkType dummy; dummy.~MarkType(); ssro1i.construct(&dummy, 3); BOOST_TEST(dummy.construction_type == NotUsesAllocator); BOOST_TEST(dummy.value == 3); dummy.~MarkType(); } } //////////////////////////////////////////////////////////// //Now check propagation to pair //////////////////////////////////////////////////////////// //First check scoped allocator with just OuterAlloc. //In this case OuterAlloc (propagation_test_allocator with tag 0) should be //used to construct types. //////////////////////////////////////////////////////////// { using dtl::pair; typedef propagation_test_allocator< pair< tagged_integer<0> , tagged_integer<0> >, 0> OuterPairAlloc; // typedef scoped_allocator_adaptor < OuterPairAlloc > ScopedPair0Inner; ScopedPair0Inner s0i; //Check construction with 0 user arguments { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } #if defined(BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE) //Check construction with 0 user arguments and Std tuple { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple<>(), std::tuple<>()); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple<>(), std::tuple<>()); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple<>(), std::tuple<>()); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple<>(), std::tuple<>()); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple<>(), std::tuple<>()); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple<>(), std::tuple<>()); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } #endif //BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE //Check construction with 1 user arguments for each pair { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, 1, 1); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, 1, 1); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, 2, 2); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 2); BOOST_TEST(dummy.second.value == 2); dummy.~MarkTypePair(); } //Check construction with 1 user arguments for each pair and Boost tuple { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, boost::tuple(1), boost::tuple(1)); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, boost::tuple(1), boost::tuple(1)); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, boost::tuple(2), boost::tuple(2)); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 2); BOOST_TEST(dummy.second.value == 2); dummy.~MarkTypePair(); } #if defined(BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE) //Check construction with 1 user arguments for each pair and Boost tuple { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple(1), std::tuple(1)); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple(1), std::tuple(1)); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple(2), std::tuple(2)); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 2); BOOST_TEST(dummy.second.value == 2); dummy.~MarkTypePair(); } #endif //BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE //Check construction with pair copy construction { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy, dummy2; dummy.~MarkTypePair(); s0i.construct(&dummy, dummy2); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy, dummy2(1, 1); dummy.~MarkTypePair(); s0i.construct(&dummy, dummy2); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy, dummy2(2, 2); dummy.~MarkTypePair(); s0i.construct(&dummy, dummy2); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 2); BOOST_TEST(dummy.second.value == 2); dummy.~MarkTypePair(); } //Check construction with pair move construction { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy, dummy2(3, 3); dummy2.first.construction_type = dummy2.second.construction_type = ConstructibleSuffix; dummy.~MarkTypePair(); s0i.construct(&dummy, ::boost::move(dummy2)); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 3); BOOST_TEST(dummy.second.value == 3); BOOST_TEST(dummy2.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy2.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy2.first.value == 0); BOOST_TEST(dummy2.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy, dummy2(1, 1); dummy.~MarkTypePair(); s0i.construct(&dummy, ::boost::move(dummy2)); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 1); BOOST_TEST(dummy2.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy2.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy2.first.value == 0); BOOST_TEST(dummy2.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy, dummy2(2, 2); dummy.~MarkTypePair(); s0i.construct(&dummy, ::boost::move(dummy2)); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 2); BOOST_TEST(dummy.second.value == 2); BOOST_TEST(dummy2.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy2.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy2.first.value == 0); BOOST_TEST(dummy2.second.value == 0); dummy.~MarkTypePair(); } //Check construction with related pair copy construction { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; pair dummy2; dummy.~MarkTypePair(); s0i.construct(&dummy, dummy2); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; pair dummy2(1, 1); dummy.~MarkTypePair(); s0i.construct(&dummy, dummy2); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; pair dummy2(2, 2); dummy.~MarkTypePair(); s0i.construct(&dummy, dummy2); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 2); BOOST_TEST(dummy.second.value == 2); dummy.~MarkTypePair(); } //Check construction with related pair move construction { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; pair dummy2(3, 3); dummy.~MarkTypePair(); s0i.construct(&dummy, ::boost::move(dummy2)); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 3); BOOST_TEST(dummy.second.value == 3); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; pair dummy2(1, 1); dummy.~MarkTypePair(); s0i.construct(&dummy, ::boost::move(dummy2)); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; pair dummy2(2, 2); dummy.~MarkTypePair(); s0i.construct(&dummy, ::boost::move(dummy2)); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 2); BOOST_TEST(dummy.second.value == 2); dummy.~MarkTypePair(); } //Check construction with 0/1 arguments for each pair and Boost tuple { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, boost::tuple<>(), boost::tuple(1)); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, boost::tuple(1), boost::tuple<>()); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, boost::tuple<>(), boost::tuple(2)); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 2); dummy.~MarkTypePair(); } #if defined(BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE) //Check construction with 0/1 arguments for each pair and Boost tuple { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple<>(), std::tuple(1)); BOOST_TEST(dummy.first.construction_type == NotUsesAllocator); BOOST_TEST(dummy.second.construction_type == NotUsesAllocator); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 1); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple(1), std::tuple<>()); BOOST_TEST(dummy.first.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.second.construction_type == ConstructibleSuffix); BOOST_TEST(dummy.first.value == 1); BOOST_TEST(dummy.second.value == 0); dummy.~MarkTypePair(); } { typedef ::allocator_argument_tester MarkType; typedef pair MarkTypePair; MarkTypePair dummy; dummy.~MarkTypePair(); s0i.construct(&dummy, piecewise_construct, std::tuple<>(), std::tuple(2)); BOOST_TEST(dummy.first.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.second.construction_type == ConstructiblePrefix); BOOST_TEST(dummy.first.value == 0); BOOST_TEST(dummy.second.value == 2); dummy.~MarkTypePair(); } #endif //BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE //Check construction with try_emplace_t 0/1 arguments for each pair { typedef ::allocator_argument_tester MarkType; typedef pair 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 MarkType; typedef pair 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 MarkType; typedef pair 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(); } } } return ::boost::report_errors(); } #include