nlib
Singleton.h
[詳解]
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_SINGLETON_H_
4 #define INCLUDE_NN_NLIB_SINGLETON_H_
5 
6 #include "nn/nlib/Config.h"
7 
8 NLIB_NAMESPACE_BEGIN
9 
10 template <class T>
12  public:
13  static T& Instance() {
14  if (!m_Flag) {
16  nlib_once(&m_OnceFlag, Init);
17  }
18  T* ptr = reinterpret_cast<T*>(&m_Memory[0]);
19  return *ptr;
20  }
21  static T& GetInstance() { return Instance(); }
22 
23  private:
24  static void Init();
25  static int32_t m_Flag;
26  static nlib_onceflag m_OnceFlag;
27  // Memory leak would be mis-detected if dynamically allocated.
28  NLIB_ALIGNAS(8) static unsigned char m_Memory[sizeof(T)];
29 
30  private:
31  Singleton() {}
33 };
34 
35 template <class T>
36 void Singleton<T>::Init() {
37  new (m_Memory) T();
39 }
40 
41 template <class T>
42 nlib_onceflag Singleton<T>::m_OnceFlag = NLIB_ONCE_INIT;
43 template <class T>
44 int32_t Singleton<T>::m_Flag = 0;
45 template <class T>
46 
47 #ifndef NLIB_DOXYGEN
48 #if !defined(NN_PLATFORM_CTR)
49 NLIB_ALIGNAS(8) unsigned char Singleton<T>::m_Memory[sizeof(T)];
50 #else
51 unsigned char Singleton<T>::m_Memory[sizeof(T)];
52 #endif
53 #endif
54 
55 NLIB_NAMESPACE_END
56 
57 #endif // INCLUDE_NN_NLIB_SINGLETON_H_
int32_t nlib_atomic_load32(const int32_t *ptr, int memorder)
アトミックに値をロードします。動作はgccの__atomic_load_n()に準じます。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:126
#define NLIB_ATOMIC_RELEASE
gccの__ATOMIC_RELEASEやC++11のstd::memory_order_releaseに準じます。
errno_t nlib_once(nlib_onceflag *flag, nlib_oncefunc func)
func を高々1回しか実行されないようします。
最初に利用されるときにオブジェクトが初期化されるシングルトンです。
Definition: Singleton.h:11
開発環境別の設定が書かれるファイルです。
#define NLIB_ATOMIC_ACQUIRE
gccの__ATOMIC_ACQUIREやC++11のstd::memory_order_acquireに準じます。
#define NLIB_ALIGNAS(x)
alignas(x)又は同等の定義がされます。
Definition: Config.h:209
#define NLIB_ONCE_INIT
nlib_onceflagを静的に初期化するための値
Definition: Platform.h:768
struct nlib_onceflag_ nlib_onceflag
nlib_onceで利用される構造体
Definition: Platform.h:767
static T & Instance()
T のシングルトンインスタンスを取得します。
Definition: Singleton.h:13
void nlib_atomic_store32(int32_t *ptr, int32_t val, int memorder)
アトミックに値をストアします。動作はgccの__atomic_store_n()に準じます。