• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc.
2 
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #include <boost/exception/exception.hpp>
7 #include <boost/detail/lightweight_test.hpp>
8 
9 struct
10 test_type
11     {
test_typetest_type12     test_type( int & count ):
13         count_(count)
14         {
15         BOOST_TEST(count_==42);
16         count_=0;
17         }
18 
~test_typetest_type19     ~test_type()
20         {
21         BOOST_TEST(!count_);
22         count_=42;
23         }
24 
25     void
add_reftest_type26     add_ref()
27         {
28         ++count_;
29         }
30 
31     bool
releasetest_type32     release()
33         {
34         if( --count_ )
35             return false;
36         else
37             {
38             delete this;
39             return true;
40             }
41         }
42 
43     private:
44 
45     test_type( test_type const & );
46     test_type & operator=( test_type const & );
47 
48     int & count_;
49     };
50 
51 int
main()52 main()
53     {
54     using boost::exception_detail::refcount_ptr;
55 
56         {
57         refcount_ptr<test_type> x;
58         BOOST_TEST(!x.get());
59         }
60 
61         {
62         int count=42;
63         test_type * a=new test_type(count);
64         BOOST_TEST(!count);
65             {
66             refcount_ptr<test_type> p;
67             BOOST_TEST(0==count);
68             p.adopt(a);
69             BOOST_TEST(p.get()==a);
70             BOOST_TEST(1==count);
71                 {
72                 refcount_ptr<test_type> q;
73                 q.adopt(p.get());
74                 BOOST_TEST(q.get()==a);
75                 BOOST_TEST(2==count);
76                     {
77                     refcount_ptr<test_type> t(p);
78                     BOOST_TEST(t.get()==a);
79                     BOOST_TEST(3==count);
80                         {
81                         refcount_ptr<test_type> n;
82                         n=t;
83                         BOOST_TEST(n.get()==a);
84                         BOOST_TEST(4==count);
85                         int cb=42;
86                         test_type * b=new test_type(cb);
87                         BOOST_TEST(0==cb);
88                         n.adopt(b);
89                         BOOST_TEST(1==cb);
90                         BOOST_TEST(n.get()==b);
91                         BOOST_TEST(3==count);
92                         n.adopt(0);
93                         BOOST_TEST(42==cb);
94                         }
95                     BOOST_TEST(t.get()==a);
96                     BOOST_TEST(3==count);
97                     }
98                 BOOST_TEST(q.get()==a);
99                 BOOST_TEST(2==count);
100                 }
101             BOOST_TEST(p.get()==a);
102             BOOST_TEST(1==count);
103             }
104         BOOST_TEST(42==count);
105         }
106 
107     return boost::report_errors();
108     }
109