1 //
2 // quick.cpp - a quick (CI) test for Boost.SmartPtr
3 //
4 // Copyright 2017 Peter Dimov
5 //
6 // Distributed under the Boost Software License, Version 1.0.
7 //
8 // See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt
10 //
11 
12 #include <boost/smart_ptr.hpp>
13 #include <boost/core/lightweight_test.hpp>
14 
15 class X
16 {
17 private:
18 
19     X( X const & );
20     X & operator=( X const & );
21 
22 public:
23 
24     static int instances;
25 
X()26     X()
27     {
28         ++instances;
29     }
30 
~X()31     ~X()
32     {
33         --instances;
34     }
35 };
36 
37 int X::instances = 0;
38 
main()39 int main()
40 {
41     {
42         boost::shared_ptr<X> p1( new X );
43         BOOST_TEST_EQ( X::instances, 1 );
44         BOOST_TEST_EQ( p1.use_count(), 1 );
45 
46         boost::shared_ptr<X> p2( p1 );
47         BOOST_TEST_EQ( p2.use_count(), 2 );
48 
49         boost::weak_ptr<X> wp( p1 );
50         BOOST_TEST_EQ( wp.use_count(), 2 );
51 
52         p1.reset();
53         BOOST_TEST_EQ( wp.use_count(), 1 );
54 
55         p2.reset();
56         BOOST_TEST_EQ( wp.use_count(), 0 );
57         BOOST_TEST_EQ( X::instances, 0 );
58     }
59 
60     {
61         boost::shared_ptr<X> p1 = boost::make_shared<X>();
62         BOOST_TEST_EQ( X::instances, 1 );
63         BOOST_TEST_EQ( p1.use_count(), 1 );
64 
65         boost::shared_ptr<X> p2( p1 );
66         BOOST_TEST_EQ( p2.use_count(), 2 );
67 
68         boost::weak_ptr<X> wp( p1 );
69         BOOST_TEST_EQ( wp.use_count(), 2 );
70 
71         p1.reset();
72         BOOST_TEST_EQ( wp.use_count(), 1 );
73 
74         p2.reset();
75         BOOST_TEST_EQ( wp.use_count(), 0 );
76         BOOST_TEST_EQ( X::instances, 0 );
77     }
78 
79     return boost::report_errors();
80 }
81