/*//=============================================================== << SINGLETON >> PRGM : B4nFter FILE : SINGLETON.HPP DESC : ½Ì±ÛÅÏ ÆÐÅÏ ±¸Çö INIT BUILT DATE : 2006. 02. 18 LAST BUILT DATE : 2007. 06. 19 P.S.> - ¹æ¹ý1 (ÅÛÇø´ Ŭ·¡½º »ç¿ë) °ú ¹æ¹ý2 (¸ÅÅ©·Î ÇÔ¼ö »ç¿ë) µÎ°¡Áö°¡ ÀÖÀ½ - ¹æ¹ý1 °ú ¹æ¹ý2 Áß Çϳª¸¸ »ç¿ëÇØ¾ß ÇÔ - ¹æ¹ý1 »ç¿ë ½Ã °´Ã¼¸¦ Çϳª ¼öµ¿À¸·Î »ý¼ºÇØ¾ß ÇÔ Copyright¨Ï 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 Ŭ·¡½º // PRGM : B4nFter // P.S.> // - ¹æ¹ý1 : ÅÛÇø´ Ŭ·¡½º //*--------------------------------------------------------------- template class CSingleton { private: static Derived* m_pSingleton; protected: CSingleton(); virtual ~CSingleton(); public: inline static Derived& GetInstance(); inline static Derived* GetInstancePtr(); }; /////////////////////////////////////////////////////////////////// // IMPLEMENTATION /////////////////////////////////////////////////////////////////// template Derived* CSingleton::m_pSingleton = NULL; //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CSingleton::CSingleton //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template CSingleton::CSingleton() { size_t nOffset = (size_t)(Derived*) 1 - (size_t)(CSingleton*)(Derived*) 1; m_pSingleton = (Derived*)((size_t)this + nOffset); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CSingleton::~CSingleton //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template CSingleton::~CSingleton() { m_pSingleton = 0; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CSingleton::GetInstance //*--------------------------------------------------------------- // DESC : ½Ì±ÛÅÏÀ¸·Î °ü¸®ÇÏ´Â °´Ã¼ ÂüÁ¶ ¹Ýȯ // PARM : N/A // RETV : °´Ã¼ ÂüÁ¶ // PRGM : B4nFter //*--------------------------------------------------------------- template inline Derived& CSingleton::GetInstance() { return (*m_pSingleton); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CSingleton::GetInstancePtr //*--------------------------------------------------------------- // DESC : ½Ì±ÛÅÏÀ¸·Î °ü¸®ÇÏ´Â °´Ã¼ Æ÷ÀÎÅÍ ¹Ýȯ // PARM : N/A // RETV : °´Ã¼ Æ÷ÀÎÅÍ // PRGM : B4nFter //*--------------------------------------------------------------- template inline Derived* CSingleton::GetInstancePtr() { return (m_pSingleton); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : DECLARE_SINGLETON_CLASS //*--------------------------------------------------------------- // DESC : Singleton ¸ÅÅ©·Î ÇÔ¼ö // PRGM : B4nFter // P.S.> // - ¹æ¹ý2 : ¸ÅÅ©·Î ÇÔ¼ö //*--------------------------------------------------------------- #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 ¸ÅÅ©·Î ÇÔ¼ö (Æ÷ÀÎÅÍ) // PRGM : B4nFter // P.S.> // - ¹æ¹ý3 : ¸ÅÅ©·Î ÇÔ¼ö (Æ÷ÀÎÅÍ) // - ƯÁ¤ Ŭ·¡½º¸¦ »ó¼ÓÇÑ ½Ì±ÛÅÏ °´Ã¼°¡ »ó¼ÓÀÇ ÀÌÁ¡À» Ȱ¿ëÇϱâ À§ÇÔ // - More Effective C++ P199 // - ±âº» Ŭ·¡½º´Â DECLARE_SINGLETON_PTR_CLASS / DEFINE_SINGLETON_PTR_CLASS / INIT_SINGLETON_PTR_CLASS ·Î ½Ì±ÛÅÏ Æ÷ÀÎÅÍ ¼±¾ð // - ÆÄ»ý Ŭ·¡½º´Â INSTANCE_SINGLETON_PTR_CLASS / DEFINE_SINGLETON_CLASS ·Î ½Ì±ÛÅÏ Á¤ÀÇ // - ÆÄ»ýÀÇ ´Ü°è ¸¶´Ù °´Ã¼È­°¡ ÇÊ¿äÇÏ´Ù¸é INSTANCE_SINGLETON_CLASS / DEFINE_SINGLETON_CLASS ´ë½Å ´Ü°èº°·Î °´Ã¼ ¼±¾ðÇØ ÁÜ //*--------------------------------------------------------------- #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 ¸ÅÅ©·Î ÇÔ¼ö (Æ÷ÀÎÅÍ) // PRGM : B4nFter // P.S.> // - ¹æ¹ý4 : ¸ÅÅ©·Î ÇÔ¼ö (Æ÷ÀÎÅÍ) // - ƯÁ¤ Ŭ·¡½º¸¦ »ó¼ÓÇÑ ½Ì±ÛÅÏ °´Ã¼°¡ »ó¼ÓÀÇ ÀÌÁ¡À» Ȱ¿ëÇϸ鼭 °¢ ´Ü°è ¸¶´Ù ½Ì±ÛÅÏ °´Ã¼¸¦ Ȱ¿ëÇϱâ À§ÇÔ // - ±âº» Ŭ·¡½º´Â DECLARE_SINGLETON_PTR_BASE_CLASS / DEFINE_SINGLETON_PTR_BASE_CLASS / INIT_SINGLETON_PTR_CLASS ·Î ½Ì±ÛÅÏ Æ÷ÀÎÅÍ ¼±¾ð // - ÆÄ»ý Ŭ·¡½º´Â DECLARE_SINGLETON_PTR_DERV_CLASS / DEFINE_SINGLETON_PTR_DERV_CLASS / INIT_SINGLETON_PTR_CLASS ·Î ½Ì±ÛÅÏ Æ÷ÀÎÅÍ ¼±¾ð //*--------------------------------------------------------------- #define DECLARE_SINGLETON_PTR_BASE_CLASS(pCLASS) \ protected: \ static pCLASS* m_pSingleton; \ static pCLASS m_Singleton; \ public: \ static pCLASS* GetInstancePtr() { return static_cast(m_pSingleton); } #define DECLARE_SINGLETON_PTR_DERV_CLASS(pCLASS) \ protected: \ static pCLASS m_Singleton; \ public: \ static pCLASS* GetInstancePtr() { return static_cast(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;