unique_ptr_observers.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  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_observers_dereference
  34. ////////////////////////////////
  35. namespace unique_ptr_observers_dereference{
  36. void test()
  37. {
  38. //Single unique_ptr
  39. {
  40. bml::unique_ptr<int> p(new int(3));
  41. BOOST_TEST(*p == 3);
  42. }
  43. //Unbounded array unique_ptr
  44. {
  45. int *pi = new int[2];
  46. pi[0] = 3;
  47. pi[1] = 4;
  48. bml::unique_ptr<int[]> p(pi);
  49. BOOST_TEST(p[0] == 3);
  50. BOOST_TEST(p[1] == 4);
  51. }
  52. //Bounded array unique_ptr
  53. {
  54. int *pi = new int[2];
  55. pi[0] = 3;
  56. pi[1] = 4;
  57. bml::unique_ptr<int[2]> p(pi);
  58. BOOST_TEST(p[0] == 3);
  59. BOOST_TEST(p[1] == 4);
  60. }
  61. }
  62. } //namespace unique_ptr_observers_dereference{
  63. ////////////////////////////////
  64. // unique_ptr_observers_dereference
  65. ////////////////////////////////
  66. namespace unique_ptr_observers_explicit_bool{
  67. void test()
  68. {
  69. //Single unique_ptr
  70. {
  71. bml::unique_ptr<int> p(new int(3));
  72. if (p)
  73. ;
  74. else
  75. BOOST_TEST(false);
  76. if (!p)
  77. BOOST_TEST(false);
  78. }
  79. {
  80. bml::unique_ptr<int> p;
  81. if (!p)
  82. ;
  83. else
  84. BOOST_TEST(false);
  85. if (p)
  86. BOOST_TEST(false);
  87. }
  88. //Unbounded array unique_ptr
  89. {
  90. bml::unique_ptr<int[]> p(new int[2]);
  91. if (p)
  92. ;
  93. else
  94. BOOST_TEST(false);
  95. if (!p)
  96. BOOST_TEST(false);
  97. }
  98. {
  99. bml::unique_ptr<int[]> p;
  100. if (!p)
  101. ;
  102. else
  103. BOOST_TEST(false);
  104. if (p)
  105. BOOST_TEST(false);
  106. }
  107. //Bounded array unique_ptr
  108. {
  109. bml::unique_ptr<int[2]> p(new int[2]);
  110. if (p)
  111. ;
  112. else
  113. BOOST_TEST(false);
  114. if (!p)
  115. BOOST_TEST(false);
  116. }
  117. {
  118. bml::unique_ptr<int[2]> p;
  119. if (!p)
  120. ;
  121. else
  122. BOOST_TEST(false);
  123. if (p)
  124. BOOST_TEST(false);
  125. }
  126. }
  127. } //namespace unique_ptr_observers_explicit_bool{
  128. ////////////////////////////////
  129. // unique_ptr_observers_get
  130. ////////////////////////////////
  131. namespace unique_ptr_observers_get{
  132. void test()
  133. {
  134. //Single unique_ptr
  135. {
  136. int* p = new int;
  137. bml::unique_ptr<int> s(p);
  138. BOOST_TEST(s.get() == p);
  139. }
  140. //Unbounded array unique_ptr
  141. {
  142. int* p = new int[2];
  143. bml::unique_ptr<int[]> s(p);
  144. BOOST_TEST(s.get() == p);
  145. }
  146. {
  147. int* p = new int[2];
  148. bml::unique_ptr<int[2]> s(p);
  149. BOOST_TEST(s.get() == p);
  150. }
  151. //Bounded array unique_ptr
  152. {
  153. int *pi = new int[2];
  154. pi[0] = 3;
  155. pi[1] = 4;
  156. bml::unique_ptr<int[2]> p(pi);
  157. BOOST_TEST(p[0] == 3);
  158. BOOST_TEST(p[1] == 4);
  159. }
  160. }
  161. } //namespace unique_ptr_observers_get{
  162. ////////////////////////////////
  163. // unique_ptr_observers_get_deleter
  164. ////////////////////////////////
  165. namespace unique_ptr_observers_get_deleter{
  166. struct Deleter
  167. {
  168. void operator()(void*) {}
  169. int test() {return 5;}
  170. int test() const {return 6;}
  171. };
  172. void test()
  173. {
  174. //Single unique_ptr
  175. {
  176. bml::unique_ptr<int, Deleter> p;
  177. BOOST_TEST(p.get_deleter().test() == 5);
  178. }
  179. {
  180. const bml::unique_ptr<int, Deleter> p;
  181. BOOST_TEST(p.get_deleter().test() == 6);
  182. }
  183. //Unbounded array unique_ptr
  184. {
  185. bml::unique_ptr<int[], Deleter> p;
  186. BOOST_TEST(p.get_deleter().test() == 5);
  187. }
  188. {
  189. const bml::unique_ptr<int[], Deleter> p;
  190. BOOST_TEST(p.get_deleter().test() == 6);
  191. }
  192. //Bounded array unique_ptr
  193. {
  194. bml::unique_ptr<int[2], Deleter> p;
  195. BOOST_TEST(p.get_deleter().test() == 5);
  196. }
  197. {
  198. const bml::unique_ptr<int[2], Deleter> p;
  199. BOOST_TEST(p.get_deleter().test() == 6);
  200. }
  201. }
  202. } //namespace unique_ptr_observers_get_deleter{
  203. ////////////////////////////////
  204. // unique_ptr_observers_op_arrow
  205. ////////////////////////////////
  206. namespace unique_ptr_observers_op_arrow{
  207. void test()
  208. {
  209. //Single unique_ptr
  210. {
  211. bml::unique_ptr<A> p(new A);
  212. BOOST_TEST(p->state_ == 999);
  213. }
  214. }
  215. } //namespace unique_ptr_observers_op_arrow{
  216. namespace unique_ptr_observers_op_index{
  217. void test()
  218. {
  219. //Unbounded array unique_ptr
  220. {
  221. A *pa = new A[2];
  222. //pa[0] is left default constructed
  223. pa[1].set(888);
  224. bml::unique_ptr<A[]> p(pa);
  225. BOOST_TEST(p[0].state_ == 999);
  226. BOOST_TEST(p[1].state_ == 888);
  227. }
  228. //Bounded array unique_ptr
  229. {
  230. A *pa = new A[2];
  231. //pa[0] is left default constructed
  232. pa[1].set(888);
  233. bml::unique_ptr<A[2]> p(pa);
  234. BOOST_TEST(p[0].state_ == 999);
  235. BOOST_TEST(p[1].state_ == 888);
  236. }
  237. }
  238. } //namespace unique_ptr_observers_op_index{
  239. ////////////////////////////////
  240. // main
  241. ////////////////////////////////
  242. int main()
  243. {
  244. //Observers
  245. unique_ptr_observers_dereference::test();
  246. unique_ptr_observers_explicit_bool::test();
  247. unique_ptr_observers_get::test();
  248. unique_ptr_observers_get_deleter::test();
  249. unique_ptr_observers_op_arrow::test();
  250. unique_ptr_observers_op_index::test();
  251. //Test results
  252. return boost::report_errors();
  253. }
  254. #include "unique_ptr_test_utils_end.hpp"