Seaside/SpyCustom/sdk/basehandle.h
2021-06-16 18:45:17 +03:00

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