weak_ptr_move_test.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //
  2. // weak_ptr_move_test.cpp
  3. //
  4. // Copyright (c) 2007 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/weak_ptr.hpp>
  11. #include <boost/detail/lightweight_test.hpp>
  12. #include <utility>
  13. #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
  14. struct X
  15. {
  16. static long instances;
  17. X()
  18. {
  19. ++instances;
  20. }
  21. ~X()
  22. {
  23. --instances;
  24. }
  25. private:
  26. X( X const & );
  27. X & operator=( X const & );
  28. };
  29. long X::instances = 0;
  30. int main()
  31. {
  32. BOOST_TEST( X::instances == 0 );
  33. {
  34. boost::shared_ptr<X> p_( new X );
  35. boost::weak_ptr<X> p( p_ );
  36. BOOST_TEST( X::instances == 1 );
  37. BOOST_TEST( p.use_count() == 1 );
  38. boost::weak_ptr<X> p2( std::move( p ) );
  39. BOOST_TEST( X::instances == 1 );
  40. BOOST_TEST( p2.use_count() == 1 );
  41. BOOST_TEST( p.expired() );
  42. boost::weak_ptr<void> p3( std::move( p2 ) );
  43. BOOST_TEST( X::instances == 1 );
  44. BOOST_TEST( p3.use_count() == 1 );
  45. BOOST_TEST( p2.expired() );
  46. p_.reset();
  47. BOOST_TEST( X::instances == 0 );
  48. BOOST_TEST( p3.expired() );
  49. }
  50. {
  51. boost::shared_ptr<X> p_( new X );
  52. boost::weak_ptr<X> p( p_ );
  53. BOOST_TEST( X::instances == 1 );
  54. BOOST_TEST( p.use_count() == 1 );
  55. boost::weak_ptr<X> p2;
  56. p2 = static_cast< boost::weak_ptr<X> && >( p );
  57. BOOST_TEST( X::instances == 1 );
  58. BOOST_TEST( p2.use_count() == 1 );
  59. BOOST_TEST( p.expired() );
  60. boost::weak_ptr<void> p3;
  61. p3 = std::move( p2 );
  62. BOOST_TEST( X::instances == 1 );
  63. BOOST_TEST( p3.use_count() == 1 );
  64. BOOST_TEST( p2.expired() );
  65. p_.reset();
  66. BOOST_TEST( X::instances == 0 );
  67. BOOST_TEST( p3.expired() );
  68. }
  69. {
  70. boost::shared_ptr<X> p_( new X );
  71. boost::weak_ptr<X> p( p_ );
  72. BOOST_TEST( X::instances == 1 );
  73. BOOST_TEST( p.use_count() == 1 );
  74. boost::shared_ptr<X> p_2( new X );
  75. boost::weak_ptr<X> p2( p_2 );
  76. BOOST_TEST( X::instances == 2 );
  77. p2 = std::move( p );
  78. BOOST_TEST( X::instances == 2 );
  79. BOOST_TEST( p2.use_count() == 1 );
  80. BOOST_TEST( p.expired() );
  81. BOOST_TEST( p2.lock() != p_2 );
  82. boost::shared_ptr<void> p_3( new X );
  83. boost::weak_ptr<void> p3( p_3 );
  84. BOOST_TEST( X::instances == 3 );
  85. p3 = std::move( p2 );
  86. BOOST_TEST( X::instances == 3 );
  87. BOOST_TEST( p3.use_count() == 1 );
  88. BOOST_TEST( p2.expired() );
  89. BOOST_TEST( p3.lock() != p_3 );
  90. }
  91. return boost::report_errors();
  92. }
  93. #else // defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
  94. int main()
  95. {
  96. return 0;
  97. }
  98. #endif