#include <boost/move/utility_core.hpp>
#include <boost/move/unique_ptr.hpp>
#include <boost/core/lightweight_test.hpp>
#include "unique_ptr_test_utils_beg.hpp"
namespace bml = ::boost::movelib;
namespace unique_ptr_dtor_null{
void test()
{
{
def_constr_deleter<int> d;
BOOST_TEST(d.state() == 5);
{
bml::unique_ptr<int, def_constr_deleter<int>&> p(0, d);
BOOST_TEST(p.get() == 0);
BOOST_TEST(&p.get_deleter() == &d);
}
BOOST_TEST(d.state() == 5);
}
{
def_constr_deleter<int[]> d;
BOOST_TEST(d.state() == 5);
{
bml::unique_ptr<int[], def_constr_deleter<int[]>&> p(0, d);
BOOST_TEST(p.get() == 0);
BOOST_TEST(&p.get_deleter() == &d);
}
BOOST_TEST(d.state() == 5);
}
{
def_constr_deleter<int[2]> d;
BOOST_TEST(d.state() == 5);
{
bml::unique_ptr<int[2], def_constr_deleter<int[2]>&> p(0, d);
BOOST_TEST(p.get() == 0);
BOOST_TEST(&p.get_deleter() == &d);
}
BOOST_TEST(d.state() == 5);
}
}
}
namespace unique_ptr_ctor_default_delreq{
void test()
{
{
bml::unique_ptr<int> p;
BOOST_TEST(p.get() == 0);
}
{
bml::unique_ptr<int, def_constr_deleter<int> > p;
BOOST_TEST(p.get() == 0);
BOOST_TEST(p.get_deleter().state() == 5);
}
{
bml::unique_ptr<int[]> p;
BOOST_TEST(p.get() == 0);
}
{
bml::unique_ptr<int[], def_constr_deleter<int[]> > p;
BOOST_TEST(p.get() == 0);
BOOST_TEST(p.get_deleter().state() == 5);
}
{
bml::unique_ptr<int[]> p;
BOOST_TEST(p.get() == 0);
}
{
bml::unique_ptr<int[], def_constr_deleter<int[]> > p;
BOOST_TEST(p.get() == 0);
BOOST_TEST(p.get_deleter().state() == 5);
}
{
bml::unique_ptr<int[2]> p;
BOOST_TEST(p.get() == 0);
}
{
bml::unique_ptr<int[2], def_constr_deleter<int[2]> > p;
BOOST_TEST(p.get() == 0);
BOOST_TEST(p.get_deleter().state() == 5);
}
}
}
namespace unique_ptr_ctor_default_nocomplete{
void test()
{
reset_counters();
{
J<I> s;
BOOST_TEST(s.get() == 0);
}
check(0);
{
J<I, def_constr_deleter<I> > s;
BOOST_TEST(s.get() == 0);
BOOST_TEST(s.get_deleter().state() == 5);
}
check(0);
reset_counters();
{
J<I[]> s;
BOOST_TEST(s.get() == 0);
}
check(0);
{
J<I[], def_constr_deleter<I[]> > s;
BOOST_TEST(s.get() == 0);
BOOST_TEST(s.get_deleter().state() == 5);
}
check(0);
reset_counters();
{
J<I[2]> s;
BOOST_TEST(s.get() == 0);
}
check(0);
{
J<I[2], def_constr_deleter<I[2]> > s;
BOOST_TEST(s.get() == 0);
BOOST_TEST(s.get_deleter().state() == 5);
}
check(0);
}
}
namespace unique_ptr_ctor_pointer_delreq{
void test()
{
reset_counters();
{
A* p = new A;
BOOST_TEST(A::count == 1);
bml::unique_ptr<A> s(p);
BOOST_TEST(s.get() == p);
}
BOOST_TEST(A::count == 0);
{
A* p = new A;
BOOST_TEST(A::count == 1);
bml::unique_ptr<A, def_constr_deleter<A> > s(p);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
bml::unique_ptr<A[]> s(p);
BOOST_TEST(s.get() == p);
}
BOOST_TEST(A::count == 0);
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
bml::unique_ptr<A[], def_constr_deleter<A[]> > s(p);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
bml::unique_ptr<A[2]> s(p);
BOOST_TEST(s.get() == p);
}
BOOST_TEST(A::count == 0);
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
bml::unique_ptr<A[2], def_constr_deleter<A[2]> > s(p);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
}
}
namespace unique_ptr_ctor_pointer_nocomplete{
void test()
{
reset_counters();
{
I* p = get();
check(1);
J<I> s(p);
BOOST_TEST(s.get() == p);
}
check(0);
{
I* p = get();
check(1);
J<I, def_constr_deleter<I> > s(p);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
check(0);
reset_counters();
{
I* p = get_array(2);
check(2);
J<I[]> s(p);
BOOST_TEST(s.get() == p);
}
check(0);
{
I* p = get_array(2);
check(2);
J<I[], def_constr_deleter<I[]> > s(p);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
check(0);
reset_counters();
{
I* p = get_array(2);
check(2);
J<I[]> s(p);
BOOST_TEST(s.get() == p);
}
check(0);
{
I* p = get_array(2);
check(2);
J<I[2], def_constr_deleter<I[2]> > s(p);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
check(0);
}
}
namespace unique_ptr_ctor_pointer_convert{
void test()
{
reset_counters();
{
B* p = new B;
BOOST_TEST(A::count == 1);
BOOST_TEST(B::count == 1);
bml::unique_ptr<A> s(p);
BOOST_TEST(s.get() == p);
}
BOOST_TEST(A::count == 0);
BOOST_TEST(B::count == 0);
{
B* p = new B;
BOOST_TEST(A::count == 1);
BOOST_TEST(B::count == 1);
bml::unique_ptr<A, def_constr_deleter<A> > s(p);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
BOOST_TEST(B::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
bml::unique_ptr<const A[]> s(p);
BOOST_TEST(s.get() == p);
}
BOOST_TEST(A::count == 0);
{
const A* p = new const A[2];
BOOST_TEST(A::count == 2);
bml::unique_ptr<const volatile A[], def_constr_deleter<const volatile A[]> > s(p);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
bml::unique_ptr<const A[2]> s(p);
BOOST_TEST(s.get() == p);
}
BOOST_TEST(A::count == 0);
{
const A* p = new const A[2];
BOOST_TEST(A::count == 2);
bml::unique_ptr<const volatile A[2], def_constr_deleter<const volatile A[2]> > s(p);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
}
}
namespace unique_ptr_ctor_pointer_deleter_movedel{
void test()
{
reset_counters();
{
A* p = new A;
BOOST_TEST(A::count == 1);
move_constr_deleter<A> d;
bml::unique_ptr<A, move_constr_deleter<A> > s(p, ::boost::move(d));
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
bml::unique_ptr<A, move_constr_deleter<A> > s2(s.release(), move_constr_deleter<A>(6));
BOOST_TEST(s2.get() == p);
BOOST_TEST(s2.get_deleter().state() == 6);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
move_constr_deleter<A[]> d;
bml::unique_ptr<A[], move_constr_deleter<A[]> > s(p, ::boost::move(d));
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
bml::unique_ptr<A[], move_constr_deleter<A[]> > s2(s.release(), move_constr_deleter<A[]>(6));
BOOST_TEST(s2.get() == p);
BOOST_TEST(s2.get_deleter().state() == 6);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
move_constr_deleter<A[2]> d;
bml::unique_ptr<A[2], move_constr_deleter<A[2]> > s(p, ::boost::move(d));
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
bml::unique_ptr<A[2], move_constr_deleter<A[2]> > s2(s.release(), move_constr_deleter<A[2]>(6));
BOOST_TEST(s2.get() == p);
BOOST_TEST(s2.get_deleter().state() == 6);
}
BOOST_TEST(A::count == 0);
}
}
namespace unique_ptr_ctor_pointer_deleter_copydel{
void test()
{
reset_counters();
{
A* p = new A;
BOOST_TEST(A::count == 1);
copy_constr_deleter<A> d;
bml::unique_ptr<A, copy_constr_deleter<A> > s(p, d);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
d.set_state(6);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
copy_constr_deleter<A[]> d;
bml::unique_ptr<A[], copy_constr_deleter<A[]> > s(p, d);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
d.set_state(6);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
copy_constr_deleter<A[2]> d;
bml::unique_ptr<A[2], copy_constr_deleter<A[2]> > s(p, d);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
d.set_state(6);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
}
}
namespace unique_ptr_ctor_pointer_deleter_dfctrdelref{
void test()
{
reset_counters();
{
A* p = new A;
BOOST_TEST(A::count == 1);
def_constr_deleter<A> d;
bml::unique_ptr<A, def_constr_deleter<A>&> s(p, d);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
d.set_state(6);
BOOST_TEST(s.get_deleter().state() == 6);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
def_constr_deleter<A[]> d;
bml::unique_ptr<A[], def_constr_deleter<A[]>&> s(p, d);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
d.set_state(6);
BOOST_TEST(s.get_deleter().state() == 6);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
def_constr_deleter<A[2]> d;
bml::unique_ptr<A[2], def_constr_deleter<A[2]>&> s(p, d);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
d.set_state(6);
BOOST_TEST(s.get_deleter().state() == 6);
}
BOOST_TEST(A::count == 0);
}
}
namespace unique_ptr_ctor_pointer_deleter_dfctrdelconstref{
void test()
{
reset_counters();
{
A* p = new A;
BOOST_TEST(A::count == 1);
def_constr_deleter<A> d;
bml::unique_ptr<A, const def_constr_deleter<A>&> s(p, d);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
def_constr_deleter<A[]> d;
bml::unique_ptr<A[], const def_constr_deleter<A[]>&> s(p, d);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
def_constr_deleter<A[2]> d;
bml::unique_ptr<A[2], const def_constr_deleter<A[2]>&> s(p, d);
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
}
}
namespace unique_ptr_ctor_pointer_deleter_convert{
void test()
{
reset_counters();
{
B* p = new B;
BOOST_TEST(A::count == 1);
BOOST_TEST(B::count == 1);
bml::unique_ptr<A, copy_constr_deleter<A> > s(p, copy_constr_deleter<A>());
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
BOOST_TEST(B::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
bml::unique_ptr<const A[], copy_constr_deleter<const A[]> > s(p, copy_constr_deleter<const A[]>());
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
BOOST_TEST(B::count == 0);
reset_counters();
{
A* p = new A[2];
BOOST_TEST(A::count == 2);
bml::unique_ptr<const A[2], copy_constr_deleter<const A[2]> > s(p, copy_constr_deleter<const A[2]>());
BOOST_TEST(s.get() == p);
BOOST_TEST(s.get_deleter().state() == 5);
}
BOOST_TEST(A::count == 0);
BOOST_TEST(B::count == 0);
}
}
namespace unique_ptr_ctor_pointer_deleter_void{
bool my_free_called = false;
void my_free(void*)
{
my_free_called = true;
}
void test()
{
{
int i = 0;
bml::unique_ptr<void, void (*)(void*)> s(&i, my_free);
BOOST_TEST(s.get() == &i);
BOOST_TEST(s.get_deleter() == my_free);
BOOST_TEST(!my_free_called);
}
BOOST_TEST(my_free_called);
}
}
namespace return_unique_single_conversion{
template<class T>
bml::unique_ptr<T> make_unique_ptr_of_t()
{
return bml::unique_ptr<T>(new T);
}
template<class T>
bml::unique_ptr<T const> return_const_unique_of_t()
{
return bml::unique_ptr<T const> (make_unique_ptr_of_t<T>());
}
void test()
{
reset_counters();
BOOST_TEST(A::count == 0);
{
bml::unique_ptr<const A> p(return_const_unique_of_t<A>());
BOOST_TEST(A::count == 1);
BOOST_TEST(B::count == 0);
}
BOOST_TEST(A::count == 0);
{
bml::unique_ptr<const A> p(return_const_unique_of_t<B>());
BOOST_TEST(A::count == 1);
BOOST_TEST(B::count == 1);
}
BOOST_TEST(A::count == 0);
}
}
namespace return_unique_array_conversion{
template<class T>
bml::unique_ptr<T[]> return_unique_array_of_t(std::size_t n)
{
return bml::unique_ptr<T[]>(new T[n]);
}
template<class T>
bml::unique_ptr<const T[]> return_const_array_of_t(std::size_t n)
{
return bml::unique_ptr<const T[]>(return_unique_array_of_t<T>(n));
}
template<class T>
bml::unique_ptr<T[2]> return_unique_array_of_t_2()
{
return bml::unique_ptr<T[2]>(new T[2]);
}
template<class T>
bml::unique_ptr<const T[2]> return_const_array_of_t_2()
{
return bml::unique_ptr<const T[2]>(return_unique_array_of_t_2<T>());
}
void test()
{
reset_counters();
BOOST_TEST(A::count == 0);
{
bml::unique_ptr<const A[]> p(return_unique_array_of_t<A>(2));
BOOST_TEST(A::count == 2);
BOOST_TEST(B::count == 0);
}
BOOST_TEST(A::count == 0);
{
bml::unique_ptr<const volatile A[]> p(return_unique_array_of_t<volatile A>(2));
BOOST_TEST(A::count == 2);
BOOST_TEST(B::count == 0);
}
BOOST_TEST(A::count == 0);
{
bml::unique_ptr<const volatile A[2]> p(return_const_array_of_t_2<A>());
BOOST_TEST(A::count == 2);
BOOST_TEST(B::count == 0);
}
BOOST_TEST(A::count == 0);
{
bml::unique_ptr<const volatile A[]> p(return_const_array_of_t_2<A>());
BOOST_TEST(A::count == 2);
BOOST_TEST(B::count == 0);
}
BOOST_TEST(A::count == 0);
}
}
int main()
{
unique_ptr_dtor_null::test();
unique_ptr_ctor_default_delreq::test();
unique_ptr_ctor_default_nocomplete::test();
unique_ptr_ctor_pointer_delreq::test();
unique_ptr_ctor_pointer_nocomplete::test();
unique_ptr_ctor_pointer_convert::test();
unique_ptr_ctor_pointer_deleter_movedel::test();
unique_ptr_ctor_pointer_deleter_copydel::test();
unique_ptr_ctor_pointer_deleter_dfctrdelref::test();
unique_ptr_ctor_pointer_deleter_dfctrdelconstref::test();
unique_ptr_ctor_pointer_deleter_convert::test();
unique_ptr_ctor_pointer_deleter_void::test();
return_unique_single_conversion::test();
return_unique_array_conversion::test();
return boost::report_errors();
}
#include "unique_ptr_test_utils_end.hpp"