abi_test_main.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright 2018 Peter Dimov
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. //
  5. // See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt
  7. #include <boost/shared_ptr.hpp>
  8. #include <boost/core/lightweight_test.hpp>
  9. #include <boost/config/pragma_message.hpp>
  10. #if defined(BOOST_DISABLE_THREADS)
  11. BOOST_PRAGMA_MESSAGE( "BOOST_DISABLE_THREADS is defined" )
  12. #else
  13. BOOST_PRAGMA_MESSAGE( "BOOST_DISABLE_THREADS is not defined" )
  14. #endif
  15. #if defined(BOOST_NO_CXX11_HDR_ATOMIC)
  16. BOOST_PRAGMA_MESSAGE( "BOOST_NO_CXX11_HDR_ATOMIC is defined" )
  17. #else
  18. BOOST_PRAGMA_MESSAGE( "BOOST_NO_CXX11_HDR_ATOMIC is not defined" )
  19. #endif
  20. void abi_test_1( boost::shared_ptr<void> & p );
  21. boost::shared_ptr<void> abi_test_2( boost::shared_ptr<void> const & p );
  22. boost::shared_ptr<void> abi_test_3();
  23. static int deleter_called;
  24. void deleter( void* )
  25. {
  26. ++deleter_called;
  27. }
  28. int main()
  29. {
  30. {
  31. deleter_called = 0;
  32. boost::shared_ptr<void> p( static_cast<void*>( 0 ), deleter );
  33. BOOST_TEST_EQ( p.use_count(), 1 );
  34. abi_test_1( p );
  35. BOOST_TEST_EQ( p.use_count(), 0 );
  36. BOOST_TEST_EQ( deleter_called, 1 );
  37. }
  38. {
  39. deleter_called = 0;
  40. boost::shared_ptr<void> p1( static_cast<void*>( 0 ), deleter );
  41. BOOST_TEST_EQ( p1.use_count(), 1 );
  42. boost::shared_ptr<void> p2 = abi_test_2( p1 );
  43. BOOST_TEST_EQ( p1.use_count(), 2 );
  44. BOOST_TEST_EQ( p2.use_count(), 2 );
  45. p1.reset();
  46. BOOST_TEST_EQ( p2.use_count(), 1 );
  47. p2.reset();
  48. BOOST_TEST_EQ( deleter_called, 1 );
  49. }
  50. {
  51. boost::shared_ptr<void> p = abi_test_3();
  52. BOOST_TEST_EQ( p.use_count(), 1 );
  53. p.reset();
  54. BOOST_TEST_EQ( p.use_count(), 0 );
  55. }
  56. return boost::report_errors();
  57. }