weak_from_test.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // weak_from_test.cpp
  2. //
  3. // Copyright 2019 Peter Dimov
  4. //
  5. // Distributed under the Boost Software License, Version 1.0.
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. #include <boost/smart_ptr/enable_shared_from.hpp>
  8. #include <boost/shared_ptr.hpp>
  9. #include <boost/weak_ptr.hpp>
  10. #include <boost/core/lightweight_test.hpp>
  11. //
  12. class X
  13. {
  14. private:
  15. int m_;
  16. public:
  17. X(): m_() {}
  18. };
  19. class Y: public boost::enable_shared_from
  20. {
  21. };
  22. class Z: public X, public Y
  23. {
  24. public:
  25. boost::weak_ptr<Z> weak_from_this()
  26. {
  27. return boost::weak_from( this );
  28. }
  29. };
  30. void null_deleter( void const* )
  31. {
  32. }
  33. int main()
  34. {
  35. boost::shared_ptr<Z> sp( new Z );
  36. boost::weak_ptr<Z> p( sp );
  37. {
  38. boost::weak_ptr<Z> q = sp->weak_from_this();
  39. BOOST_TEST_EQ( p.lock(), q.lock() );
  40. BOOST_TEST( !( p < q ) && !( q < p ) );
  41. }
  42. Z v2( *sp );
  43. {
  44. boost::weak_ptr<Z> q = v2.weak_from_this();
  45. BOOST_TEST( q.expired() );
  46. }
  47. *sp = Z();
  48. {
  49. boost::weak_ptr<Z> q = sp->weak_from_this();
  50. BOOST_TEST_EQ( p.lock(), q.lock() );
  51. BOOST_TEST( !( p < q ) && !( q < p ) );
  52. }
  53. {
  54. boost::shared_ptr<Z> sp2( sp.get(), null_deleter );
  55. }
  56. {
  57. boost::weak_ptr<Z> q = sp->weak_from_this();
  58. BOOST_TEST_EQ( p.lock(), q.lock() );
  59. BOOST_TEST( !( p < q ) && !( q < p ) );
  60. }
  61. {
  62. boost::weak_ptr<Z> p2 = sp->weak_from_this();
  63. BOOST_TEST( !p.expired() );
  64. BOOST_TEST( !p2.expired() );
  65. sp.reset();
  66. BOOST_TEST( p.expired() );
  67. BOOST_TEST( p2.expired() );
  68. }
  69. return boost::report_errors();
  70. }