#if !defined( INCLUDED_GENERIC_STATIC_H ) #define INCLUDED_GENERIC_STATIC_H /// \file /// \brief Template techniques for instantiating singletons. #include /// \brief A singleton which is statically initialised. /// /// \param Type The singleton object type. /// /// \dontinclude generic/static.cpp /// \skipline Static example /// \until end example template class Static { static Type m_instance; public: static Type& instance(){ return m_instance; } }; template Type Static::m_instance; /// \brief A singleton which is lazily initialised. /// The instance is constructed the first time it is referenced, and is never destroyed. /// /// \param Type The singleton object type. /// /// \dontinclude generic/static.cpp /// \skipline LazyStatic example /// \until end example template class LazyStatic { static Type* m_instance; // this will be initialised to 0 by the CRT, according to the c++ standard public: static Type& instance(){ if ( m_instance == 0 ) { m_instance = new Type; // allocate using 'new' to get the correct alignment } return *m_instance; } }; template Type * LazyStatic::m_instance; /// \brief A singleton which keeps a count of the number of times it is referenced. /// /// The instance is constructed when its reference count changes from 0 to 1 and destroyed when its reference count changes from 1 to 0. /// Use with SmartStatic. /// /// \param Type The singleton object type. template class CountedStatic { static std::size_t m_refcount; // this will be initialised to 0 by the CRT, according to the c++ standard static Type* m_instance; public: static Type& instance(){ return *m_instance; } static void capture(){ if ( ++m_refcount == 1 ) { m_instance = new Type; // allocate using 'new' to get the correct alignment } } static void release(){ if ( --m_refcount == 0 ) { delete m_instance; } } }; template std::size_t CountedStatic::m_refcount; // this will be initialised to 0 by the CRT, according to the c++ standard template Type * CountedStatic::m_instance; /// \brief A reference to a CountedStatic. /// Guarantees that CountedStatic will be constructed for the lifetime of this object. /// /// \param Type The type parameter of the CountedStatic to reference. /// /// \dontinclude generic/static.cpp /// \skipline SmartStatic example /// \until end example template class SmartStatic { public: SmartStatic(){ CountedStatic::capture(); } ~SmartStatic(){ CountedStatic::release(); } Type& instance(){ return CountedStatic::instance(); } }; #endif