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 ////////////////////////////////
38 ////////////////////////////////
39 namespace unique_ptr_zero {
41 // test initialization/assignment from zero
48 bml::unique_ptr<A> s2(0);
49 BOOST_TEST(A::count == 0);
51 BOOST_TEST(A::count == 0);
53 bml::unique_ptr<A> s2(new A);
54 BOOST_TEST(A::count == 1);
56 BOOST_TEST(A::count == 0);
57 BOOST_TEST(s2.get() == 0);
59 BOOST_TEST(A::count == 0);
61 //Unbounded array unique_ptr
63 bml::unique_ptr<A[]> s2(0);
64 BOOST_TEST(A::count == 0);
66 BOOST_TEST(A::count == 0);
68 bml::unique_ptr<A[]> s2(new A[2]);
69 BOOST_TEST(A::count == 2);
71 BOOST_TEST(A::count == 0);
72 BOOST_TEST(s2.get() == 0);
74 BOOST_TEST(A::count == 0);
76 //Bounded array unique_ptr
78 bml::unique_ptr<A[2]> s2(0);
79 BOOST_TEST(A::count == 0);
81 BOOST_TEST(A::count == 0);
83 bml::unique_ptr<A[2]> s2(new A[2]);
84 BOOST_TEST(A::count == 2);
86 BOOST_TEST(A::count == 0);
87 BOOST_TEST(s2.get() == 0);
89 BOOST_TEST(A::count == 0);
92 } //namespace unique_ptr_zero {
95 ////////////////////////////////
97 ////////////////////////////////
99 namespace unique_ptr_nullptr{
103 #if !defined(BOOST_NO_CXX11_NULLPTR)
107 bml::unique_ptr<A> p(new A);
108 BOOST_TEST(A::count == 1);
112 BOOST_TEST(A::count == 0);
113 BOOST_TEST(p.get() == 0);
115 BOOST_TEST(A::count == 0);
117 bml::unique_ptr<A> p(new A);
118 BOOST_TEST(A::count == 1);
122 BOOST_TEST(A::count == 0);
123 BOOST_TEST(p.get() == 0);
125 BOOST_TEST(A::count == 0);
128 bml::unique_ptr<A> pi(nullptr);
129 BOOST_TEST(pi.get() == nullptr);
130 BOOST_TEST(pi.get() == 0);
132 BOOST_TEST(A::count == 0);
134 bml::unique_ptr<A> pi(nullptr, bml::unique_ptr<A>::deleter_type());
135 BOOST_TEST(pi.get() == nullptr);
136 BOOST_TEST(pi.get() == 0);
138 BOOST_TEST(A::count == 0);
140 //Unbounded array unique_ptr
143 bml::unique_ptr<A[]> p(new A[2]);
144 BOOST_TEST(A::count == 2);
148 BOOST_TEST(A::count == 0);
149 BOOST_TEST(p.get() == 0);
151 BOOST_TEST(A::count == 0);
153 bml::unique_ptr<A[]> p(new A[2]);
154 BOOST_TEST(A::count == 2);
158 BOOST_TEST(A::count == 0);
159 BOOST_TEST(p.get() == 0);
161 BOOST_TEST(A::count == 0);
163 bml::unique_ptr<A[]> pi(nullptr);
164 BOOST_TEST(pi.get() == nullptr);
165 BOOST_TEST(pi.get() == 0);
167 BOOST_TEST(A::count == 0);
169 bml::unique_ptr<A[]> pi(nullptr, bml::unique_ptr<A[]>::deleter_type());
170 BOOST_TEST(pi.get() == nullptr);
171 BOOST_TEST(pi.get() == 0);
173 BOOST_TEST(A::count == 0);
175 //Bounded array unique_ptr
178 bml::unique_ptr<A[2]> p(new A[2]);
179 BOOST_TEST(A::count == 2);
183 BOOST_TEST(A::count == 0);
184 BOOST_TEST(p.get() == 0);
186 BOOST_TEST(A::count == 0);
188 bml::unique_ptr<A[2]> p(new A[2]);
189 BOOST_TEST(A::count == 2);
193 BOOST_TEST(A::count == 0);
194 BOOST_TEST(p.get() == 0);
196 BOOST_TEST(A::count == 0);
198 bml::unique_ptr<A[2]> pi(nullptr);
199 BOOST_TEST(pi.get() == nullptr);
200 BOOST_TEST(pi.get() == 0);
202 BOOST_TEST(A::count == 0);
204 bml::unique_ptr<A[2]> pi(nullptr, bml::unique_ptr<A[2]>::deleter_type());
205 BOOST_TEST(pi.get() == nullptr);
206 BOOST_TEST(pi.get() == 0);
208 BOOST_TEST(A::count == 0);
212 } //namespace unique_ptr_nullptr{
214 ////////////////////////////////
216 ////////////////////////////////
220 unique_ptr_zero::test();
221 unique_ptr_nullptr::test();
224 return boost::report_errors();
228 #include "unique_ptr_test_utils_end.hpp"