1/*
2** Windstille - A Sci-Fi Action-Adventure Game
3** Copyright (C) 2009 Ingo Ruhnke <grumbel@gmail.com>
4**
5** This program is free software: you can redistribute it and/or modify
6** it under the terms of the GNU General Public License as published by
7** the Free Software Foundation, either version 3 of the License, or
8** (at your option) any later version.
9**
10** This program is distributed in the hope that it will be useful,
11** but WITHOUT ANY WARRANTY; without even the implied warranty of
12** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13** GNU General Public License for more details.
14**
15** You should have received a copy of the GNU General Public License
16** along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19#ifndef HEADER_SUPERTUX_UTIL_CURRENTON_HPP
20#define HEADER_SUPERTUX_UTIL_CURRENTON_HPP
21
22/**
23 * A 'Currenton' allows access to the currently active instance of a
24 * class via the static current() function. It is kind of like a
25 * singleton, but without handling the object construction itself or
26 * in other words its a glorified global variable that points to the
27 * current instance of a class.
28 */
29template<class C>
30class Currenton
31{
32private:
33 static Currenton<C>* s_current;
34
35protected:
36 Currenton()
37 {
38 // FIXME: temporarly disabled, as Sector() for the main menu,
39 // doesn't get cleaned up before a real Sector() starts
40 // assert(!s_current);
41 s_current = this;
42 }
43
44 virtual ~Currenton()
45 {
46 if (s_current == this)
47 {
48 s_current = nullptr;
49 }
50 }
51
52public:
53 static C* current() { return static_cast<C*>(s_current); }
54};
55
56template<class C>
57Currenton<C>* Currenton<C>::s_current = nullptr;
58
59#endif
60
61/* EOF */
62