diff options
Diffstat (limited to 'src/Common/SingletonPtr.h')
-rw-r--r-- | src/Common/SingletonPtr.h | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/Common/SingletonPtr.h b/src/Common/SingletonPtr.h index ea4eda1..03d0040 100644 --- a/src/Common/SingletonPtr.h +++ b/src/Common/SingletonPtr.h @@ -21,6 +21,8 @@ #define MAD_COMMON_SINGLETONPTR_H_ #include "Initializable.h" +#include "Configurable.h" +#include "ConfigManager.h" namespace Mad { namespace Common { @@ -32,23 +34,42 @@ class SingletonPtr : public virtual Initializable { protected: virtual void doInit() { - if(ptr) - delete ptr; - ptr = new T(); Initializable *in = dynamic_cast<Initializable*>(ptr); - if(in) - in->init(); + if(in) { + in->initialized = true; + in->doInit(); + } + + Configurable *c = dynamic_cast<Configurable*>(ptr); + if(c) + ConfigManager::get()->registerConfigurable(c); + + if(in) { + initializing = false; + initialized = true; + } } - public: - SingletonPtr() : ptr(0) {} + virtual void doDeinit() { + Configurable *c = dynamic_cast<Configurable*>(ptr); + if(c) + ConfigManager::get()->unregisterConfigurable(c); + + Initializable *in = dynamic_cast<Initializable*>(ptr); + if(in) { + in->doDeinit(); + in->initialized = false; + } - virtual ~SingletonPtr() { delete ptr; + ptr = 0; } + public: + SingletonPtr() : ptr(0) {} + T *get() { if(!ptr) init(); |