ScummVM API documentation
singleton.h
1/* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21
22#ifndef COMMON_SINGLETON_H
23#define COMMON_SINGLETON_H
24
25#include "common/noncopyable.h"
26
27namespace Common {
28
41template<class T>
43private:
44 Singleton(const Singleton&);
45 Singleton &operator=(const Singleton &);
46
54 //template<class T>
55#if defined(__WINS__)
56//FIXME verify if __WINS__ needs this still
57public:
58#endif
59 static T *makeInstance() {
60 return new T();
61 }
62
63 static void destroyInstance() {
64 delete _singleton;
65 _singleton = 0;
66 }
67
68
69public:
70 static bool hasInstance() {
71 return _singleton != 0;
72 }
73
74 static T& instance() {
75 // TODO: We aren't thread safe. For now we ignore it since the
76 // only thing using this singleton template is the config manager,
77 // and that is first instantiated long before any threads.
78 // TODO: We don't leak, but the destruction order is nevertheless
79 // semi-random. If we use multiple singletons, the destruction
80 // order might become an issue. There are various approaches
81 // to solve that problem, but for now this is sufficient
82 if (!_singleton)
83 _singleton = T::makeInstance();
84 return *_singleton;
85 }
86
87 static void destroy() {
88 T::destroyInstance();
89 }
90protected:
91 Singleton() { }
92 virtual ~Singleton() { }
93
94 typedef T SingletonBaseType;
95
96 static T *_singleton;
97};
98
105#define DECLARE_SINGLETON(T) \
106 template<> T *Singleton<T>::_singleton = 0
107
110} // End of namespace Common
111
112#endif
Definition: noncopyable.h:39
Definition: singleton.h:42
Definition: algorithm.h:29