aboutsummaryrefslogtreecommitdiffstats
path: root/src/leeds/base/singletonManager.h
blob: 833e178bd03f83e10f3d630985dbcb27514ea19f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#pragma once

#include "common.h"

namespace base
{

class cSingletonBase
{
	friend class cSingletonManager;

	cSingletonBase* next;

public:
	virtual ~cSingletonBase() {}
};

template<typename T>
class cSingleton : public cSingletonBase
{
	static T* mspInstance;
	static void cSingleton<T>::CreateInstance()
	{
		mspInstance = new T();
		SingletonManager().Add(mspInstance);
	}

public:
	static T* Instance()
	{
		if (!mspInstance)
			CreateInstance();
		return mspInstance;
	}

	~cSingleton<T>()
	{
		mspInstance = nil;
	}
};

class cSingletonManager
{
	cSingletonBase* head;
	cSingletonBase* tail;

public:
	cSingletonManager() :
		head(nil),
		tail(nil)
	{}

	void Add(cSingletonBase*);
	void Purge();
	~cSingletonManager();
};

cSingletonManager& SingletonManager();

}