/* * Copyright (C) 2015 by Multi-Tech Systems * * This file is part of libmts. * * libmts is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * libmts is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libmts. If not, see <http://www.gnu.org/licenses/>. * */ /*! \file MTS_Singleton.h \brief A Documented file. \date 2011-06-20 \author Sean Godinez Details. */ #ifndef _MTS_SINGLETON_H_ #define _MTS_SINGLETON_H_ #include <mts/MTS_Lock.h> namespace MTS { template<class T> class Singleton { public: static T* instance(); protected: private: static T* m_pInstance; static AutoPtr<Lock> m_apLock; // Do Not Allow Use of Any Constructor or Assignment Operator Singleton() { } ~Singleton(); Singleton(const Singleton&); Singleton& operator=(const Singleton&); }; template<class T> Singleton<T>::~Singleton() { m_apLock.reset(); delete T; } template<class T> T* Singleton<T>::instance() { m_apLock->lock(); if (m_pInstance == NULL) { m_pInstance = new T(); } m_apLock->unlock(); return m_pInstance; } //FIXME: Template Initialization template<class T> static AutoPtr<Lock> Singleton<T>::m_apLock.reset(new Lock()); template<class T> static T* Singleton<T>::m_pInstance = NULL; } #endif /* MTS_SINGLETON_H_ */