Geant4 Cross Reference |
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