aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/common/singleton.hpp
blob: f66d6e643cca3274316b1af66e62c936e83c820f (plain)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#ifndef __JE_SINGLETON_H__
#define __JE_SINGLETON_H__

#include "object.h"
#include "exception.h"

namespace JinEngine
{

	///
	/// Singleton base class.
	///
	template<class T>
	class Singleton : public Object
	{
	public:
		///
		/// Get singleton. 
		/// 
		/// @param Singleton instance of class.
		///
		static T* get()
		{
			if (_instance == nullptr)
				_instance = new T;
			return _instance;
		}

		///
		/// Destroy instance of singleton.
		///
		static void destroy()
		{
			delete _instance;
			_instance = nullptr;
		}

	protected:
		///
		/// Singleton constructor.
		///
		Singleton() 
		{
			// Check singleton.
			if (_instance)
				throw Exception("This is a singleton.");
		};

		///
		/// Singleton destructor.
		///
		virtual ~Singleton() {};

		///
		/// Singleton instance.
		///
		static T* _instance;

	private:
		///
		/// Singleton copy constructor.
		///
		/// @param singleton Singleton of class.
		///
		Singleton(const Singleton& singleton);

		///
		/// Singleton assignment.
		///
		/// @param singleton Singleton of class.
		///
		Singleton& operator = (const Singleton& singleton);

	};

	///
	/// Singleton instance.
	///
	template<class T> 
	T* Singleton<T>::_instance = nullptr;

} // namespace JinEngine

#endif // __JE_SINGLETON_H__