aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/common')
-rw-r--r--src/libjin/common/singleton.h34
-rw-r--r--src/libjin/common/subsystem.h30
2 files changed, 51 insertions, 13 deletions
diff --git a/src/libjin/common/singleton.h b/src/libjin/common/singleton.h
new file mode 100644
index 0000000..e6326b2
--- /dev/null
+++ b/src/libjin/common/singleton.h
@@ -0,0 +1,34 @@
+#ifndef __JIN_SINGLETON_H
+#define __JIN_SINGLETON_H
+
+namespace jin
+{
+ template<class T>
+ class Singleton
+ {
+ public:
+ static T* get()
+ {
+ if (_instance == nullptr)
+ _instance = new T;
+ return _instance;
+ }
+ static void destroy()
+ {
+ delete _instance;
+ _instance = nullptr;
+ }
+ protected:
+ Singleton() {};
+ virtual ~Singleton() {};
+ private:
+ Singleton(const Singleton&);
+ Singleton& operator = (const Singleton&);
+
+ static T* _instance;
+ };
+
+ template<class T> T* Singleton<T>::_instance = nullptr;
+}
+
+#endif \ No newline at end of file
diff --git a/src/libjin/common/subsystem.h b/src/libjin/common/subsystem.h
index abe509e..4f3c5ab 100644
--- a/src/libjin/common/subsystem.h
+++ b/src/libjin/common/subsystem.h
@@ -1,32 +1,36 @@
#ifndef __JIN_COMMON_SUBSYSTEM_H
#define __JIN_COMMON_SUBSYSTEM_H
+#include "singleton.h"
#include "../utils/macros.h"
namespace jin
{
- class Subsystem
+ template<class System>
+ class Subsystem : public Singleton<System>
{
+ public:
+ struct Setting {};
+ typedef Setting SettingBase;
- public:
+ void init(const SettingBase* setting)
+ {
+ initSystem(setting);
+ }
- struct Setting {};
-
- typedef Subsystem::Setting SettingBase;
-
- virtual bool init(const Setting* setting) = 0;
-
- virtual void quit() = 0;
+ void quit()
+ {
+ quitSystem();
+ destroy();
+ }
protected:
-
Subsystem() {};
virtual ~Subsystem() {};
- virtual onlyonce bool _init(const Setting* setting) = 0;
- virtual onlyonce void _quit() = 0;
-
+ virtual bool initSystem(const Setting* setting) = 0;
+ virtual void quitSystem() = 0;
};
}