• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
8 #include <boost/shared_ptr.hpp>
9 #include <boost/core/lightweight_test.hpp>
10 #include <boost/config/pragma_message.hpp>
11 
12 #if defined(BOOST_DISABLE_THREADS)
13 BOOST_PRAGMA_MESSAGE( "BOOST_DISABLE_THREADS is defined" )
14 #else
15 BOOST_PRAGMA_MESSAGE( "BOOST_DISABLE_THREADS is not defined" )
16 #endif
17 
18 #if defined(BOOST_NO_CXX11_HDR_ATOMIC)
19 BOOST_PRAGMA_MESSAGE( "BOOST_NO_CXX11_HDR_ATOMIC is defined" )
20 #else
21 BOOST_PRAGMA_MESSAGE( "BOOST_NO_CXX11_HDR_ATOMIC is not defined" )
22 #endif
23 
24 void abi_test_1( boost::shared_ptr<void> & p );
25 boost::shared_ptr<void> abi_test_2( boost::shared_ptr<void> const & p );
26 boost::shared_ptr<void> abi_test_3();
27 
28 static int deleter_called;
29 
deleter(void *)30 void deleter( void* )
31 {
32     ++deleter_called;
33 }
34 
main()35 int main()
36 {
37     {
38         deleter_called = 0;
39 
40         boost::shared_ptr<void> p( static_cast<void*>( 0 ), deleter );
41 
42         BOOST_TEST_EQ( p.use_count(), 1 );
43 
44         abi_test_1( p );
45 
46         BOOST_TEST_EQ( p.use_count(), 0 );
47         BOOST_TEST_EQ( deleter_called, 1 );
48     }
49 
50     {
51         deleter_called = 0;
52 
53         boost::shared_ptr<void> p1( static_cast<void*>( 0 ), deleter );
54 
55         BOOST_TEST_EQ( p1.use_count(), 1 );
56 
57         boost::shared_ptr<void> p2 = abi_test_2( p1 );
58 
59         BOOST_TEST_EQ( p1.use_count(), 2 );
60         BOOST_TEST_EQ( p2.use_count(), 2 );
61 
62         p1.reset();
63 
64         BOOST_TEST_EQ( p2.use_count(), 1 );
65 
66         p2.reset();
67 
68         BOOST_TEST_EQ( deleter_called, 1 );
69     }
70 
71     {
72         boost::shared_ptr<void> p = abi_test_3();
73 
74         BOOST_TEST_EQ( p.use_count(), 1 );
75 
76         p.reset();
77 
78         BOOST_TEST_EQ( p.use_count(), 0 );
79     }
80 
81     return boost::report_errors();
82 }
83