205 lines
4.3 KiB
C++
205 lines
4.3 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// (C) Copyright Howard Hinnant 2009
|
|
// (C) Copyright Ion Gaztanaga 2014-2014.
|
|
//
|
|
// 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/move for documentation.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
#include <boost/move/default_delete.hpp>
|
|
#include <boost/core/lightweight_test.hpp>
|
|
|
|
//////////////////////////////////////////////
|
|
//
|
|
// The initial implementation of these tests
|
|
// was written by Howard Hinnant.
|
|
//
|
|
// These test were later refactored grouping
|
|
// and porting them to Boost.Move.
|
|
//
|
|
// Many thanks to Howard for releasing his C++03
|
|
// unique_ptr implementation with such detailed
|
|
// test cases.
|
|
//
|
|
//////////////////////////////////////////////
|
|
|
|
////////////////////////////////
|
|
// unique_ptr_dltr_dflt_convert_ctor
|
|
////////////////////////////////
|
|
|
|
namespace bml = ::boost::movelib;
|
|
|
|
struct A
|
|
{
|
|
static int count;
|
|
A() {++count;}
|
|
A(const A&) {++count;}
|
|
virtual ~A() {--count;}
|
|
};
|
|
|
|
int A::count = 0;
|
|
|
|
struct B
|
|
: public A
|
|
{
|
|
static int count;
|
|
B() : A() {++count;}
|
|
B(const B&) : A() {++count;}
|
|
virtual ~B() {--count;}
|
|
};
|
|
|
|
int B::count = 0;
|
|
|
|
void reset_counters()
|
|
{ A::count = B::count = 0; }
|
|
|
|
namespace unique_ptr_dltr_dflt_convert_ctor{
|
|
|
|
void test()
|
|
{
|
|
//Single element deleter
|
|
{
|
|
reset_counters();
|
|
bml::default_delete<B> d2;
|
|
bml::default_delete<A> d1 = d2;
|
|
A* p = new B;
|
|
BOOST_TEST(A::count == 1);
|
|
BOOST_TEST(B::count == 1);
|
|
d1(p);
|
|
BOOST_TEST(A::count == 0);
|
|
BOOST_TEST(B::count == 0);
|
|
}
|
|
//Array element deleter
|
|
{
|
|
reset_counters();
|
|
bml::default_delete<A[]> d2;
|
|
bml::default_delete<const A[]> d1 = d2;
|
|
const A* p = new const A[2];
|
|
BOOST_TEST(A::count == 2);
|
|
d1(p);
|
|
BOOST_TEST(A::count == 0);
|
|
}
|
|
//Bounded array element deleter
|
|
{
|
|
reset_counters();
|
|
bml::default_delete<A[2]> d2;
|
|
bml::default_delete<const A[2]> d1 = d2;
|
|
const A* p = new const A[2];
|
|
BOOST_TEST(A::count == 2);
|
|
d1(p);
|
|
bml::default_delete<const A[]> d0 = d1;
|
|
d0(0);
|
|
BOOST_TEST(A::count == 0);
|
|
}
|
|
}
|
|
|
|
} //namespace unique_ptr_dltr_dflt_convert_ctor{
|
|
|
|
////////////////////////////////
|
|
// unique_ptr_dltr_dflt_convert_assign
|
|
////////////////////////////////
|
|
|
|
namespace unique_ptr_dltr_dflt_convert_assign{
|
|
|
|
void test()
|
|
{
|
|
//Single element deleter
|
|
{
|
|
reset_counters();
|
|
bml::default_delete<B> d2;
|
|
bml::default_delete<A> d1;
|
|
d1 = d2;
|
|
A* p = new B;
|
|
BOOST_TEST(A::count == 1);
|
|
BOOST_TEST(B::count == 1);
|
|
d1(p);
|
|
BOOST_TEST(A::count == 0);
|
|
BOOST_TEST(B::count == 0);
|
|
}
|
|
//Array element deleter
|
|
{
|
|
reset_counters();
|
|
bml::default_delete<A[]> d2;
|
|
bml::default_delete<const A[]> d1;
|
|
d1 = d2;
|
|
const A* p = new const A[2];
|
|
BOOST_TEST(A::count == 2);
|
|
d1(p);
|
|
BOOST_TEST(A::count == 0);
|
|
}
|
|
//Bounded array element deleter
|
|
{
|
|
reset_counters();
|
|
bml::default_delete<A[2]> d2;
|
|
bml::default_delete<const A[2]> d1;
|
|
d1 = d2;
|
|
const A* p = new const A[2];
|
|
BOOST_TEST(A::count == 2);
|
|
d1(p);
|
|
bml::default_delete<const A[]> d0;
|
|
d0 = d1;
|
|
d0(0);
|
|
BOOST_TEST(A::count == 0);
|
|
}
|
|
}
|
|
|
|
} //namespace unique_ptr_dltr_dflt_convert_assign{
|
|
|
|
|
|
////////////////////////////////
|
|
// unique_ptr_dltr_dflt_default
|
|
////////////////////////////////
|
|
|
|
namespace unique_ptr_dltr_dflt_default{
|
|
|
|
void test()
|
|
{
|
|
{
|
|
//Single element deleter
|
|
reset_counters();
|
|
bml::default_delete<A> d;
|
|
A* p = new A;
|
|
BOOST_TEST(A::count == 1);
|
|
d(p);
|
|
BOOST_TEST(A::count == 0);
|
|
}
|
|
{
|
|
//Array element deleter
|
|
reset_counters();
|
|
bml::default_delete<A[]> d;
|
|
A* p = new A[2];
|
|
BOOST_TEST(A::count == 2);
|
|
d(p);
|
|
BOOST_TEST(A::count == 0);
|
|
}
|
|
|
|
{
|
|
//Bounded Array element deleter
|
|
reset_counters();
|
|
bml::default_delete<A[10]> d;
|
|
A* p = new A[10];
|
|
BOOST_TEST(A::count == 10);
|
|
d(p);
|
|
BOOST_TEST(A::count == 0);
|
|
}
|
|
}
|
|
|
|
} //namespace unique_ptr_dltr_dflt_default{
|
|
|
|
////////////////////////////////
|
|
// main
|
|
////////////////////////////////
|
|
int main()
|
|
{
|
|
unique_ptr_dltr_dflt_convert_ctor::test();
|
|
unique_ptr_dltr_dflt_convert_assign::test();
|
|
unique_ptr_dltr_dflt_default::test();
|
|
|
|
//Test results
|
|
return boost::report_errors();
|
|
}
|