Files
2022-10-26 12:25:11 +08:00

163 lines
3.3 KiB
C++

#pragma once
//
#include <MemoryPoolFactoryV.h>
using namespace util;
//
// <TYPE DEFINITIONs>
//
enum eWISE_OBJECT_INDEX
{
OBJTYPE_EMPTY,
OBJTYPE_DELEGATOR,
OBJTYPE_PASSING_OBJECT,
OBJTYPE_LINKEDLIST,
//OBJTYPE_USERINFO,
OBJTYPE_USER,
OBJTYPE_CHARACTER,
OBJTYPE_USERDELEGATOR,
OBJTYPE_LOGIC_ACTIVE,
OBJTYPE_LOGIC_PASSIVE,
OBJTYPE_SERVER_LOGINFRONT,
OBJTYPE_SERVER_AGENT,
OBJTYPE_SERVER_WORLD,
OBJTYPE_ACCOUNT_INFO,
OBJTYPE_MAPOBJECT_INFO,
OBJTYPE_GAMEZONE,
OBJTYPE_GAMEFIELD,
OBJTYPE_PLAYER,
OBJTYPE_MONSTER,
//
//
//
//
OBJTYPE_MAX
};
enum eWISE_OBJKEY_INDEX
{
OBJKEYTYPE_PLAYERKEY,
OBJKEYTYPE_ZONEKEY,
OBJKEYTYPE_PARTYKEY,
OBJKEYTYPE_MAX,
};
typedef struct sLINKEDLIST_NODE
{
sLINKEDLIST_NODE* next;
sLINKEDLIST_NODE* prev;
PVOID pREF; // 실제 데이터 참조
DWORD dwExtra; // Object별 특별히 사용할 수 있는 필드
} *sLINKEDLIST_NODE_P;
struct sDELEGATOR_NODE
{
};
class PassingObject
{
public: PassingObject() : m_dwSize(0), m_pAllocedPtr(NULL) { }
PassingObject(const PassingObject& rPassingObj)
: m_dwSize(rPassingObj.m_dwSize), m_pAllocedPtr(rPassingObj.m_pAllocedPtr) {}
~PassingObject() {}
inline PVOID GetAllocedPtr() { return m_pAllocedPtr; }
inline DWORD GetAllocedSize() { return m_dwSize; }
inline PVOID Alloc(DWORD dwSize)
{
m_dwSize = dwSize;
m_pAllocedPtr = malloc(m_dwSize);
return m_pAllocedPtr;
}
inline void Free()
{
m_dwSize = 0;
SAFE_DELETE(m_pAllocedPtr);
}
private: DWORD m_dwSize;
PVOID m_pAllocedPtr;
};
//////////////////////////////////////////////////////////////////////////
// 서버모드에 따라 달라질 수 있는 수치
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 PoolRouter<OBJTYPE_MAX> OBJECT_POOL_ROUTER;
//////////////////////////////////////////////////////////////////////////
// <CLASS DEFINITION>
//
class ObjectPoolRouter
{
public:
ObjectPoolRouter();
~ObjectPoolRouter();
public:
static ObjectPoolRouter* Instance();
//////////////////////////////////////////////////////////////////////////
// <OBJECT POOL INTERFACE>
public:
inline PVOID Alloc(eWISE_OBJECT_INDEX eTypeIdx)
{
return m_pPoolRouter->Alloc(eTypeIdx);
}
inline BOOL Free(eWISE_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(eWISE_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:
OBJECT_POOL_ROUTER* m_pPoolRouter;
};