shared_ptr_rv_pointer_cast_test.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. //
  2. // shared_ptr_rv_pointer_cast_test.cpp
  3. //
  4. // Copyright (c) 2016 Chris Glover
  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/shared_ptr.hpp>
  11. #include <boost/detail/lightweight_test.hpp>
  12. #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
  13. struct X
  14. {};
  15. struct Y: public X
  16. {};
  17. struct U
  18. {
  19. virtual ~U() {}
  20. };
  21. struct V: public U
  22. {};
  23. struct W : public U
  24. {};
  25. int main()
  26. {
  27. {
  28. boost::shared_ptr<X> px(new Y);
  29. boost::shared_ptr<Y> py1 = boost::static_pointer_cast<Y>(px);
  30. boost::shared_ptr<Y> py2 = boost::static_pointer_cast<Y>(std::move(px));
  31. BOOST_TEST(!px);
  32. BOOST_TEST(px.use_count() == 0);
  33. BOOST_TEST(py1.get() == py2.get());
  34. BOOST_TEST(!(py1 < py2 || py2 < py1));
  35. BOOST_TEST(py1.use_count() == 2);
  36. BOOST_TEST(py2.use_count() == 2);
  37. }
  38. {
  39. boost::shared_ptr<int const volatile> px(new int);
  40. boost::shared_ptr<int> px2 = boost::const_pointer_cast<int>(px);
  41. boost::shared_ptr<int> px3 = boost::const_pointer_cast<int>(std::move(px));
  42. BOOST_TEST(!px);
  43. BOOST_TEST(px.use_count() == 0);
  44. BOOST_TEST(px2.get() == px3.get());
  45. BOOST_TEST(!(px2 < px3 || px2 < px3));
  46. BOOST_TEST(px2.use_count() == 2);
  47. BOOST_TEST(px3.use_count() == 2);
  48. }
  49. {
  50. boost::shared_ptr<char> pv(reinterpret_cast<char*>(new Y));
  51. boost::shared_ptr<Y> py1 = boost::reinterpret_pointer_cast<Y>(pv);
  52. boost::shared_ptr<Y> py2 = boost::reinterpret_pointer_cast<Y>(std::move(pv));
  53. BOOST_TEST(!pv);
  54. BOOST_TEST(pv.use_count() == 0);
  55. BOOST_TEST(py1.get() == py2.get());
  56. BOOST_TEST(!(py1 < py2 || py2 < py1));
  57. BOOST_TEST(py1.use_count() == 2);
  58. BOOST_TEST(py2.use_count() == 2);
  59. }
  60. #if !defined( BOOST_NO_RTTI )
  61. {
  62. boost::shared_ptr<U> pu(new V);
  63. boost::shared_ptr<V> pv1 = boost::dynamic_pointer_cast<V>(pu);
  64. boost::shared_ptr<V> pv2 = boost::dynamic_pointer_cast<V>(std::move(pu));
  65. BOOST_TEST(!pu);
  66. BOOST_TEST(pu.use_count() == 0);
  67. BOOST_TEST(pv1.get() == pv2.get());
  68. BOOST_TEST(!(pv1 < pv2 || pv2 < pv1));
  69. BOOST_TEST(pv1.use_count() == 2);
  70. BOOST_TEST(pv2.use_count() == 2);
  71. }
  72. {
  73. boost::shared_ptr<U> pu(new V);
  74. boost::shared_ptr<W> pw = boost::dynamic_pointer_cast<W>(std::move(pu));
  75. BOOST_TEST(!pw);
  76. BOOST_TEST(pu);
  77. }
  78. #endif // !defined( BOOST_NO_RTTI )
  79. return boost::report_errors();
  80. }
  81. #else // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
  82. int main()
  83. {
  84. return 0;
  85. }
  86. #endif // !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )