Files
Sun1602/Server/AgentServer/Function/ObjectPoolRouter.h
T
2022-10-26 12:25:11 +08:00

216 lines
5.2 KiB
C++

#pragma once
//
#include <MemoryPoolFactoryV.h>
#include <ObjKeyGenerator.h>
//
// <TYPE DEFINITIONs>
//
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<sDELEGATOR_NODE> REF_DELEGATOR;
typedef REF_DELEGATOR* REF_DELEGATOR_P;
typedef util::PoolRouter<OBJTYPE_MAX> AGENT_OBJECT_POOL_ROUTER;
//////////////////////////////////////////////////////////////////////////
// <CLASS DEFINITION>
//
class ObjectPoolRouter
{
public:
ObjectPoolRouter();
~ObjectPoolRouter();
public:
static ObjectPoolRouter* Instance();
//////////////////////////////////////////////////////////////////////////
// <OBJECT POOL INTERFACE>
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<typename _TYPENAME_>
inline BOOL Register( DWORD dwIndex )
{
return m_pPoolRouter->Register<_TYPENAME_>( dwIndex );
}
private:
AGENT_OBJECT_POOL_ROUTER* m_pPoolRouter;
};
//////////////////////////////////////////////////////////////////////////
// util::CObjKeyGenerator<>,
// util::CObjKeyGenerator<DWORD>
// 계열 ObjectKey Generator Wrapper
class ObjKeyGender
{
public:
ObjKeyGender();
~ObjKeyGender();
public:
static ObjKeyGender* Instance();
//////////////////////////////////////////////////////////////////////////
// <OBJECT POOL INTERFACE>
public:
inline util::CObjKeyGenerator<DWORD>* AllocObjKeyGenerator( eAGENT_OBJKEY_INDEX eObjKeyIdx )
{
if( OBJKEYTYPE_MAX > eObjKeyIdx )
{
util::CObjKeyGenerator<DWORD>* 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<DWORD>* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx );
if( pKeyGender )
pKeyGender->Create( dwKeyStart, dwKeyEnd );
}
inline DWORD GetKey( eAGENT_OBJKEY_INDEX eObjKeyIdx )
{
util::CObjKeyGenerator<DWORD>* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx );
if( pKeyGender )
return pKeyGender->GetKey();
return (DWORD)0;
}
inline BOOL ReserveKey( eAGENT_OBJKEY_INDEX eObjKeyIdx, DWORD dwKey )
{
util::CObjKeyGenerator<DWORD>* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx );
if( pKeyGender )
return pKeyGender->ReserveKey( dwKey );
return FALSE;
}
inline VOID RestoreKey( eAGENT_OBJKEY_INDEX eObjKeyIdx, DWORD dwKey )
{
util::CObjKeyGenerator<DWORD>* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx );
if( pKeyGender )
pKeyGender->RestoreKey( dwKey );
}
inline BOOL IsEmpty( eAGENT_OBJKEY_INDEX eObjKeyIdx )
{
util::CObjKeyGenerator<DWORD>* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx );
if( pKeyGender )
return pKeyGender->IsEmpty();
return FALSE;
}
inline BOOL IsExistKey( eAGENT_OBJKEY_INDEX eObjKeyIdx, DWORD dwKey )
{
util::CObjKeyGenerator<DWORD>* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx );
if( pKeyGender )
return pKeyGender->IsExistKey( dwKey );
return FALSE;
}
inline size_t GetSize( eAGENT_OBJKEY_INDEX eObjKeyIdx )
{
util::CObjKeyGenerator<DWORD>* pKeyGender = AllocObjKeyGenerator( eObjKeyIdx );
if( pKeyGender )
return pKeyGender->GetSize();
return static_cast<size_t>(-1);
}
private:
util::CObjKeyGenerator<DWORD>* m_pObjKeyRouter[OBJKEYTYPE_MAX];
};