blob: 042820d0fee1200ed947bcf4d5f619ad563a0a0d [file] [log] [blame]
//////////////////////////////////////////////////////////////////////////////
//
// (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 <boost/container/scoped_allocator_fwd.hpp>
// container/detail
#include <boost/container/detail/mpl.hpp>
// move
#include <boost/move/utility_core.hpp>
#include <boost/move/adl_move_swap.hpp>
//boost
#include <boost/tuple/tuple.hpp>
// std
#include <memory>
#include <cstddef>
#if defined(BOOST_CONTAINER_PAIR_TEST_HAS_HEADER_TUPLE)
#include <tuple>
#endif
//test
#include <boost/core/lightweight_test.hpp>
#include "allocator_argument_tester.hpp"
template<unsigned int Type>
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 <boost/container/scoped_allocator.hpp>
#include <boost/static_assert.hpp>
#include <boost/container/vector.hpp>
#include <boost/container/detail/pair.hpp>
int main()
{
using namespace boost::container;
typedef propagation_test_allocator<tagged_integer<0>, 0> OuterAlloc;
typedef propagation_test_allocator<tagged_integer<0>, 10> Outer10IdAlloc;
typedef propagation_test_allocator<tagged_integer<9>, 0> Rebound9OuterAlloc;
typedef propagation_test_allocator<tagged_integer<1>, 1> InnerAlloc1;
typedef propagation_test_allocator<tagged_integer<2>, 2> InnerAlloc2;
typedef propagation_test_allocator<tagged_integer<1>, 11> Inner11IdAlloc1;
typedef propagation_test_allocator<tagged_integer<0>, 0, false> OuterAllocFalseHasTrueTypes;
typedef propagation_test_allocator<tagged_integer<0>, 0, true> OuterAllocTrueHasTrueTypes;
typedef propagation_test_allocator<tagged_integer<1>, 1, false> InnerAlloc1FalseHasTrueTypes;
typedef propagation_test_allocator<tagged_integer<1>, 1, true> InnerAlloc1TrueHasTrueTypes;
typedef propagation_test_allocator<tagged_integer<2>, 2, false> InnerAlloc2FalseHasTrueTypes;
typedef propagation_test_allocator<tagged_integer<2>, 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
<Outer10IdAlloc>
> ScopedScoped0Inner;
typedef scoped_allocator_adaptor
< scoped_allocator_adaptor
<Outer10IdAlloc, Inner11IdAlloc1>
, 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<OuterAlloc>::value_type
, Scoped0Inner::value_type>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::value_type
, Scoped1Inner::value_type>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::value_type
, Scoped2Inner::value_type>::value ));
//size_type
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::size_type
, Scoped0Inner::size_type>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::size_type
, Scoped1Inner::size_type>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::size_type
, Scoped2Inner::size_type>::value ));
//difference_type
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::difference_type
, Scoped0Inner::difference_type>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::difference_type
, Scoped1Inner::difference_type>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::difference_type
, Scoped2Inner::difference_type>::value ));
//pointer
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::pointer
, Scoped0Inner::pointer>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::pointer
, Scoped1Inner::pointer>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::pointer
, Scoped2Inner::pointer>::value ));
//const_pointer
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_pointer
, Scoped0Inner::const_pointer>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_pointer
, Scoped1Inner::const_pointer>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_pointer
, Scoped2Inner::const_pointer>::value ));
//void_pointer
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::void_pointer
, Scoped0Inner::void_pointer>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::void_pointer
, Scoped1Inner::void_pointer>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::void_pointer
, Scoped2Inner::void_pointer>::value ));
//const_void_pointer
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_void_pointer
, Scoped0Inner::const_void_pointer>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_void_pointer
, Scoped1Inner::const_void_pointer>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< allocator_traits<OuterAlloc>::const_void_pointer
, Scoped2Inner::const_void_pointer>::value ));
//rebind
BOOST_STATIC_ASSERT(( dtl::is_same<Scoped0Inner::rebind< tagged_integer<9> >::other
, Rebound9Scoped0Inner >::value ));
BOOST_STATIC_ASSERT(( dtl::is_same<Scoped1Inner::rebind< tagged_integer<9> >::other
, Rebound9Scoped1Inner >::value ));
BOOST_STATIC_ASSERT(( dtl::is_same<Scoped2Inner::rebind< tagged_integer<9> >::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<InnerAlloc1>
, Scoped1Inner::inner_allocator_type>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same< scoped_allocator_adaptor<InnerAlloc1, InnerAlloc2>
, 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<int, scoped_allocator_adaptor< propagation_test_allocator<int, 0> > > 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<NotUsesAllocator, 0> 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<ConstructibleSuffix, 0> 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<ConstructiblePrefix, 0> 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<NotUsesAllocator, 0> 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<ConstructibleSuffix, 0> 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<ConstructiblePrefix, 0> 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<NotUsesAllocator, 1> 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<ConstructibleSuffix, 1> 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<ConstructiblePrefix, 1> 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<NotUsesAllocator, 1> 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<ConstructibleSuffix, 1> 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<ConstructiblePrefix, 1> 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
<ScopedScoped0Inner::outer_allocator_type>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same
< outermost_allocator<ScopedScoped0Inner>::type
, Outer10IdAlloc
>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same
< ScopedScoped0Inner::outer_allocator_type
, scoped_allocator_adaptor<Outer10IdAlloc>
>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same
< scoped_allocator_adaptor<Outer10IdAlloc>::outer_allocator_type
, Outer10IdAlloc
>::value ));
ScopedScoped0Inner ssro0i;
Outer10IdAlloc & val = outermost_allocator<ScopedScoped0Inner>::get(ssro0i);
(void)val;
//Check construction with 0 user arguments
{
typedef ::allocator_argument_tester<NotUsesAllocator, 10> 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<ConstructibleSuffix, 10> 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<ConstructiblePrefix, 10> 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<NotUsesAllocator, 10> 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<ConstructibleSuffix, 10> 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<ConstructiblePrefix, 10> 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<XXX, 10> so uses_allocator
//should be false on all tests.
////////////////////////////////////////////////////////////
{
//Check outer_allocator_type is scoped
BOOST_STATIC_ASSERT(( is_scoped_allocator
<ScopedScoped1Inner::outer_allocator_type>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same
< outermost_allocator<ScopedScoped1Inner>::type
, Outer10IdAlloc
>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same
< ScopedScoped1Inner::outer_allocator_type
, scoped_allocator_adaptor<Outer10IdAlloc, Inner11IdAlloc1>
>::value ));
BOOST_STATIC_ASSERT(( dtl::is_same
< scoped_allocator_adaptor<Outer10IdAlloc, Inner11IdAlloc1>::outer_allocator_type
, Outer10IdAlloc
>::value ));
BOOST_STATIC_ASSERT(( !
uses_allocator
< ::allocator_argument_tester<ConstructibleSuffix, 10>
, ScopedScoped1Inner::inner_allocator_type::outer_allocator_type
>::value ));
ScopedScoped1Inner ssro1i;
Outer10IdAlloc & val = outermost_allocator<ScopedScoped1Inner>::get(ssro1i);
(void)val;
//Check construction with 0 user arguments
{
typedef ::allocator_argument_tester<NotUsesAllocator, 10> 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<ConstructibleSuffix, 10> 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<ConstructiblePrefix, 10> 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<NotUsesAllocator, 10> 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<ConstructibleSuffix, 10> 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<ConstructiblePrefix, 10> 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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, boost::tuple<int>(1), boost::tuple<int>(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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, boost::tuple<int>(1), boost::tuple<int>(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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, boost::tuple<int>(2), boost::tuple<int>(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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, std::tuple<int>(1), std::tuple<int>(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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, std::tuple<int>(1), std::tuple<int>(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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, std::tuple<int>(2), std::tuple<int>(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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> 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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
pair<int, int> 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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
pair<int, int> 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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
pair<int, int> 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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
pair<int, int> 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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
pair<int, int> 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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
pair<int, int> 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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, boost::tuple<>(), boost::tuple<int>(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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, boost::tuple<int>(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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, boost::tuple<>(), boost::tuple<int>(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<NotUsesAllocator, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, std::tuple<>(), std::tuple<int>(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<ConstructibleSuffix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, std::tuple<int>(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<ConstructiblePrefix, 0> MarkType;
typedef pair<MarkType, MarkType> MarkTypePair;
MarkTypePair dummy;
dummy.~MarkTypePair();
s0i.construct(&dummy, piecewise_construct, std::tuple<>(), std::tuple<int>(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<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();
}
}
}
return ::boost::report_errors();
}