Changes in src/Common/utility.h [1ba88a0:1f75e2d]
- File:
-
- 1 edited
-
src/Common/utility.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Common/utility.h
r1ba88a0 r1f75e2d 17 17 #define _UTILITY_H 18 18 19 #include <cctype> 19 20 #include <iostream> 21 #include <iterator> 22 #include <list> 23 #include <memory> 20 24 #include <sstream> 21 #include <iterator>22 25 #include <string> 23 #include <cctype>24 #include <list>25 26 26 27 template< typename T > … … 246 247 } 247 248 248 // RAII object to regulate "save and restore" behaviour, e.g. 249 // void Foo::bar() { 250 // ValueGuard<int> guard(var); // var is a member of type Foo 251 // var = ...; 252 // } // var's original value is restored 253 template< typename T > 254 struct ValueGuard { 255 T old; 256 T& ref; 257 258 ValueGuard(T& inRef) : old(inRef), ref(inRef) {} 259 ~ValueGuard() { ref = old; } 249 template< typename ThisType > 250 class RefCountSingleton { 251 public: 252 static std::shared_ptr<ThisType> get() { 253 if( global_instance.expired() ) { 254 std::shared_ptr<ThisType> new_instance = std::make_shared<ThisType>(); 255 global_instance = new_instance; 256 return std::move(new_instance); 257 } 258 return global_instance.lock(); 259 } 260 private: 261 static std::weak_ptr<ThisType> global_instance; 260 262 }; 261 263 262 template< typename T > 263 struct reverseIterate_t { 264 T& ref; 265 266 reverseIterate_t( T & ref ) : ref(ref) {} 267 268 typedef typename T::reverse_iterator iterator; 269 iterator begin() { return ref.rbegin(); } 270 iterator end() { return ref.rend(); } 271 }; 272 273 template< typename T > 274 reverseIterate_t< T > reverseIterate( T & ref ) { 275 return reverseIterate_t< T >( ref ); 276 } 264 template< typename ThisType > 265 std::weak_ptr<ThisType> RefCountSingleton<ThisType>::global_instance; 277 266 278 267 #endif // _UTILITY_H
Note:
See TracChangeset
for help on using the changeset viewer.