// file : cult/mm/counter.hxx // author : Boris Kolpackov // copyright : Copyright (c) 2005-2010 Boris Kolpackov // license : GNU GPL v2 + exceptions; see accompanying LICENSE file #ifndef CULT_MM_COUNTER_HXX #define CULT_MM_COUNTER_HXX #ifdef CULT_THREADS // Multi-threaded version is architecture-specific. // #include #else // Single-threaded version. // #include namespace Cult { namespace MM { class Counter: public NonCopyable { public: Counter (); // After failure assume the counter has its old value. // Void inc_ref (); // After failure assume the counter has its new value. // Boolean dec_ref (); Size count () const; private: Size value_; }; } } #include #endif // CULT_THREADS #include #include namespace Cult { namespace MM { extern StaticPtr > counted; // Non-member inc_ref. Especially useful for messing with `this'. // template X* inc_ref (X* p) { locate (p, *counted)->inc_ref (); return p; } } } #endif // CULT_MM_COUNTER_HXX