Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/dna/management/include/G4memory.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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_ */
237