MGL(Win32)
読み取り中…
検索中…
一致する文字列を見つけられません
mgl_singleton.h
[詳解]
1// SPDX-License-Identifier: Zlib
2/* ------------------------------------------------------------------------- */
9/* ------------------------------------------------------------------------- */
10
11#ifndef INCGUARD_MGL_SINGLETON_H_1608105970
12#define INCGUARD_MGL_SINGLETON_H_1608105970
13
14#include <cassert>
15#include <mutex>
16
19
20namespace MGL
21{
24{
25public:
27 using FinalizeFunction = void (*)();
28
29 static bool Initialize() noexcept;
30
31 static void Register(FinalizeFunction function) noexcept;
32 static void Finalize() noexcept;
33 static void Unregister(FinalizeFunction function) noexcept;
34
35private:
36 static inline std::list<SingletonFinalizer::FinalizeFunction> _functions; // staticなのでMGL::STL::listは使用できない
37 static inline std::unique_ptr<std::recursive_mutex> _mutex;
38};
39
40
42template<typename T, class... Args>
44{
45public:
46 /* ------------------------------------------------------------------------- */
51 /* ------------------------------------------------------------------------- */
52 static T &CreateInstance(Args... args) noexcept
53 {
54 auto &instance = T::GetInstanceRef();
55
56 if (instance.get() == nullptr)
57 {
58 instance = STL::make_unique<T>(args...);
59 if (instance.get() != nullptr)
60 {
61 SingletonFinalizer::Register(DestroyInstance);
62 }
63 }
64
65 return *(instance.get());
66 }
67
68 /* ------------------------------------------------------------------------- */
73 /* ------------------------------------------------------------------------- */
74 static T &GetInstance() noexcept
75 {
76 auto &instance = T::GetInstanceRef();
77 assert(instance.get());
78 return *(instance.get());
79 }
80
81 /* ------------------------------------------------------------------------- */
85 /* ------------------------------------------------------------------------- */
86 static void DestroyInstance() noexcept
87 {
88 if (HasInstance())
89 {
90 SingletonFinalizer::Unregister(DestroyInstance);
91 T::GetInstanceRef().reset();
92 }
93 }
94
95 /* ------------------------------------------------------------------------- */
101 /* ------------------------------------------------------------------------- */
102 static bool HasInstance() noexcept
103 {
104 return T::GetInstanceRef().get() != nullptr;
105 }
106
107 // コピーとムーブは禁止
108 SharedSingleton(const SharedSingleton &) noexcept = delete;
109 SharedSingleton &operator=(const SharedSingleton &) noexcept = delete;
110 SharedSingleton(SharedSingleton &&) noexcept = delete;
111 SharedSingleton &operator=(SharedSingleton &&) noexcept = delete;
112
113 virtual ~SharedSingleton() noexcept = default;
114
115protected:
116 // 外から作れないようコンストラクタはprotectedに定義
117 SharedSingleton() noexcept = default;
118};
119
120
122template<typename T, class... Args>
124{
125public:
126 /* ------------------------------------------------------------------------- */
131 /* ------------------------------------------------------------------------- */
132 static T &CreateInstance(Args... args) noexcept
133 {
134 if (!HasInstance())
135 {
136 _instance = STL::make_unique<T>(args...);
137 if (HasInstance())
138 {
139 SingletonFinalizer::Register(DestroyInstance);
140 }
141 }
142
143 return *_instance;
144 }
145
146 /* ------------------------------------------------------------------------- */
151 /* ------------------------------------------------------------------------- */
152 static constexpr T &GetInstance() noexcept
153 {
154 assert(_instance);
155 return *_instance;
156 }
157
158 /* ------------------------------------------------------------------------- */
162 /* ------------------------------------------------------------------------- */
163 static void DestroyInstance() noexcept
164 {
165 if (HasInstance())
166 {
167 SingletonFinalizer::Unregister(DestroyInstance);
168 _instance.reset();
169 }
170 }
171
172 /* ------------------------------------------------------------------------- */
178 /* ------------------------------------------------------------------------- */
179 static constexpr bool HasInstance() noexcept
180 {
181 return _instance != nullptr;
182 }
183
184 // コピーとムーブは禁止
185 StaticSingleton(const StaticSingleton &) noexcept = delete;
186 StaticSingleton &operator=(const StaticSingleton &) noexcept = delete;
187 StaticSingleton(StaticSingleton &&) noexcept = delete;
188 StaticSingleton &operator=(StaticSingleton &&) noexcept = delete;
189
190 virtual ~StaticSingleton() noexcept = default;
191
192protected:
193 // 外から作れないようコンストラクタはprotectedに定義
194 StaticSingleton() noexcept = default;
195
196private:
197 static inline STL::unique_ptr<T> _instance = nullptr;
198};
199
200} // namespace MGL
201#endif // INCGUARD_MGL_SINGLETON_H_1608105970
202
203// vim: et ts=4 sw=4 sts=4
シングルトンテンプレート(共有ライブラリ用)
Definition mgl_singleton.h:44
static T & CreateInstance(Args... args) noexcept
インスタンスの生成
Definition mgl_singleton.h:52
static T & GetInstance() noexcept
インスタンスの取得
Definition mgl_singleton.h:74
static bool HasInstance() noexcept
有効なインスタンスを保持しているかを取得
Definition mgl_singleton.h:102
static void DestroyInstance() noexcept
インスタンスの破棄
Definition mgl_singleton.h:86
シングルトン解放クラス
Definition mgl_singleton.h:24
static void Unregister(FinalizeFunction function) noexcept
シングルトンクラスの登録解除
Definition mgl_singleton.cc:78
static void Register(FinalizeFunction function) noexcept
シングルトンクラスの登録
Definition mgl_singleton.cc:43
static void Finalize() noexcept
登録されたシングルトンクラスの解放
Definition mgl_singleton.cc:61
static bool Initialize() noexcept
シングルトン解放クラスの初期化
Definition mgl_singleton.cc:22
void(*)() FinalizeFunction
解放用の関数の型
Definition mgl_singleton.h:27
シングルトンテンプレート(アプリケーションまたは静的リンクライブラリのみ利用可能)
Definition mgl_singleton.h:124
static void DestroyInstance() noexcept
インスタンスの破棄
Definition mgl_singleton.h:163
static constexpr bool HasInstance() noexcept
有効なインスタンスを保持しているかを取得
Definition mgl_singleton.h:179
static constexpr T & GetInstance() noexcept
インスタンスの取得
Definition mgl_singleton.h:152
static T & CreateInstance(Args... args) noexcept
インスタンスの生成
Definition mgl_singleton.h:132
MGL STLコンテナの代替
MGL STLのメモリ関連の代替