1 //////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Howard Hinnant 2009
4 // (C) Copyright Ion Gaztanaga 2014-2014.
6 // Distributed under the Boost Software License, Version 1.0.
7 // (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
10 // See http://www.boost.org/libs/move for documentation.
12 //////////////////////////////////////////////////////////////////////////////
13 #include <boost/move/default_delete.hpp>
14 #include <boost/core/lightweight_test.hpp>
16 //////////////////////////////////////////////
18 // The initial implementation of these tests
19 // was written by Howard Hinnant.
21 // These test were later refactored grouping
22 // and porting them to Boost.Move.
24 // Many thanks to Howard for releasing his C++03
25 // unique_ptr implementation with such detailed
28 //////////////////////////////////////////////
30 ////////////////////////////////
31 // unique_ptr_dltr_dflt_convert_ctor
32 ////////////////////////////////
34 namespace bml
= ::boost::movelib
;
40 A(const A
&) {++count
;}
41 virtual ~A() {--count
;}
51 B(const B
&) : A() {++count
;}
52 virtual ~B() {--count
;}
58 { A::count
= B::count
= 0; }
60 namespace unique_ptr_dltr_dflt_convert_ctor
{
64 //Single element deleter
67 bml::default_delete
<B
> d2
;
68 bml::default_delete
<A
> d1
= d2
;
70 BOOST_TEST(A::count
== 1);
71 BOOST_TEST(B::count
== 1);
73 BOOST_TEST(A::count
== 0);
74 BOOST_TEST(B::count
== 0);
76 //Array element deleter
79 bml::default_delete
<A
[]> d2
;
80 bml::default_delete
<const A
[]> d1
= d2
;
81 const A
* p
= new const A
[2];
82 BOOST_TEST(A::count
== 2);
84 BOOST_TEST(A::count
== 0);
86 //Bounded array element deleter
89 bml::default_delete
<A
[2]> d2
;
90 bml::default_delete
<const A
[2]> d1
= d2
;
91 const A
* p
= new const A
[2];
92 BOOST_TEST(A::count
== 2);
94 bml::default_delete
<const A
[]> d0
= d1
;
96 BOOST_TEST(A::count
== 0);
100 } //namespace unique_ptr_dltr_dflt_convert_ctor{
102 ////////////////////////////////
103 // unique_ptr_dltr_dflt_convert_assign
104 ////////////////////////////////
106 namespace unique_ptr_dltr_dflt_convert_assign
{
110 //Single element deleter
113 bml::default_delete
<B
> d2
;
114 bml::default_delete
<A
> d1
;
117 BOOST_TEST(A::count
== 1);
118 BOOST_TEST(B::count
== 1);
120 BOOST_TEST(A::count
== 0);
121 BOOST_TEST(B::count
== 0);
123 //Array element deleter
126 bml::default_delete
<A
[]> d2
;
127 bml::default_delete
<const A
[]> d1
;
129 const A
* p
= new const A
[2];
130 BOOST_TEST(A::count
== 2);
132 BOOST_TEST(A::count
== 0);
134 //Bounded array element deleter
137 bml::default_delete
<A
[2]> d2
;
138 bml::default_delete
<const A
[2]> d1
;
140 const A
* p
= new const A
[2];
141 BOOST_TEST(A::count
== 2);
143 bml::default_delete
<const A
[]> d0
;
146 BOOST_TEST(A::count
== 0);
150 } //namespace unique_ptr_dltr_dflt_convert_assign{
153 ////////////////////////////////
154 // unique_ptr_dltr_dflt_default
155 ////////////////////////////////
157 namespace unique_ptr_dltr_dflt_default
{
162 //Single element deleter
164 bml::default_delete
<A
> d
;
166 BOOST_TEST(A::count
== 1);
168 BOOST_TEST(A::count
== 0);
171 //Array element deleter
173 bml::default_delete
<A
[]> d
;
175 BOOST_TEST(A::count
== 2);
177 BOOST_TEST(A::count
== 0);
181 //Bounded Array element deleter
183 bml::default_delete
<A
[10]> d
;
185 BOOST_TEST(A::count
== 10);
187 BOOST_TEST(A::count
== 0);
191 } //namespace unique_ptr_dltr_dflt_default{
193 ////////////////////////////////
195 ////////////////////////////////
198 unique_ptr_dltr_dflt_convert_ctor::test();
199 unique_ptr_dltr_dflt_convert_assign::test();
200 unique_ptr_dltr_dflt_default::test();
203 return boost::report_errors();