Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/utility.h

    r1ba88a0 r1f75e2d  
    1717#define _UTILITY_H
    1818
     19#include <cctype>
    1920#include <iostream>
     21#include <iterator>
     22#include <list>
     23#include <memory>
    2024#include <sstream>
    21 #include <iterator>
    2225#include <string>
    23 #include <cctype>
    24 #include <list>
    2526
    2627template< typename T >
     
    246247}
    247248
    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; }
     249template< typename ThisType >
     250class 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;
    260262};
    261263
    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 }
     264template< typename ThisType >
     265std::weak_ptr<ThisType> RefCountSingleton<ThisType>::global_instance;
    277266
    278267#endif // _UTILITY_H
Note: See TracChangeset for help on using the changeset viewer.