/* * 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 . * */ /*! \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 namespace MTS { template class Singleton { public: static T* instance(); protected: private: static T* m_pInstance; static AutoPtr m_apLock; // Do Not Allow Use of Any Constructor or Assignment Operator Singleton() { } ~Singleton(); Singleton(const Singleton&); Singleton& operator=(const Singleton&); }; template Singleton::~Singleton() { m_apLock.reset(); delete T; } template T* Singleton::instance() { m_apLock->lock(); if (m_pInstance == NULL) { m_pInstance = new T(); } m_apLock->unlock(); return m_pInstance; } //FIXME: Template Initialization template static AutoPtr Singleton::m_apLock.reset(new Lock()); template static T* Singleton::m_pInstance = NULL; } #endif /* MTS_SINGLETON_H_ */