#include <boost/move/default_delete.hpp>
#include <boost/core/lightweight_test.hpp>
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()
{
{
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);
}
{
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);
}
{
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_assign{
void test()
{
{
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);
}
{
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);
}
{
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_default{
void test()
{
{
reset_counters();
bml::default_delete<A> d;
A* p = new A;
BOOST_TEST(A::count == 1);
d(p);
BOOST_TEST(A::count == 0);
}
{
reset_counters();
bml::default_delete<A[]> d;
A* p = new A[2];
BOOST_TEST(A::count == 2);
d(p);
BOOST_TEST(A::count == 0);
}
{
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);
}
}
}
int main()
{
unique_ptr_dltr_dflt_convert_ctor::test();
unique_ptr_dltr_dflt_convert_assign::test();
unique_ptr_dltr_dflt_default::test();
return boost::report_errors();
}