25 #ifndef CARMA_UTIL_SINGLETON_H
26 #define CARMA_UTIL_SINGLETON_H
32 #include "carma/util/PthreadMutex.h"
33 #include "carma/util/ScopedPthreadMutexLock.h"
125 template <
class TYPE,
template <
class>
class InstantiationPolicy>
135 template <
class TYPE>
145 template <
class TYPE>
191 template <
class TYPE>
195 template <
class TYPE,
template<
class>
class InstantiationPolicy>
208 typedef enum INSTANCE_STATE {
221 friend class InstantiationPolicy<TYPE>;
230 static TYPE* instancePtr_;
231 static InstanceStateType state_;
237 template <
class TYPE,
template<
class>
class InstantiationPolicy>
250 if (state_ != NO_INSTANCE)
253 +
"::instance() - Invalid Singleton state.");
255 instancePtr_ = InstantiationPolicy<TYPE>::createInstance();
256 state_ = INSTANCE_CREATED;
260 if (state_ != INSTANCE_CREATED)
263 +
"::instance() - Invalid Singleton state.");
265 return *instancePtr_;
268 template <
class TYPE,
template<
class>
class InstantiationPolicy>
271 if (state_ != INSTANCE_CREATED)
274 +
"::instance() - Invalid Singleton state.");
275 InstantiationPolicy<TYPE>::deleteInstance(instancePtr_);
277 state_ = INSTANCE_DESTROYED;
280 template <
class TYPE,
template<
class>
class InstantiationPolicy>
283 template <
class TYPE,
template<
class>
class InstantiationPolicy>
284 Singleton<TYPE, InstantiationPolicy>::~Singleton() {};
286 template <
class TYPE,
template<
class>
class InstantiationPolicy>
287 TYPE* Singleton<TYPE, InstantiationPolicy>::instancePtr_;
289 template <
class TYPE,
template<
class>
class InstantiationPolicy>
290 typename Singleton<TYPE, InstantiationPolicy>::InstanceStateType
291 Singleton<TYPE, InstantiationPolicy>::state_;
296 template <
class TYPE>
297 class CreateWithNewPolicy {
299 static TYPE* createInstance();
300 static void deleteInstance(TYPE * ptr);
303 CreateWithNewPolicy();
304 ~CreateWithNewPolicy();
307 template <
class TYPE>
308 CreateWithNewPolicy<TYPE>::CreateWithNewPolicy() {}
310 template <
class TYPE>
311 CreateWithNewPolicy<TYPE>::~CreateWithNewPolicy() {
315 template <
class TYPE>
316 TYPE* CreateWithNewPolicy<TYPE>::createInstance()
318 static CreateWithNewPolicy doomed;
322 template <
class TYPE>
323 void CreateWithNewPolicy<TYPE>::deleteInstance(TYPE * ptr)
331 template <
class TYPE>
332 class CreateStaticPolicy {
334 static TYPE* createInstance();
335 static void deleteInstance(TYPE * ptr);
338 CreateStaticPolicy();
339 ~CreateStaticPolicy();
343 template <
class TYPE>
344 CreateStaticPolicy<TYPE>::CreateStaticPolicy() {}
346 template <
class TYPE>
347 CreateStaticPolicy<TYPE>::~CreateStaticPolicy() {
351 template <
class TYPE>
352 TYPE* CreateStaticPolicy<TYPE>::createInstance()
354 static CreateStaticPolicy doomed;
355 static TYPE instance;
359 template <
class TYPE>
360 void CreateStaticPolicy<TYPE>::deleteInstance(TYPE * ptr)
368 template <
class TYPE>
369 class CreateWithNewUnmanagedPolicy {
371 static TYPE* createInstance();
372 static void deleteInstance(TYPE * ptr);
375 template <
class TYPE>
376 TYPE* CreateWithNewUnmanagedPolicy<TYPE>::createInstance()
381 template <
class TYPE>
382 void CreateWithNewUnmanagedPolicy<TYPE>::deleteInstance(TYPE * ptr)
::std::string demangleTypeName(const char *mangledName)
Returns a human readable name for the type whose compiler mangled name is passed in.
Singleton creation policy which causes instances to be allocated with new (on the heap)...
static TYPE & instance()
Retrieve a reference to underlying instance.
Thread-safe, templatized Singleton class with policy based creation.
Singleton creation policy which causes instances to be created in function local static memory...
Interface file for the demangling routines.
static void destroyInstance()
Should be called when instance is destroyed.
Singleton creation policy which causes instances to be allocated with new (on the heap) but which pro...
A simple wrapper class that makes use of ::pthread_mutex_t easier in a C++ world. ...