#pragma once // #include #include // // // enum eAGENT_OBJECT_INDEX { OBJTYPE_EMPTY, OBJTYPE_DELEGATOR, //OBJTYPE_LINKEDLIST, //OBJTYPE_USERINFO, OBJTYPE_USER, OBJTYPE_TEMPUSER, OBJTYPE_USERDELEGATOR, // // // // OBJTYPE_MAX }; enum eAGENT_OBJKEY_INDEX { OBJKEYTYPE_PLAYERKEY, OBJKEYTYPE_ZONEKEY, OBJKEYTYPE_PARTYKEY, OBJKEYTYPE_PORTALKEY, //_NA_20110630_BATTLE_ZONE_RENEWAL OBJKEYTYPE_PARTYROOMKEY, // _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND OBJKEYTYPE_BATTLE_GROUND_ROOM_KEY, #ifdef _NA_006088_20120910_CHAOS_ZONE_FREE_PVP OBJKEYTYPE_FREE_PVP_ROOM_KEY, #endif // _NA_006088_20120910_CHAOS_ZONE_FREE_PVP OBJKEYTYPE_MAX, }; typedef struct sLINKEDLIST_NODE { sLINKEDLIST_NODE* next; sLINKEDLIST_NODE* prev; PVOID pREF; // ½ÇÁ¦ µ¥ÀÌÅÍ ÂüÁ¶ DWORD dwExtra; // Objectº° Ưº°È÷ »ç¿ëÇÒ ¼ö ÀÖ´Â Çʵå } *sLINKEDLIST_NODE_P; struct sDELEGATOR_NODE { }; ////////////////////////////////////////////////////////////////////////// // ¼­¹ö¸ðµå¿¡ µû¶ó ´Þ¶óÁú ¼ö ÀÖ´Â ¼öÄ¡ struct sPOOL_SIZE_INFO { DWORD dwUserPoolBase; DWORD dwUserPoolExtend; DWORD dwTempUserPoolBase; DWORD dwTempUserPoolExtend; }; typedef Delegator REF_DELEGATOR; typedef REF_DELEGATOR* REF_DELEGATOR_P; typedef util::PoolRouter AGENT_OBJECT_POOL_ROUTER; ////////////////////////////////////////////////////////////////////////// // // class ObjectPoolRouter { public: ObjectPoolRouter(); ~ObjectPoolRouter(); public: static ObjectPoolRouter* Instance(); ////////////////////////////////////////////////////////////////////////// // public: inline PVOID Alloc( eAGENT_OBJECT_INDEX eTypeIdx ) { return m_pPoolRouter->Alloc( eTypeIdx ); } inline BOOL Free( eAGENT_OBJECT_INDEX eTypeIdx, PVOID pInstance ) { return m_pPoolRouter->Free( eTypeIdx, pInstance ); } //inline sLINKEDLIST_NODE_P AllocList() //{ // return (sLINKEDLIST_NODE_P)m_pPoolRouter->Alloc( OBJTYPE_LINKEDLIST ); //} //inline BOOL FreeList( sLINKEDLIST_NODE_P pInst ) //{ // return m_pPoolRouter->Free( OBJTYPE_LINKEDLIST, pInst ); //} inline REF_DELEGATOR_P AllocToken() { return (REF_DELEGATOR_P)m_pPoolRouter->Alloc( OBJTYPE_DELEGATOR ); } inline BOOL FreeToken( REF_DELEGATOR_P pInst ) { return m_pPoolRouter->Free( OBJTYPE_DELEGATOR, pInst ); } public: BOOL InitializeByPoolInfo( sPOOL_SIZE_INFO* pSizeInfo ); inline VOID Initialize( eAGENT_OBJECT_INDEX eTypeIdx, DWORD dwPoolBasicSize, DWORD dwPoolExtendSize = 0 ) { m_pPoolRouter->Initialize( (DWORD)eTypeIdx, dwPoolBasicSize, dwPoolExtendSize ); } template inline BOOL Register( DWORD dwIndex ) { return m_pPoolRouter->Register<_TYPENAME_>( dwIndex ); } private: AGENT_OBJECT_POOL_ROUTER* m_pPoolRouter; }; ////////////////////////////////////////////////////////////////////////// // util::CObjKeyGenerator<>, // util::CObjKeyGenerator // °è¿­ ObjectKey Generator Wrapper class ObjKeyGender { public: ObjKeyGender(); ~ObjKeyGender(); public: static ObjKeyGender* Instance(); ////////////////////////////////////////////////////////////////////////// // public: inline util::CObjKeyGenerator* AllocObjKeyGenerator( eAGENT_OBJKEY_INDEX eObjKeyIdx ) { if( OBJKEYTYPE_MAX > eObjKeyIdx ) { util::CObjKeyGenerator* pKeyGender = m_pObjKeyRouter[eObjKeyIdx]; return pKeyGender;; } ASSERT( !"À߸øµÈ Object Key Index·Î Äõ¸®¸¦ ¼öÇà" ); return NULL; } inline VOID Create( eAGENT_OBJKEY_INDEX eObjKeyIdx, DWORD dwKeyStart, DWORD dwKeyEnd ) { util::CObjKeyGenerator* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx ); if( pKeyGender ) pKeyGender->Create( dwKeyStart, dwKeyEnd ); } inline DWORD GetKey( eAGENT_OBJKEY_INDEX eObjKeyIdx ) { util::CObjKeyGenerator* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx ); if( pKeyGender ) return pKeyGender->GetKey(); return (DWORD)0; } inline BOOL ReserveKey( eAGENT_OBJKEY_INDEX eObjKeyIdx, DWORD dwKey ) { util::CObjKeyGenerator* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx ); if( pKeyGender ) return pKeyGender->ReserveKey( dwKey ); return FALSE; } inline VOID RestoreKey( eAGENT_OBJKEY_INDEX eObjKeyIdx, DWORD dwKey ) { util::CObjKeyGenerator* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx ); if( pKeyGender ) pKeyGender->RestoreKey( dwKey ); } inline BOOL IsEmpty( eAGENT_OBJKEY_INDEX eObjKeyIdx ) { util::CObjKeyGenerator* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx ); if( pKeyGender ) return pKeyGender->IsEmpty(); return FALSE; } inline BOOL IsExistKey( eAGENT_OBJKEY_INDEX eObjKeyIdx, DWORD dwKey ) { util::CObjKeyGenerator* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx ); if( pKeyGender ) return pKeyGender->IsExistKey( dwKey ); return FALSE; } inline size_t GetSize( eAGENT_OBJKEY_INDEX eObjKeyIdx ) { util::CObjKeyGenerator* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx ); if( pKeyGender ) return pKeyGender->GetSize(); return static_cast(-1); } private: util::CObjKeyGenerator* m_pObjKeyRouter[OBJKEYTYPE_MAX]; };