15 #include <MelLibType.h>
19 #include <mpl/Type2Type.h>
24 #include <core/Singleton_Singlethread_Policy.h>
53 template <
class T,
bool useSmartPtr,
54 template <
class>
class ThreadingPolicy>
58 static bool isSingletonCreated() {
return mObject != 0; }
64 typename ThreadingPolicy<Tpointer>::VolatileType InstanceType;
72 static void setObject( T* ob ) { mObject = ob; }
75 template <
class T,
bool>
struct GetObjectPtr
77 static T* get( T* p ) {
return p; }
80 template <
class T>
struct GetObjectPtr<T, true>
82 static T* get( std::shared_ptr<T>& p ) {
return p.get(); }
85 template <
class T,
bool,
bool,
template <
class>
class>
88 template <
class T,
template <
class>
class ThreadingPolicy,
89 bool useSmartPtr,
bool isAbstract>
90 class Singleton_Middle
91 :
public Singleton_Base<T, useSmartPtr,
95 typedef ThreadingPolicy<T> TThreadingPolicy;
96 inline static T& getSingleton() {
return *getSingletonPtr(); }
97 inline static T* getSingletonPtr()
99 typename ThreadingPolicy<T>::Lock block;
100 if ( Singleton_Base<T, useSmartPtr, ThreadingPolicy>::mObject ==
103 Singleton_Base<T, useSmartPtr, ThreadingPolicy>::mObject =
104 Singleton<T, isAbstract, useSmartPtr, ThreadingPolicy>::
107 return GetObjectPtr<T, useSmartPtr>::get(
108 Singleton_Base<T, useSmartPtr, ThreadingPolicy>::mObject );
112 template <
class T,
template <
class>
class ThreadingPolicy,
114 class Singleton_Middle<T, ThreadingPolicy, useSmartPtr, true>
115 :
public Singleton_Base<T, useSmartPtr,
119 inline static T& getSingleton()
121 typename ThreadingPolicy<T>::Lock block;
122 return *Singleton_Base<T, useSmartPtr,
123 ThreadingPolicy>::mObject;
125 inline static T* getSingletonPtr()
127 typename ThreadingPolicy<T>::Lock block;
128 return GetObjectPtr<T, useSmartPtr>::get(
129 Singleton_Base<T, useSmartPtr, ThreadingPolicy>::mObject );
135 template <
class T,
bool isAbstract =
true,
bool useSmartPtr =
true,
136 template <
class>
class ThreadingPolicy =
138 class Singleton :
public Singleton_Middle<T, ThreadingPolicy,
139 useSmartPtr, isAbstract>
141 friend class Singleton_Middle<T, ThreadingPolicy, useSmartPtr,
145 static void deleteSingleton()
147 typename ThreadingPolicy<T>::Lock block;
148 ObjectDeleter<T, useSmartPtr>::doDelete(
149 &Singleton_Base<T, useSmartPtr, ThreadingPolicy>::mObject );
163 template <
class U>
static U* createObject(
Type2Type<U> )
167 static void deleteObject( T* obj ) {
delete obj; }
169 template <
class U,
bool>
class ObjectDeleter
173 static void doDelete( U** obj )
176 ThreadingPolicy>::deleteObject( *obj );
181 template <
class U>
class ObjectDeleter<U, true>
185 static void doDelete( std::shared_ptr<U>* obj )
188 if ( obj->getPtr() && ( *obj )->getRefCount() > 1 )
190 throw std::runtime_error(
191 "Singleton::deleteSingleton. Other references to "
199 template <
class T,
bool useSmartPtr,
200 template <
class>
class ThreadingPolicy>
201 typename Singleton_Base<T, useSmartPtr, ThreadingPolicy>::InstanceType
202 Singleton_Base<T, useSmartPtr, ThreadingPolicy>::mObject = 0;
Definition: Singleton_Singlethread_Policy.h:10
Definition: Singleton.h:140
Definition: Callback_Impl.h:11
Definition: Type2Type.h:12