Fixes for VS 2008
[dyninst.git] / external / boost / detail / sp_counted_base_nt.hpp
1 #ifndef BOOST_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED\r
2 #define BOOST_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED\r
3 \r
4 // MS compatible compilers support #pragma once\r
5 \r
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)\r
7 # pragma once\r
8 #endif\r
9 \r
10 //\r
11 //  detail/sp_counted_base_nt.hpp\r
12 //\r
13 //  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.\r
14 //  Copyright 2004-2005 Peter Dimov\r
15 //\r
16 // Distributed under the Boost Software License, Version 1.0. (See\r
17 // accompanying file LICENSE_1_0.txt or copy at\r
18 // http://www.boost.org/LICENSE_1_0.txt)\r
19 //\r
20 \r
21 #include <boost/detail/sp_typeinfo.hpp>\r
22 \r
23 namespace boost\r
24 {\r
25 \r
26 namespace detail\r
27 {\r
28 \r
29 class sp_counted_base\r
30 {\r
31 private:\r
32 \r
33     sp_counted_base( sp_counted_base const & );\r
34     sp_counted_base & operator= ( sp_counted_base const & );\r
35 \r
36     long use_count_;        // #shared\r
37     long weak_count_;       // #weak + (#shared != 0)\r
38 \r
39 public:\r
40 \r
41     sp_counted_base(): use_count_( 1 ), weak_count_( 1 )\r
42     {\r
43     }\r
44 \r
45     virtual ~sp_counted_base() // nothrow\r
46     {\r
47     }\r
48 \r
49     // dispose() is called when use_count_ drops to zero, to release\r
50     // the resources managed by *this.\r
51 \r
52     virtual void dispose() = 0; // nothrow\r
53 \r
54     // destroy() is called when weak_count_ drops to zero.\r
55 \r
56     virtual void destroy() // nothrow\r
57     {\r
58         delete this;\r
59     }\r
60 \r
61     virtual void * get_deleter( sp_typeinfo const & ti ) = 0;\r
62 \r
63     void add_ref_copy()\r
64     {\r
65         ++use_count_;\r
66     }\r
67 \r
68     bool add_ref_lock() // true on success\r
69     {\r
70         if( use_count_ == 0 ) return false;\r
71         ++use_count_;\r
72         return true;\r
73     }\r
74 \r
75     void release() // nothrow\r
76     {\r
77         if( --use_count_ == 0 )\r
78         {\r
79             dispose();\r
80             weak_release();\r
81         }\r
82     }\r
83 \r
84     void weak_add_ref() // nothrow\r
85     {\r
86         ++weak_count_;\r
87     }\r
88 \r
89     void weak_release() // nothrow\r
90     {\r
91         if( --weak_count_ == 0 )\r
92         {\r
93             destroy();\r
94         }\r
95     }\r
96 \r
97     long use_count() const // nothrow\r
98     {\r
99         return use_count_;\r
100     }\r
101 };\r
102 \r
103 } // namespace detail\r
104 \r
105 } // namespace boost\r
106 \r
107 #endif  // #ifndef BOOST_DETAIL_SP_COUNTED_BASE_NT_HPP_INCLUDED\r