Geant4-11
G4memory.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26#ifndef G4SHARED_PTR_HH_
27#define G4SHARED_PTR_HH_
28
29//#if __cplusplus >= 201103L
30#include <memory>
31
32#define G4shared_ptr std::shared_ptr
33#define G4weak_ptr std::weak_ptr
34#define G4static_pointer_cast std::static_pointer_cast
35#define G4const_pointer_cast std::const_pointer_cast
36#define G4dynamic_pointer_cast std::dynamic_pointer_cast
37#define G4enable_shared_from_this std::enable_shared_from_this
38#define G4enable_shared_from_this2 std::enable_shared_from_this
39/*
40#else
41#include "CLHEP/Utility/memory.h"
42
43#define G4shared_ptr G4::shared_ptr
44#define G4weak_ptr G4::weak_ptr
45#define G4static_pointer_cast G4::static_pointer_cast
46#define G4const_pointer_cast G4::const_pointer_cast
47#define G4dynamic_pointer_cast G4::dynamic_pointer_cast
48#define G4enable_shared_from_this G4::enable_shared_from_this
49#define G4enable_shared_from_this2 G4::enable_shared_from_this2
50
51namespace G4
52{
53using CLHEP::shared_ptr;
54using CLHEP::weak_ptr;
55using CLHEP::static_pointer_cast;
56using CLHEP::const_pointer_cast;
57using CLHEP::dynamic_pointer_cast;
58}
59
60namespace CLHEP
61{
62
63template< typename T >
64class enable_shared_from_this
65{
66protected:
67 enable_shared_from_this()
68{ }
69
70 ~enable_shared_from_this()
71 { }
72
73 enable_shared_from_this( enable_shared_from_this const & )
74 { }
75
76 enable_shared_from_this &
77 operator = ( enable_shared_from_this const & )
78 {
79 return *this;
80 }
81
82public:
83 shared_ptr<T>
84 shared_from_this()
85 {
86 shared_ptr<T> p( weak_this_ );
87 // assert( p.get() == this );
88 return p;
89 }
90
91 shared_ptr<T const>
92 shared_from_this() const
93 {
94 shared_ptr<T const> p( weak_this_ );
95 // assert( p.get() == this );
96 return p;
97 }
98
99public: // actually private, but avoids compiler template friendship issues
100
101 // Note: invoked automatically by shared_ptr; do not call
102 template< typename X, typename Y >
103 void
104 _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const
105 {
106 if( weak_this_.expired() )
107 weak_this_ = shared_ptr<T>( *ppx, py );
108 }
109
110private:
111 mutable weak_ptr<T> weak_this_;
112}; // enable_shared_from_this<>
113
114
115// enable_shared_from_this2.hpp
116
117namespace detail
118{
119
120class esft2_deleter_wrapper
121{
122private:
123 shared_ptr<void> deleter_;
124
125public:
126 esft2_deleter_wrapper(){ }
127
128 template< typename T >
129 void
130 set_deleter( shared_ptr<T> const & deleter )
131 {
132 deleter_ = deleter;
133 }
134
135 template< typename T >
136 void
137 operator () ( T* )
138 {
139 assert( deleter_.use_count() <= 1 );
140 deleter_.reset();
141 }
142};
143
144} // namespace detail
145
146template< typename T >
147class enable_shared_from_this2
148{
149protected:
150
151 enable_shared_from_this2(){ }
152
153 enable_shared_from_this2( enable_shared_from_this2 const & )
154 { }
155
156 enable_shared_from_this2 & operator = ( enable_shared_from_this2 const & )
157 {
158 return *this;
159 }
160
161 ~enable_shared_from_this2()
162 {
163 assert( shared_this_.use_count() <= 1 ); // ensure no dangling shared_ptrs
164 }
165
166private:
167 mutable weak_ptr<T> weak_this_;
168 mutable shared_ptr<T> shared_this_;
169
170public:
171
172 shared_ptr<T>
173 shared_from_this()
174 {
175 init_weak_once();
176 return shared_ptr<T>( weak_this_ );
177 }
178
179 shared_ptr<T const>
180 shared_from_this() const
181 {
182 init_weak_once();
183 return shared_ptr<T>( weak_this_ );
184 }
185
186private:
187
188 void init_weak_once() const
189 {
190 if( weak_this_._empty() )
191 {
192 shared_this_.reset( static_cast< T* >( 0 )
193 , detail::esft2_deleter_wrapper()
194 );
195 weak_this_ = shared_this_;
196 }
197 }
198
199public: // actually private, but avoids compiler template friendship issues
200
201// Note: invoked automatically by shared_ptr; do not call
202 template< typename X, typename Y >
203 void
204 _internal_accept_owner( shared_ptr<X> * ppx, Y * py ) const
205 {
206 assert( ppx != 0 );
207
208 if( weak_this_.use_count() == 0 )
209 weak_this_ = shared_ptr<T>( *ppx, py );
210 else if( shared_this_.use_count() != 0 )
211 {
212 assert( ppx->unique() ); // no weak_ptrs should exist either, but there's no way to check that
213
214 detail::esft2_deleter_wrapper * pd
215 = //boost::
216 get_deleter<detail::esft2_deleter_wrapper>( shared_this_ );
217 assert( pd != 0 );
218
219 pd->set_deleter( *ppx );
220
221 ppx->reset( shared_this_, ppx->get() );
222 shared_this_.reset();
223 }
224 }
225}; // enable_shared_from_this2<>
226}
227
228namespace G4
229{
230 using CLHEP::enable_shared_from_this;
231 using CLHEP::enable_shared_from_this2;
232}
233#endif
234*/
235
236#endif /* G4SHARED_PTR_HH_ */