Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/utility.h

    r1f75e2d r1ba88a0  
    1717#define _UTILITY_H
    1818
     19#include <iostream>
     20#include <sstream>
     21#include <iterator>
     22#include <string>
    1923#include <cctype>
    20 #include <iostream>
    21 #include <iterator>
    2224#include <list>
    23 #include <memory>
    24 #include <sstream>
    25 #include <string>
    2625
    2726template< typename T >
     
    247246}
    248247
    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;
    262 };
    263 
    264 template< typename ThisType >
    265 std::weak_ptr<ThisType> RefCountSingleton<ThisType>::global_instance;
     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
     253template< typename T >
     254struct ValueGuard {
     255        T old;
     256        T& ref;
     257
     258        ValueGuard(T& inRef) : old(inRef), ref(inRef) {}
     259        ~ValueGuard() { ref = old; }
     260};
     261
     262template< typename T >
     263struct 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
     273template< typename T >
     274reverseIterate_t< T > reverseIterate( T & ref ) {
     275        return reverseIterate_t< T >( ref );
     276}
    266277
    267278#endif // _UTILITY_H
Note: See TracChangeset for help on using the changeset viewer.