DragonNest/Server/ServiceMonitorEx/Source/Singleton.hpp

217 lines
6.8 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< 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;