//This file is part of Photon (http://photon.sourceforge.net) //Copyright (C) 2004-2005 James Turk // // Author: // James Turk (jpt2433@rit.edu) // // Version: // $Id: Singleton.hpp,v 1.4 2005/03/01 07:51:23 cozman Exp $ #ifndef PHOTON_UTIL_SINGLETON_HPP #define PHOTON_UTIL_SINGLETON_HPP #include #include namespace photon { namespace util { // Class: Singleton // Template class for singleton pattern. Is non-copyable to enforce // correct behavior. // // Defining a Singleton: // (code) // YourClass : public Singleton // { // // class specific data // // // Singleton-required code // private: // // Singleton-required code // YourClass(); // ~YourClass(); // // friend class util::Singleton; // friend class std::auto_ptr; // }; // (end) // // Using The Singleton: // (code) // YourClass::initialize(); // YourClass& yc(YourClass::getInstance()); // // // use yc // // YourClass::destroy(); //optional // (end) template class Singleton : public boost::noncopyable { public: // Function: initialize // Initialize the instance of the singleton, must be done explicitly. static void initialize(); // Function: destroy // Destroy the instance of the singleton, can be done explicitly if order // of destruction matters. Will be done automatically if not done. static void destroy(); // Function: getInstance // Get a reference to the instance of the derived class. static T& getInstance(); protected: virtual ~Singleton()=0; private: static std::auto_ptr instance_; }; // template implementation template Singleton::~Singleton() { } template void Singleton::initialize() { assert(instance_.get() == 0); instance_ = std::auto_ptr(new T); } template void Singleton::destroy() { assert(instance_.get() != 0); instance_.reset(); } template T& Singleton::getInstance() { assert(instance_.get() != 0); return *instance_; } template std::auto_ptr Singleton::instance_(0); } } #endif //PHOTON_UTIL_SINGLETON_HPP