unique_ptr_nullptr.cpp 5.2 KB

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