1 ////////////////////////////////////////////////////////////////////////////// 2 // 3 // (C) Copyright Howard Hinnant 2009 4 // (C) Copyright Ion Gaztanaga 2014-2014. 5 // 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) 9 // 10 // See http://www.boost.org/libs/move for documentation. 11 // 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> 17 18 ////////////////////////////////////////////// 19 // 20 // The initial implementation of these tests 21 // was written by Howard Hinnant. 22 // 23 // These test were later refactored grouping 24 // and porting them to Boost.Move. 25 // 26 // Many thanks to Howard for releasing his C++03 27 // unique_ptr implementation with such detailed 28 // test cases. 29 // 30 ////////////////////////////////////////////// 31 32 #include "unique_ptr_test_utils_beg.hpp" 33 34 namespace bml = ::boost::movelib; 35 36 //////////////////////////////// 37 // unique_ptr_zero 38 //////////////////////////////// 39 namespace unique_ptr_zero { 40 41 // test initialization/assignment from zero 42 test()43void test() 44 { 45 //Single unique_ptr 46 reset_counters(); 47 { 48 bml::unique_ptr<A> s2(0); 49 BOOST_TEST(A::count == 0); 50 } 51 BOOST_TEST(A::count == 0); 52 { 53 bml::unique_ptr<A> s2(new A); 54 BOOST_TEST(A::count == 1); 55 s2 = 0; 56 BOOST_TEST(A::count == 0); 57 BOOST_TEST(s2.get() == 0); 58 } 59 BOOST_TEST(A::count == 0); 60 61 //Unbounded array unique_ptr 62 { 63 bml::unique_ptr<A[]> s2(0); 64 BOOST_TEST(A::count == 0); 65 } 66 BOOST_TEST(A::count == 0); 67 { 68 bml::unique_ptr<A[]> s2(new A[2]); 69 BOOST_TEST(A::count == 2); 70 s2 = 0; 71 BOOST_TEST(A::count == 0); 72 BOOST_TEST(s2.get() == 0); 73 } 74 BOOST_TEST(A::count == 0); 75 76 //Bounded array unique_ptr 77 { 78 bml::unique_ptr<A[2]> s2(0); 79 BOOST_TEST(A::count == 0); 80 } 81 BOOST_TEST(A::count == 0); 82 { 83 bml::unique_ptr<A[2]> s2(new A[2]); 84 BOOST_TEST(A::count == 2); 85 s2 = 0; 86 BOOST_TEST(A::count == 0); 87 BOOST_TEST(s2.get() == 0); 88 } 89 BOOST_TEST(A::count == 0); 90 } 91 92 } //namespace unique_ptr_zero { 93 94 95 //////////////////////////////// 96 // unique_ptr_nullptr 97 //////////////////////////////// 98 99 namespace unique_ptr_nullptr{ 100 test()101void test() 102 { 103 #if !defined(BOOST_NO_CXX11_NULLPTR) 104 //Single unique_ptr 105 reset_counters(); 106 { 107 bml::unique_ptr<A> p(new A); 108 BOOST_TEST(A::count == 1); 109 A* i = p.get(); 110 (void)i; 111 p.reset(nullptr); 112 BOOST_TEST(A::count == 0); 113 BOOST_TEST(p.get() == 0); 114 } 115 BOOST_TEST(A::count == 0); 116 { 117 bml::unique_ptr<A> p(new A); 118 BOOST_TEST(A::count == 1); 119 A* i = p.get(); 120 (void)i; 121 p = nullptr; 122 BOOST_TEST(A::count == 0); 123 BOOST_TEST(p.get() == 0); 124 } 125 BOOST_TEST(A::count == 0); 126 127 { 128 bml::unique_ptr<A> pi(nullptr); 129 BOOST_TEST(pi.get() == nullptr); 130 BOOST_TEST(pi.get() == 0); 131 } 132 BOOST_TEST(A::count == 0); 133 { 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); 137 } 138 BOOST_TEST(A::count == 0); 139 140 //Unbounded array unique_ptr 141 reset_counters(); 142 { 143 bml::unique_ptr<A[]> p(new A[2]); 144 BOOST_TEST(A::count == 2); 145 A* i = p.get(); 146 (void)i; 147 p.reset(nullptr); 148 BOOST_TEST(A::count == 0); 149 BOOST_TEST(p.get() == 0); 150 } 151 BOOST_TEST(A::count == 0); 152 { 153 bml::unique_ptr<A[]> p(new A[2]); 154 BOOST_TEST(A::count == 2); 155 A* i = p.get(); 156 (void)i; 157 p = nullptr; 158 BOOST_TEST(A::count == 0); 159 BOOST_TEST(p.get() == 0); 160 } 161 BOOST_TEST(A::count == 0); 162 { 163 bml::unique_ptr<A[]> pi(nullptr); 164 BOOST_TEST(pi.get() == nullptr); 165 BOOST_TEST(pi.get() == 0); 166 } 167 BOOST_TEST(A::count == 0); 168 { 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); 172 } 173 BOOST_TEST(A::count == 0); 174 175 //Bounded array unique_ptr 176 reset_counters(); 177 { 178 bml::unique_ptr<A[2]> p(new A[2]); 179 BOOST_TEST(A::count == 2); 180 A* i = p.get(); 181 (void)i; 182 p.reset(nullptr); 183 BOOST_TEST(A::count == 0); 184 BOOST_TEST(p.get() == 0); 185 } 186 BOOST_TEST(A::count == 0); 187 { 188 bml::unique_ptr<A[2]> p(new A[2]); 189 BOOST_TEST(A::count == 2); 190 A* i = p.get(); 191 (void)i; 192 p = nullptr; 193 BOOST_TEST(A::count == 0); 194 BOOST_TEST(p.get() == 0); 195 } 196 BOOST_TEST(A::count == 0); 197 { 198 bml::unique_ptr<A[2]> pi(nullptr); 199 BOOST_TEST(pi.get() == nullptr); 200 BOOST_TEST(pi.get() == 0); 201 } 202 BOOST_TEST(A::count == 0); 203 { 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); 207 } 208 BOOST_TEST(A::count == 0); 209 #endif 210 } 211 212 } //namespace unique_ptr_nullptr{ 213 214 //////////////////////////////// 215 // main 216 //////////////////////////////// main()217int main() 218 { 219 //nullptr 220 unique_ptr_zero::test(); 221 unique_ptr_nullptr::test(); 222 223 //Test results 224 return boost::report_errors(); 225 226 } 227 228 #include "unique_ptr_test_utils_end.hpp" 229