pointer_cast_test2.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. //
  2. // pointer_cast_test2.cpp - a test for unique_ptr casts
  3. //
  4. // Copyright 2016 Peter Dimov
  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. #include <boost/config.hpp>
  11. #if defined( BOOST_NO_CXX11_SMART_PTR )
  12. int main()
  13. {
  14. return 0;
  15. }
  16. #else
  17. #include <boost/pointer_cast.hpp>
  18. #include <boost/core/lightweight_test.hpp>
  19. #include <memory>
  20. struct B1
  21. {
  22. };
  23. struct D1: B1
  24. {
  25. ~D1()
  26. {
  27. }
  28. };
  29. static void test_static_cast()
  30. {
  31. {
  32. std::unique_ptr<int> p1( new int );
  33. int * q1 = p1.get();
  34. std::unique_ptr<int> p2 = boost::static_pointer_cast<int>( std::move( p1 ) );
  35. BOOST_TEST( p1.get() == 0 );
  36. BOOST_TEST_EQ( p2.get(), q1 );
  37. }
  38. {
  39. std::unique_ptr<int> p1( new int );
  40. int * q1 = p1.get();
  41. std::unique_ptr<int const> p2 = boost::static_pointer_cast<int const>( std::move( p1 ) );
  42. BOOST_TEST( p1.get() == 0 );
  43. BOOST_TEST_EQ( p2.get(), q1 );
  44. }
  45. {
  46. std::unique_ptr<int[]> p1( new int[ 1 ] );
  47. int * q1 = p1.get();
  48. std::unique_ptr<int[]> p2 = boost::static_pointer_cast<int[]>( std::move( p1 ) );
  49. BOOST_TEST( p1.get() == 0 );
  50. BOOST_TEST_EQ( p2.get(), q1 );
  51. }
  52. {
  53. std::unique_ptr<int[]> p1( new int[ 1 ] );
  54. int * q1 = p1.get();
  55. std::unique_ptr<int const[]> p2 = boost::static_pointer_cast<int const[]>( std::move( p1 ) );
  56. BOOST_TEST( p1.get() == 0 );
  57. BOOST_TEST_EQ( p2.get(), q1 );
  58. }
  59. {
  60. std::unique_ptr<D1> p1( new D1 );
  61. D1 * q1 = p1.get();
  62. std::unique_ptr<B1> p2 = boost::static_pointer_cast<B1>( std::move( p1 ) );
  63. BOOST_TEST( p1.get() == 0 );
  64. BOOST_TEST_EQ( p2.get(), q1 );
  65. std::unique_ptr<D1> p3 = boost::static_pointer_cast<D1>( std::move( p2 ) );
  66. BOOST_TEST( p2.get() == 0 );
  67. BOOST_TEST_EQ( p3.get(), q1 );
  68. }
  69. }
  70. static void test_const_cast()
  71. {
  72. {
  73. std::unique_ptr<int> p1( new int );
  74. int * q1 = p1.get();
  75. std::unique_ptr<int const> p2 = boost::const_pointer_cast<int const>( std::move( p1 ) );
  76. BOOST_TEST( p1.get() == 0 );
  77. BOOST_TEST_EQ( p2.get(), q1 );
  78. std::unique_ptr<int> p3 = boost::const_pointer_cast<int>( std::move( p2 ) );
  79. BOOST_TEST( p2.get() == 0 );
  80. BOOST_TEST_EQ( p3.get(), q1 );
  81. }
  82. {
  83. std::unique_ptr<int[]> p1( new int[ 1 ] );
  84. int * q1 = p1.get();
  85. std::unique_ptr<int const[]> p2 = boost::const_pointer_cast<int const[]>( std::move( p1 ) );
  86. BOOST_TEST( p1.get() == 0 );
  87. BOOST_TEST_EQ( p2.get(), q1 );
  88. std::unique_ptr<int[]> p3 = boost::const_pointer_cast<int[]>( std::move( p2 ) );
  89. BOOST_TEST( p2.get() == 0 );
  90. BOOST_TEST_EQ( p3.get(), q1 );
  91. }
  92. }
  93. struct B2
  94. {
  95. virtual ~B2()
  96. {
  97. }
  98. };
  99. struct C2
  100. {
  101. virtual ~C2()
  102. {
  103. }
  104. };
  105. struct D2: B2, C2
  106. {
  107. };
  108. static void test_dynamic_cast()
  109. {
  110. {
  111. std::unique_ptr<D2> p1( new D2 );
  112. D2 * q1 = p1.get();
  113. std::unique_ptr<B2> p2 = boost::dynamic_pointer_cast<B2>( std::move( p1 ) );
  114. BOOST_TEST( p1.get() == 0 );
  115. BOOST_TEST_EQ( p2.get(), q1 );
  116. }
  117. {
  118. std::unique_ptr<B2> p1( new D2 );
  119. B2 * q1 = p1.get();
  120. std::unique_ptr<D2> p2 = boost::dynamic_pointer_cast<D2>( std::move( p1 ) );
  121. BOOST_TEST( p1.get() == 0 );
  122. BOOST_TEST_EQ( p2.get(), q1 );
  123. }
  124. {
  125. std::unique_ptr<B2> p1( new B2 );
  126. B2 * q1 = p1.get();
  127. std::unique_ptr<D2> p2 = boost::dynamic_pointer_cast<D2>( std::move( p1 ) );
  128. BOOST_TEST( p2.get() == 0 );
  129. BOOST_TEST_EQ( p1.get(), q1 );
  130. }
  131. {
  132. D2 * q1 = new D2;
  133. std::unique_ptr<B2> p1( q1 );
  134. std::unique_ptr<C2> p2 = boost::dynamic_pointer_cast<C2>( std::move( p1 ) );
  135. BOOST_TEST( p1.get() == 0 );
  136. BOOST_TEST_EQ( p2.get(), q1 );
  137. }
  138. }
  139. static void test_reinterpret_cast()
  140. {
  141. {
  142. std::unique_ptr<int> p1( new int );
  143. void * q1 = p1.get();
  144. std::unique_ptr<char> p2 = boost::reinterpret_pointer_cast<char>( std::move( p1 ) );
  145. BOOST_TEST( p1.get() == 0 );
  146. BOOST_TEST_EQ( p2.get(), q1 );
  147. p1 = boost::reinterpret_pointer_cast<int>( std::move( p2 ) );
  148. BOOST_TEST( p2.get() == 0 );
  149. BOOST_TEST_EQ( p1.get(), q1 );
  150. }
  151. {
  152. std::unique_ptr<int> p1( new int );
  153. void * q1 = p1.get();
  154. std::unique_ptr<char[]> p2 = boost::reinterpret_pointer_cast<char[]>( std::move( p1 ) );
  155. BOOST_TEST( p1.get() == 0 );
  156. BOOST_TEST_EQ( p2.get(), q1 );
  157. p1 = boost::reinterpret_pointer_cast<int>( std::move( p2 ) );
  158. BOOST_TEST( p2.get() == 0 );
  159. BOOST_TEST_EQ( p1.get(), q1 );
  160. }
  161. {
  162. std::unique_ptr<int[]> p1( new int[ 1 ] );
  163. void * q1 = p1.get();
  164. std::unique_ptr<char[]> p2 = boost::reinterpret_pointer_cast<char[]>( std::move( p1 ) );
  165. BOOST_TEST( p1.get() == 0 );
  166. BOOST_TEST_EQ( p2.get(), q1 );
  167. p1 = boost::reinterpret_pointer_cast<int[]>( std::move( p2 ) );
  168. BOOST_TEST( p2.get() == 0 );
  169. BOOST_TEST_EQ( p1.get(), q1 );
  170. }
  171. }
  172. int main()
  173. {
  174. test_static_cast();
  175. test_const_cast();
  176. test_dynamic_cast();
  177. test_reinterpret_cast();
  178. return boost::report_errors();
  179. }
  180. #endif