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/utility_core.hpp>
14 #include <boost/move/unique_ptr.hpp>
15 #include <boost/static_assert.hpp>
16 #include <boost/core/lightweight_test.hpp>
18 //////////////////////////////////////////////
20 // The initial implementation of these tests
21 // was written by Howard Hinnant.
23 // These test were later refactored grouping
24 // and porting them to Boost.Move.
26 // Many thanks to Howard for releasing his C++03
27 // unique_ptr implementation with such detailed
30 //////////////////////////////////////////////
32 #include "unique_ptr_test_utils_beg.hpp"
34 namespace bml
= ::boost::movelib
;
36 ////////////////////////////////
37 // unique_ptr_observers_dereference
38 ////////////////////////////////
40 namespace unique_ptr_observers_dereference
{
46 bml::unique_ptr
<int> p(new int(3));
49 //Unbounded array unique_ptr
54 bml::unique_ptr
<int[]> p(pi
);
55 BOOST_TEST(p
[0] == 3);
56 BOOST_TEST(p
[1] == 4);
58 //Bounded array unique_ptr
63 bml::unique_ptr
<int[2]> p(pi
);
64 BOOST_TEST(p
[0] == 3);
65 BOOST_TEST(p
[1] == 4);
69 } //namespace unique_ptr_observers_dereference{
71 ////////////////////////////////
72 // unique_ptr_observers_dereference
73 ////////////////////////////////
75 namespace unique_ptr_observers_explicit_bool
{
81 bml::unique_ptr
<int> p(new int(3));
90 bml::unique_ptr
<int> p
;
98 //Unbounded array unique_ptr
100 bml::unique_ptr
<int[]> p(new int[2]);
109 bml::unique_ptr
<int[]> p
;
117 //Bounded array unique_ptr
119 bml::unique_ptr
<int[2]> p(new int[2]);
128 bml::unique_ptr
<int[2]> p
;
138 } //namespace unique_ptr_observers_explicit_bool{
140 ////////////////////////////////
141 // unique_ptr_observers_get
142 ////////////////////////////////
144 namespace unique_ptr_observers_get
{
151 bml::unique_ptr
<int> s(p
);
152 BOOST_TEST(s
.get() == p
);
154 //Unbounded array unique_ptr
157 bml::unique_ptr
<int[]> s(p
);
158 BOOST_TEST(s
.get() == p
);
162 bml::unique_ptr
<int[2]> s(p
);
163 BOOST_TEST(s
.get() == p
);
165 //Bounded array unique_ptr
167 int *pi
= new int[2];
170 bml::unique_ptr
<int[2]> p(pi
);
171 BOOST_TEST(p
[0] == 3);
172 BOOST_TEST(p
[1] == 4);
176 } //namespace unique_ptr_observers_get{
178 ////////////////////////////////
179 // unique_ptr_observers_get_deleter
180 ////////////////////////////////
182 namespace unique_ptr_observers_get_deleter
{
186 void operator()(void*) {}
188 int test() {return 5;}
189 int test() const {return 6;}
196 bml::unique_ptr
<int, Deleter
> p
;
197 BOOST_TEST(p
.get_deleter().test() == 5);
200 const bml::unique_ptr
<int, Deleter
> p
;
201 BOOST_TEST(p
.get_deleter().test() == 6);
203 //Unbounded array unique_ptr
205 bml::unique_ptr
<int[], Deleter
> p
;
206 BOOST_TEST(p
.get_deleter().test() == 5);
209 const bml::unique_ptr
<int[], Deleter
> p
;
210 BOOST_TEST(p
.get_deleter().test() == 6);
212 //Bounded array unique_ptr
214 bml::unique_ptr
<int[2], Deleter
> p
;
215 BOOST_TEST(p
.get_deleter().test() == 5);
218 const bml::unique_ptr
<int[2], Deleter
> p
;
219 BOOST_TEST(p
.get_deleter().test() == 6);
223 } //namespace unique_ptr_observers_get_deleter{
225 ////////////////////////////////
226 // unique_ptr_observers_op_arrow
227 ////////////////////////////////
229 namespace unique_ptr_observers_op_arrow
{
235 bml::unique_ptr
<A
> p(new A
);
236 BOOST_TEST(p
->state_
== 999);
240 } //namespace unique_ptr_observers_op_arrow{
243 namespace unique_ptr_observers_op_index
{
247 //Unbounded array unique_ptr
250 //pa[0] is left default constructed
252 bml::unique_ptr
<A
[]> p(pa
);
253 BOOST_TEST(p
[0].state_
== 999);
254 BOOST_TEST(p
[1].state_
== 888);
256 //Bounded array unique_ptr
259 //pa[0] is left default constructed
261 bml::unique_ptr
<A
[2]> p(pa
);
262 BOOST_TEST(p
[0].state_
== 999);
263 BOOST_TEST(p
[1].state_
== 888);
267 } //namespace unique_ptr_observers_op_index{
269 ////////////////////////////////
271 ////////////////////////////////
275 unique_ptr_observers_dereference::test();
276 unique_ptr_observers_explicit_bool::test();
277 unique_ptr_observers_get::test();
278 unique_ptr_observers_get_deleter::test();
279 unique_ptr_observers_op_arrow::test();
280 unique_ptr_observers_op_index::test();
283 return boost::report_errors();
287 #include "unique_ptr_test_utils_end.hpp"