Line data Source code
1 : /* Copyright (C) 2019 Wildfire Games.
2 : * This file is part of 0 A.D.
3 : *
4 : * 0 A.D. is free software: you can redistribute it and/or modify
5 : * it under the terms of the GNU General Public License as published by
6 : * the Free Software Foundation, either version 2 of the License, or
7 : * (at your option) any later version.
8 : *
9 : * 0 A.D. is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : * GNU General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU General Public License
15 : * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
16 : */
17 :
18 : #ifndef INCLUDED_SINGLETON
19 : #define INCLUDED_SINGLETON
20 :
21 : #include "lib/debug.h"
22 :
23 : /**
24 : * Template base class for singletons.
25 : *
26 : * Usage:
27 : * class MyClass : public Singleton<MyClass> {};
28 : * MyClass::GetSingleton().MyMethod();
29 : *
30 : * Modified from http://gamedev.net/reference/articles/article1954.asp
31 : */
32 : template<typename T>
33 : class Singleton
34 : {
35 : NONCOPYABLE(Singleton);
36 : public:
37 19 : Singleton()
38 : {
39 19 : ENSURE(!ms_singleton);
40 19 : ms_singleton = static_cast<T*>(this);
41 19 : }
42 :
43 19 : ~Singleton()
44 : {
45 19 : ENSURE(ms_singleton);
46 19 : ms_singleton = nullptr;
47 19 : }
48 :
49 3276 : static T& GetSingleton()
50 : {
51 3276 : ENSURE(ms_singleton);
52 3276 : return *ms_singleton;
53 : }
54 :
55 0 : static T* GetSingletonPtr()
56 : {
57 0 : ENSURE(ms_singleton);
58 0 : return ms_singleton;
59 : }
60 :
61 7265 : static bool IsInitialised()
62 : {
63 7265 : return ms_singleton != nullptr;
64 : }
65 :
66 : private:
67 : static T* ms_singleton;
68 : };
69 :
70 : template <typename T>
71 : T* Singleton<T>::ms_singleton = nullptr;
72 :
73 : #endif // INCLUDED_SINGLETON
|