diff options
Diffstat (limited to 'include/mts/MTS_Singleton.h')
-rw-r--r-- | include/mts/MTS_Singleton.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/include/mts/MTS_Singleton.h b/include/mts/MTS_Singleton.h new file mode 100644 index 0000000..463d1c0 --- /dev/null +++ b/include/mts/MTS_Singleton.h @@ -0,0 +1,77 @@ +/* + * 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_ */ |