fixing stuff
[dyninst.git] / dynutil / h / dyn_detail / boost / detail / sp_counted_impl.hpp
1 #ifndef DYN_DETAIL_BOOST_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
2 #define DYN_DETAIL_BOOST_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED
3
4 // MS compatible compilers support #pragma once
5
6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
7 # pragma once
8 #endif
9
10 //
11 //  detail/sp_counted_impl.hpp
12 //
13 //  Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
14 //  Copyright 2004-2005 Peter Dimov
15 //
16 // Distributed under the Boost Software License, Version 1.0. (See
17 // accompanying file LICENSE_1_0.txt or copy at
18 // http://www.boost.org/LICENSE_1_0.txt)
19 //
20
21 #include <dyn_detail/boost/config.hpp>
22
23 #if defined(DYN_DETAIL_BOOST_SP_USE_STD_ALLOCATOR) && defined(DYN_DETAIL_BOOST_SP_USE_QUICK_ALLOCATOR)
24 # error DYN_DETAIL_BOOST_SP_USE_STD_ALLOCATOR and DYN_DETAIL_BOOST_SP_USE_QUICK_ALLOCATOR are incompatible.
25 #endif
26
27 #include <dyn_detail/boost/checked_delete.hpp>
28 #include <dyn_detail/boost/detail/sp_counted_base.hpp>
29
30 #if defined(DYN_DETAIL_BOOST_SP_USE_QUICK_ALLOCATOR)
31 #include <dyn_detail/boost/detail/quick_allocator.hpp>
32 #endif
33
34 #if defined(DYN_DETAIL_BOOST_SP_USE_STD_ALLOCATOR)
35 #include <memory>           // std::allocator
36 #endif
37
38 #include <cstddef>          // std::size_t
39
40 namespace dyn_detail
41 {
42   
43 namespace boost
44 {
45
46 #if defined(DYN_DETAIL_BOOST_SP_ENABLE_DEBUG_HOOKS)
47
48 void sp_scalar_constructor_hook( void * px, std::size_t size, void * pn );
49 void sp_scalar_destructor_hook( void * px, std::size_t size, void * pn );
50
51 #endif
52
53 namespace detail
54 {
55
56 template<class X> class sp_counted_impl_p: public sp_counted_base
57 {
58 private:
59
60     X * px_;
61
62     sp_counted_impl_p( sp_counted_impl_p const & );
63     sp_counted_impl_p & operator= ( sp_counted_impl_p const & );
64
65     typedef sp_counted_impl_p<X> this_type;
66
67 public:
68
69     explicit sp_counted_impl_p( X * px ): px_( px )
70     {
71 #if defined(DYN_DETAIL_BOOST_SP_ENABLE_DEBUG_HOOKS)
72         ::dyn_detail::boost::sp_scalar_constructor_hook( px, sizeof(X), this );
73 #endif
74     }
75
76     virtual void dispose() // nothrow
77     {
78 #if defined(DYN_DETAIL_BOOST_SP_ENABLE_DEBUG_HOOKS)
79         ::dyn_detail::boost::sp_scalar_destructor_hook( px_, sizeof(X), this );
80 #endif
81         ::dyn_detail::boost::checked_delete( px_ );
82     }
83
84     virtual void * get_deleter( detail::sp_typeinfo const & )
85     {
86         return 0;
87     }
88
89 #if defined(DYN_DETAIL_BOOST_SP_USE_STD_ALLOCATOR)
90
91     void * operator new( std::size_t )
92     {
93         return std::allocator<this_type>().allocate( 1, static_cast<this_type *>(0) );
94     }
95
96     void operator delete( void * p )
97     {
98         std::allocator<this_type>().deallocate( static_cast<this_type *>(p), 1 );
99     }
100
101 #endif
102
103 #if defined(DYN_DETAIL_BOOST_SP_USE_QUICK_ALLOCATOR)
104
105     void * operator new( std::size_t )
106     {
107         return quick_allocator<this_type>::alloc();
108     }
109
110     void operator delete( void * p )
111     {
112         quick_allocator<this_type>::dealloc( p );
113     }
114
115 #endif
116 };
117
118 //
119 // Borland's Codeguard trips up over the -Vx- option here:
120 //
121 #ifdef __CODEGUARD__
122 # pragma option push -Vx-
123 #endif
124
125 template<class P, class D> class sp_counted_impl_pd: public sp_counted_base
126 {
127 private:
128
129     P ptr; // copy constructor must not throw
130     D del; // copy constructor must not throw
131
132     sp_counted_impl_pd( sp_counted_impl_pd const & );
133     sp_counted_impl_pd & operator= ( sp_counted_impl_pd const & );
134
135     typedef sp_counted_impl_pd<P, D> this_type;
136
137 public:
138
139     // pre: d(p) must not throw
140
141     sp_counted_impl_pd( P p, D d ): ptr(p), del(d)
142     {
143     }
144
145     virtual void dispose() // nothrow
146     {
147         del( ptr );
148     }
149
150     virtual void * get_deleter( detail::sp_typeinfo const & ti )
151     {
152         return ti == DYN_DETAIL_BOOST_SP_TYPEID(D)? &reinterpret_cast<char&>( del ): 0;
153     }
154
155 #if defined(DYN_DETAIL_BOOST_SP_USE_STD_ALLOCATOR)
156
157     void * operator new( std::size_t )
158     {
159         return std::allocator<this_type>().allocate( 1, static_cast<this_type *>(0) );
160     }
161
162     void operator delete( void * p )
163     {
164         std::allocator<this_type>().deallocate( static_cast<this_type *>(p), 1 );
165     }
166
167 #endif
168
169 #if defined(DYN_DETAIL_BOOST_SP_USE_QUICK_ALLOCATOR)
170
171     void * operator new( std::size_t )
172     {
173         return quick_allocator<this_type>::alloc();
174     }
175
176     void operator delete( void * p )
177     {
178         quick_allocator<this_type>::dealloc( p );
179     }
180
181 #endif
182 };
183
184 template<class P, class D, class A> class sp_counted_impl_pda: public sp_counted_base
185 {
186 private:
187
188     P p_; // copy constructor must not throw
189     D d_; // copy constructor must not throw
190     A a_; // copy constructor must not throw
191
192     sp_counted_impl_pda( sp_counted_impl_pda const & );
193     sp_counted_impl_pda & operator= ( sp_counted_impl_pda const & );
194
195     typedef sp_counted_impl_pda<P, D, A> this_type;
196
197 public:
198
199     // pre: d( p ) must not throw
200
201     sp_counted_impl_pda( P p, D d, A a ): p_( p ), d_( d ), a_( a )
202     {
203     }
204
205     virtual void dispose() // nothrow
206     {
207         d_( p_ );
208     }
209
210     virtual void destroy() // nothrow
211     {
212         typedef typename A::template rebind< this_type >::other A2;
213
214         A2 a2( a_ );
215
216         this->~this_type();
217         a2.deallocate( this, 1 );
218     }
219
220     virtual void * get_deleter( detail::sp_typeinfo const & ti )
221     {
222         return ti == DYN_DETAIL_BOOST_SP_TYPEID( D )? &reinterpret_cast<char&>( d_ ): 0;
223     }
224 };
225
226 #ifdef __CODEGUARD__
227 # pragma option pop
228 #endif
229
230 } // namespace detail
231
232 } // namespace boost
233  
234 } // namespace dyn_detail
235
236
237 #endif  // #ifndef DYN_DETAIL_BOOST_DETAIL_SP_COUNTED_IMPL_HPP_INCLUDED