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  */
29 template<class C>
30 class Currenton
31 {
32 private:
33   static Currenton<C>* s_current;
34 
35 protected:
Currenton()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 
~Currenton()44   virtual ~Currenton()
45   {
46     if (s_current == this)
47     {
48       s_current = nullptr;
49     }
50   }
51 
52 public:
current()53   static C* current() { return static_cast<C*>(s_current); }
54 };
55 
56 template<class C>
57 Currenton<C>* Currenton<C>::s_current = nullptr;
58 
59 #endif
60 
61 /* EOF */
62