shared_ptr_alias_test.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include <boost/config.hpp>
  2. // shared_ptr_alias_test.cpp
  3. //
  4. // Copyright (c) 2007 Peter Dimov
  5. //
  6. // Distributed under the Boost Software License, Version 1.0. (See
  7. // accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. #include <boost/detail/lightweight_test.hpp>
  10. #include <boost/shared_ptr.hpp>
  11. #include <memory>
  12. #include <cstddef>
  13. //
  14. class incomplete;
  15. struct X
  16. {
  17. int v_;
  18. explicit X( int v ): v_( v )
  19. {
  20. }
  21. ~X()
  22. {
  23. v_ = 0;
  24. }
  25. };
  26. int main()
  27. {
  28. {
  29. int m = 0;
  30. boost::shared_ptr< int > p;
  31. boost::shared_ptr< int > p2( p, &m );
  32. BOOST_TEST( p2.get() == &m );
  33. BOOST_TEST( p2? true: false );
  34. BOOST_TEST( !!p2 );
  35. BOOST_TEST( p2.use_count() == p.use_count() );
  36. BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
  37. p2.reset( p, 0 );
  38. BOOST_TEST( p2.get() == 0 );
  39. BOOST_TEST( p2? false: true );
  40. BOOST_TEST( !p2 );
  41. BOOST_TEST( p2.use_count() == p.use_count() );
  42. BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
  43. }
  44. {
  45. int m = 0;
  46. boost::shared_ptr< int > p( new int );
  47. boost::shared_ptr< int const > p2( p, &m );
  48. BOOST_TEST( p2.get() == &m );
  49. BOOST_TEST( p2? true: false );
  50. BOOST_TEST( !!p2 );
  51. BOOST_TEST( p2.use_count() == p.use_count() );
  52. BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
  53. boost::shared_ptr< int volatile > p3;
  54. p2.reset( p3, 0 );
  55. BOOST_TEST( p2.get() == 0 );
  56. BOOST_TEST( p2? false: true );
  57. BOOST_TEST( !p2 );
  58. BOOST_TEST( p2.use_count() == p3.use_count() );
  59. BOOST_TEST( !( p3 < p2 ) && !( p2 < p3 ) );
  60. }
  61. {
  62. boost::shared_ptr< int > p( new int );
  63. boost::shared_ptr< void const > p2( p, 0 );
  64. BOOST_TEST( p2.get() == 0 );
  65. BOOST_TEST( p2? false: true );
  66. BOOST_TEST( !p2 );
  67. BOOST_TEST( p2.use_count() == p.use_count() );
  68. BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
  69. int m = 0;
  70. boost::shared_ptr< void volatile > p3;
  71. p2.reset( p3, &m );
  72. BOOST_TEST( p2.get() == &m );
  73. BOOST_TEST( p2? true: false );
  74. BOOST_TEST( !!p2 );
  75. BOOST_TEST( p2.use_count() == p3.use_count() );
  76. BOOST_TEST( !( p3 < p2 ) && !( p2 < p3 ) );
  77. }
  78. {
  79. boost::shared_ptr< incomplete > p;
  80. boost::shared_ptr< incomplete > p2( p, 0 );
  81. BOOST_TEST( p2.get() == 0 );
  82. BOOST_TEST( p2? false: true );
  83. BOOST_TEST( !p2 );
  84. BOOST_TEST( p2.use_count() == p.use_count() );
  85. BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
  86. p2.reset( p, 0 );
  87. BOOST_TEST( p2.get() == 0 );
  88. BOOST_TEST( p2? false: true );
  89. BOOST_TEST( !p2 );
  90. BOOST_TEST( p2.use_count() == p.use_count() );
  91. BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
  92. }
  93. {
  94. boost::shared_ptr< X > p( new X( 5 ) );
  95. boost::shared_ptr< int const > p2( p, &p->v_ );
  96. BOOST_TEST( p2.get() == &p->v_ );
  97. BOOST_TEST( p2? true: false );
  98. BOOST_TEST( !!p2 );
  99. BOOST_TEST( p2.use_count() == p.use_count() );
  100. BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
  101. p.reset();
  102. BOOST_TEST( *p2 == 5 );
  103. boost::shared_ptr< X const > p3( new X( 8 ) );
  104. p2.reset( p3, &p3->v_ );
  105. BOOST_TEST( p2.get() == &p3->v_ );
  106. BOOST_TEST( p2? true: false );
  107. BOOST_TEST( !!p2 );
  108. BOOST_TEST( p2.use_count() == p3.use_count() );
  109. BOOST_TEST( !( p3 < p2 ) && !( p2 < p3 ) );
  110. p3.reset();
  111. BOOST_TEST( *p2 == 8 );
  112. }
  113. return boost::report_errors();
  114. }