1 /*****************************************************************************
2  * $LastChangedDate: 2011-04-09 21:58:06 -0400 (Sat, 09 Apr 2011) $
3  * @file
4  * @author  Jim E. Brooks  http://www.palomino3d.org
5  * @brief   Singleton base class.
6  *//*
7  * LEGAL:   COPYRIGHT (C) 2010 JIM E. BROOKS
8  *          THIS SOURCE CODE IS RELEASED UNDER THE TERMS
9  *          OF THE GNU GENERAL PUBLIC LICENSE VERSION 2 (GPL 2).
10  *****************************************************************************/
11 
12 #ifndef BASE_SINGLETON_HH
13 #define BASE_SINGLETON_HH 1
14 
15 namespace base {
16 
17 ////////////////////////////////////////////////////////////////////////////////
18 /// @brief Singleton base class.
19 ///
20 class Singleton
21 {
22 PREVENT_COPYING(Singleton)
23 protected:
Singleton(void)24     Singleton( void ) { }
~Singleton()25     ~Singleton() { }
26 
27 #if COMPILE_THREADS
28 #   define AUTO_LOCK_GET_INSTANCE AutoLock<RushLock> autolock( &msGetInstanceLock )
29 #   define AUTO_LOCK_SINGLETON    AutoLock<FastLock> autolock( &msSingletonLock )
30 #else
31 #   define AUTO_LOCK_GET_INSTANCE
32 #   define AUTO_LOCK_SINGLETON
33 #endif
34 
35 #define DEFINE_GetInstance( CLASS )         \
36     CLASS_METHOD CLASS& GetInstance( void ) \
37     {                                       \
38     AUTO_LOCK_GET_INSTANCE;                 \
39         if ( UX( msInstance == NULL ) )     \
40             msInstance = new CLASS;         \
41         return *msInstance;                 \
42     }
43 
44 #define DECLARE_SINGLETON_CLASS_VARS( CLASS ) \
45     CLASS_VAR CLASS* msInstance;
46 
47 #define DEFINE_SINGLETON_CLASS_VARS( CLASS ) \
48     CLASS* CLASS::msInstance;
49 
50 };
51 
52 } // namespace base
53 
54 #endif // BASE_SINGLETON_HH
55