From b2fc6c70434674d74551c3a6c01ffb3233499312 Mon Sep 17 00:00:00 2001 From: Willem Jan Palenstijn Date: Mon, 1 Jul 2013 22:34:11 +0000 Subject: Update version to 1.3 --- include/astra/Singleton.h | 87 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 include/astra/Singleton.h (limited to 'include/astra/Singleton.h') diff --git a/include/astra/Singleton.h b/include/astra/Singleton.h new file mode 100644 index 0000000..5a494e4 --- /dev/null +++ b/include/astra/Singleton.h @@ -0,0 +1,87 @@ +/* +----------------------------------------------------------------------- +Copyright 2012 iMinds-Vision Lab, University of Antwerp + +Contact: astra@ua.ac.be +Website: http://astra.ua.ac.be + + +This file is part of the +All Scale Tomographic Reconstruction Antwerp Toolbox ("ASTRA Toolbox"). + +The ASTRA Toolbox is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +The ASTRA Toolbox 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with the ASTRA Toolbox. If not, see . + +----------------------------------------------------------------------- +$Id$ +*/ + +#ifndef _INC_ASTRA_SINGLETON +#define _INC_ASTRA_SINGLETON + +#include + +#ifndef _MSC_VER +#include +#endif + +namespace astra { + /** + * This singleton interface class ensures that any of its children can be instatiated only once. This is used by the ObjectFactories. + **/ +template +class Singleton { + + public: + + // constructor + Singleton() { + assert(!m_singleton); + int offset = (uintptr_t)(T*)1 - (uintptr_t)(Singleton*)(T*)1; + m_singleton = (T*)((uintptr_t)this + offset); + }; + + // destructor + virtual ~Singleton() { + assert(m_singleton); + m_singleton = 0; + } + + // get singleton + static T& getSingleton() { + if (!m_singleton) + m_singleton = new T(); + return *m_singleton; + } + static T* getSingletonPtr() { + if (!m_singleton) + m_singleton = new T(); + return m_singleton; + } + + private: + + // the singleton + static T* m_singleton; + +}; + +#define DEFINE_SINGLETON(T) template<> T* Singleton::m_singleton = 0 + +// This is a hack to support statements like +// DEFINE_SINGLETON2(CTemplatedClass); +#define DEFINE_SINGLETON2(A,B) template<> A,B* Singleton::m_singleton = 0 + +} // end namespace + +#endif -- cgit v1.2.3