mirror of
https://github.com/0TheSpy/Seaside.git
synced 2025-01-07 10:03:29 +08:00
160 lines
3.1 KiB
C++
160 lines
3.1 KiB
C++
#ifndef BASEHANDLE_H
|
|
#define BASEHANDLE_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
|
|
#include "const.h"
|
|
#include "dbg.h"
|
|
|
|
|
|
class IHandleEntity;
|
|
|
|
|
|
class CBaseHandle
|
|
{
|
|
friend class CBaseEntityList;
|
|
|
|
public:
|
|
|
|
CBaseHandle();
|
|
CBaseHandle(const CBaseHandle& other);
|
|
CBaseHandle(unsigned long value);
|
|
CBaseHandle(int iEntry, int iSerialNumber);
|
|
|
|
void Init(int iEntry, int iSerialNumber);
|
|
void Term();
|
|
|
|
bool IsValid() const;
|
|
|
|
int GetEntryIndex() const;
|
|
int GetSerialNumber() const;
|
|
|
|
int ToInt() const;
|
|
bool operator !=(const CBaseHandle& other) const;
|
|
bool operator ==(const CBaseHandle& other) const;
|
|
bool operator ==(const IHandleEntity* pEnt) const;
|
|
bool operator !=(const IHandleEntity* pEnt) const;
|
|
bool operator <(const CBaseHandle& other) const;
|
|
bool operator <(const IHandleEntity* pEnt) const;
|
|
|
|
const CBaseHandle& operator=(const IHandleEntity* pEntity);
|
|
const CBaseHandle& Set(const IHandleEntity* pEntity);
|
|
|
|
IHandleEntity* Get() const;
|
|
|
|
|
|
protected:
|
|
unsigned long m_Index;
|
|
};
|
|
|
|
|
|
#include "ihandleentity.h"
|
|
|
|
|
|
inline CBaseHandle::CBaseHandle()
|
|
{
|
|
m_Index = INVALID_EHANDLE_INDEX;
|
|
}
|
|
|
|
inline CBaseHandle::CBaseHandle(const CBaseHandle& other)
|
|
{
|
|
m_Index = other.m_Index;
|
|
}
|
|
|
|
inline CBaseHandle::CBaseHandle(unsigned long value)
|
|
{
|
|
m_Index = value;
|
|
}
|
|
|
|
inline CBaseHandle::CBaseHandle(int iEntry, int iSerialNumber)
|
|
{
|
|
Init(iEntry, iSerialNumber);
|
|
}
|
|
|
|
inline void CBaseHandle::Init(int iEntry, int iSerialNumber)
|
|
{
|
|
Assert(iEntry >= 0 && iEntry < NUM_ENT_ENTRIES);
|
|
Assert(iSerialNumber >= 0 && iSerialNumber < (1 << NUM_SERIAL_NUM_BITS));
|
|
|
|
m_Index = iEntry | (iSerialNumber << NUM_ENT_ENTRY_BITS);
|
|
}
|
|
|
|
inline void CBaseHandle::Term()
|
|
{
|
|
m_Index = INVALID_EHANDLE_INDEX;
|
|
}
|
|
|
|
inline bool CBaseHandle::IsValid() const
|
|
{
|
|
return m_Index != INVALID_EHANDLE_INDEX;
|
|
}
|
|
|
|
inline int CBaseHandle::GetEntryIndex() const
|
|
{
|
|
return m_Index & ENT_ENTRY_MASK;
|
|
}
|
|
|
|
inline int CBaseHandle::GetSerialNumber() const
|
|
{
|
|
return m_Index >> NUM_ENT_ENTRY_BITS;
|
|
}
|
|
|
|
inline int CBaseHandle::ToInt() const
|
|
{
|
|
return (int)m_Index;
|
|
}
|
|
|
|
inline bool CBaseHandle::operator !=(const CBaseHandle& other) const
|
|
{
|
|
return m_Index != other.m_Index;
|
|
}
|
|
|
|
inline bool CBaseHandle::operator ==(const CBaseHandle& other) const
|
|
{
|
|
return m_Index == other.m_Index;
|
|
}
|
|
|
|
inline bool CBaseHandle::operator ==(const IHandleEntity* pEnt) const
|
|
{
|
|
return Get() == pEnt;
|
|
}
|
|
|
|
inline bool CBaseHandle::operator !=(const IHandleEntity* pEnt) const
|
|
{
|
|
return Get() != pEnt;
|
|
}
|
|
|
|
inline bool CBaseHandle::operator <(const CBaseHandle& other) const
|
|
{
|
|
return m_Index < other.m_Index;
|
|
}
|
|
|
|
inline bool CBaseHandle::operator <(const IHandleEntity* pEntity) const
|
|
{
|
|
unsigned long otherIndex = (pEntity) ? pEntity->GetRefEHandle().m_Index : INVALID_EHANDLE_INDEX;
|
|
return m_Index < otherIndex;
|
|
}
|
|
|
|
inline const CBaseHandle& CBaseHandle::operator=(const IHandleEntity* pEntity)
|
|
{
|
|
return Set(pEntity);
|
|
}
|
|
|
|
inline const CBaseHandle& CBaseHandle::Set(const IHandleEntity* pEntity)
|
|
{
|
|
if (pEntity)
|
|
{
|
|
*this = pEntity->GetRefEHandle();
|
|
}
|
|
else
|
|
{
|
|
m_Index = INVALID_EHANDLE_INDEX;
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
|
|
#endif |