ECCE @ EIC Software
Reference for
ECCE @ EIC
simulation and reconstruction software on GitHub
Home page
Related Pages
Modules
Namespaces
Classes
Files
External Links
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
G4memory.hh
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file G4memory.hh
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
tree
geant4-10.6-release
source
processes
electromagnetic
dna
management
include
G4memory.hh
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:25:28
using
1.8.2 with
ECCE GitHub integration