217 lines
6.8 KiB
C++
217 lines
6.8 KiB
C++
|
|
/*//===============================================================
|
|||
|
|
|
|||
|
|
<< SINGLETON >>
|
|||
|
|
|
|||
|
|
PRGM : B4nFter
|
|||
|
|
|
|||
|
|
FILE : SINGLETON.HPP
|
|||
|
|
DESC : <EFBFBD>̱<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
INIT BUILT DATE : 2006. 02. 18
|
|||
|
|
LAST BUILT DATE : 2007. 06. 19
|
|||
|
|
|
|||
|
|
P.S.>
|
|||
|
|
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 (<EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 (<EFBFBD><EFBFBD>ũ<EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD>ΰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 <EFBFBD><EFBFBD> <EFBFBD>ϳ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <EFBFBD>ϳ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
|
|||
|
|
|
|||
|
|
*///===============================================================
|
|||
|
|
|
|||
|
|
|
|||
|
|
#pragma once
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// INCLUDE
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
#include "SYSBASEBASE.H"
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// DECLARATION
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : CLASS
|
|||
|
|
// NAME : CSingleton
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : Singleton Ŭ<><C5AC><EFBFBD><EFBFBD>
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
// P.S.>
|
|||
|
|
// - <20><><EFBFBD><EFBFBD>1 : <20><><EFBFBD>ø<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
template<typename Derived>
|
|||
|
|
class CSingleton
|
|||
|
|
{
|
|||
|
|
private:
|
|||
|
|
static Derived* m_pSingleton;
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
CSingleton();
|
|||
|
|
virtual ~CSingleton();
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
inline static Derived& GetInstance();
|
|||
|
|
inline static Derived* GetInstancePtr();
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// IMPLEMENTATION
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
template<typename Derived>
|
|||
|
|
Derived* CSingleton<Derived>::m_pSingleton = NULL;
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CSingleton::CSingleton
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
template<typename Derived>
|
|||
|
|
CSingleton<Derived>::CSingleton()
|
|||
|
|
{
|
|||
|
|
size_t nOffset = (size_t)(Derived*) 1 - (size_t)(CSingleton<Derived>*)(Derived*) 1;
|
|||
|
|
m_pSingleton = (Derived*)((size_t)this + nOffset);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CSingleton::~CSingleton
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
template<typename Derived>
|
|||
|
|
CSingleton<Derived>::~CSingleton()
|
|||
|
|
{
|
|||
|
|
m_pSingleton = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CSingleton::GetInstance
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20>̱<EFBFBD><CCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD> <20><>ȯ
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : <20><>ü <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
template<typename Derived>
|
|||
|
|
inline Derived& CSingleton<Derived>::GetInstance()
|
|||
|
|
{
|
|||
|
|
return (*m_pSingleton);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CSingleton::GetInstancePtr
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20>̱<EFBFBD><CCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȯ
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
template<typename Derived>
|
|||
|
|
inline Derived* CSingleton<Derived>::GetInstancePtr()
|
|||
|
|
{
|
|||
|
|
return (m_pSingleton);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : DECLARE_SINGLETON_CLASS
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : Singleton <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD>
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
// P.S.>
|
|||
|
|
// - <20><><EFBFBD><EFBFBD>2 : <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD>
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
#define DECLARE_SINGLETON_CLASS(pCLASS) \
|
|||
|
|
private: \
|
|||
|
|
static pCLASS m_Singleton; \
|
|||
|
|
public: \
|
|||
|
|
static pCLASS& GetInstance() { return m_Singleton; } \
|
|||
|
|
static pCLASS* GetInstancePtr() { return &m_Singleton; }
|
|||
|
|
|
|||
|
|
#define DEFINE_SINGLETON_CLASS(pCLASS) \
|
|||
|
|
pCLASS pCLASS::m_Singleton;
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : DECLARE_SINGLETON_PTR_CLASS
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : Singleton <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
// P.S.>
|
|||
|
|
// - <20><><EFBFBD><EFBFBD>3 : <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
// - Ư<><C6AF> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̱<EFBFBD><CCB1><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// - More Effective C++ P199
|
|||
|
|
// - <20>⺻ Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DECLARE_SINGLETON_PTR_CLASS / DEFINE_SINGLETON_PTR_CLASS / INIT_SINGLETON_PTR_CLASS <20><> <20>̱<EFBFBD><CCB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// - <20>Ļ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> INSTANCE_SINGLETON_PTR_CLASS / DEFINE_SINGLETON_CLASS <20><> <20>̱<EFBFBD><CCB1><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// - <20>Ļ<EFBFBD><C4BB><EFBFBD> <20>ܰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>üȭ<C3BC><C8AD> <20>ʿ<EFBFBD><CABF>ϴٸ<CFB4> INSTANCE_SINGLETON_CLASS / DEFINE_SINGLETON_CLASS <20><><EFBFBD><EFBFBD> <20>ܰ躰<DCB0><E8BAB0> <20><>ü <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
#define DECLARE_SINGLETON_PTR_CLASS(pCLASS) \
|
|||
|
|
protected: \
|
|||
|
|
static pCLASS* m_pSingleton; \
|
|||
|
|
public: \
|
|||
|
|
static pCLASS* GetInstancePtr() { return m_pSingleton; }
|
|||
|
|
|
|||
|
|
#define INSTANCE_SINGLETON_PTR_CLASS(pCLASS) \
|
|||
|
|
protected: \
|
|||
|
|
static pCLASS m_Singleton;
|
|||
|
|
|
|||
|
|
#define DEFINE_SINGLETON_PTR_CLASS(pCLASS) \
|
|||
|
|
pCLASS* pCLASS::m_pSingleton = NULL;
|
|||
|
|
|
|||
|
|
#define INIT_SINGLETON_PTR_CLASS(pCLASS) \
|
|||
|
|
pCLASS::m_pSingleton = this;
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : DECLARE_SINGLETON_PTR_BASE_CLASS / DECLARE_SINGLETON_PTR_DERV_CLASS
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : Singleton <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
// PRGM : B4nFter
|
|||
|
|
// P.S.>
|
|||
|
|
// - <20><><EFBFBD><EFBFBD>4 : <20><>ũ<EFBFBD><C5A9> <20>Լ<EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
|||
|
|
// - Ư<><C6AF> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̱<EFBFBD><CCB1><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȱ<><C8B0><EFBFBD>ϸ鼭 <20><> <20>ܰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>̱<EFBFBD><CCB1><EFBFBD> <20><>ü<EFBFBD><C3BC> Ȱ<><C8B0><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// - <20>⺻ Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DECLARE_SINGLETON_PTR_BASE_CLASS / DEFINE_SINGLETON_PTR_BASE_CLASS / INIT_SINGLETON_PTR_CLASS <20><> <20>̱<EFBFBD><CCB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// - <20>Ļ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DECLARE_SINGLETON_PTR_DERV_CLASS / DEFINE_SINGLETON_PTR_DERV_CLASS / INIT_SINGLETON_PTR_CLASS <20><> <20>̱<EFBFBD><CCB1><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
#define DECLARE_SINGLETON_PTR_BASE_CLASS(pCLASS) \
|
|||
|
|
protected: \
|
|||
|
|
static pCLASS* m_pSingleton; \
|
|||
|
|
static pCLASS m_Singleton; \
|
|||
|
|
public: \
|
|||
|
|
static pCLASS* GetInstancePtr() { return static_cast<pCLASS*>(m_pSingleton); }
|
|||
|
|
|
|||
|
|
#define DECLARE_SINGLETON_PTR_DERV_CLASS(pCLASS) \
|
|||
|
|
protected: \
|
|||
|
|
static pCLASS m_Singleton; \
|
|||
|
|
public: \
|
|||
|
|
static pCLASS* GetInstancePtr() { return static_cast<pCLASS*>(m_pSingleton); }
|
|||
|
|
|
|||
|
|
#define DEFINE_SINGLETON_PTR_BASE_CLASS(pCLASS) \
|
|||
|
|
pCLASS* pCLASS::m_pSingleton = NULL; \
|
|||
|
|
pCLASS pCLASS::m_Singleton;
|
|||
|
|
|
|||
|
|
#define DEFINE_SINGLETON_PTR_DERV_CLASS(pCLASS) \
|
|||
|
|
pCLASS pCLASS::m_Singleton;
|
|||
|
|
|