00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef FIFE_SINGLETON_H
00023 #define FIFE_SINGLETON_H
00024
00025 #define SINGLEFRIEND(classname) friend class FIFE::StaticSingleton<classname>; classname(); virtual ~classname();
00026
00027
00028 #include <cassert>
00029
00030
00031
00032
00033
00034
00035
00036 #include "fifeclass.h"
00037
00038 namespace FIFE {
00039
00044 template <typename T> class StaticSingleton {
00045 public:
00046
00047 static T* instance() {
00048 static T inst;
00049 return &inst;
00050 }
00051
00052 protected:
00053
00054 StaticSingleton() {
00055 }
00056
00057 virtual ~StaticSingleton() {
00058 }
00059
00060 private:
00061 StaticSingleton(const StaticSingleton<T>&) {}
00062 StaticSingleton<T>& operator=(const StaticSingleton<T>&) {
00063 return this;
00064 }
00065
00066 };
00067
00082 template <typename T> class DynamicSingleton {
00083 public:
00084 static T* instance() {
00085 assert(m_instance);
00086 return m_instance;
00087 }
00088
00089 DynamicSingleton() {
00090 assert(!m_instance);
00091 m_instance = static_cast<T*>(this);
00092 }
00093
00094 virtual ~DynamicSingleton() {
00095 m_instance = 0;
00096 }
00097
00098 private:
00099 static T* m_instance;
00100
00101 DynamicSingleton(const DynamicSingleton<T>&) {};
00102 DynamicSingleton<T&> operator=(const DynamicSingleton<T>&) {};
00103
00104 };
00105
00106 template <typename T> T* DynamicSingleton<T>::m_instance = 0;
00107
00108 }
00109
00110 #endif