Geant4
11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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
51
namespace G4
52
{
53
using CLHEP::shared_ptr;
54
using CLHEP::weak_ptr;
55
using CLHEP::static_pointer_cast;
56
using CLHEP::const_pointer_cast;
57
using CLHEP::dynamic_pointer_cast;
58
}
59
60
namespace CLHEP
61
{
62
63
template< typename T >
64
class enable_shared_from_this
65
{
66
protected:
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
82
public:
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
99
public: // 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
110
private:
111
mutable weak_ptr<T> weak_this_;
112
}; // enable_shared_from_this<>
113
114
115
// enable_shared_from_this2.hpp
116
117
namespace detail
118
{
119
120
class esft2_deleter_wrapper
121
{
122
private:
123
shared_ptr<void> deleter_;
124
125
public:
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
146
template< typename T >
147
class enable_shared_from_this2
148
{
149
protected:
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
166
private:
167
mutable weak_ptr<T> weak_this_;
168
mutable shared_ptr<T> shared_this_;
169
170
public:
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
186
private:
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
199
public: // 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
228
namespace 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_ */
geant4-v11.2.2
source
processes
electromagnetic
dna
management
include
G4memory.hh
Generated by
1.12.0