#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