You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
3.9 KiB
177 lines
3.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef BASEHANDLE_H |
|
#define BASEHANDLE_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
|
|
#include "const.h" |
|
#include "tier0/dbg.h" |
|
|
|
|
|
class IHandleEntity; |
|
|
|
|
|
// -------------------------------------------------------------------------------------------------- // |
|
// CBaseHandle. |
|
// -------------------------------------------------------------------------------------------------- // |
|
|
|
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(); |
|
|
|
// Even if this returns true, Get() still can return return a non-null value. |
|
// This just tells if the handle has been initted with any values. |
|
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; |
|
|
|
// Assign a value to the handle. |
|
const CBaseHandle& operator=( const IHandleEntity *pEntity ); |
|
const CBaseHandle& Set( const IHandleEntity *pEntity ); |
|
|
|
// Use this to dereference the handle. |
|
// Note: this is implemented in game code (ehandle.h) |
|
IHandleEntity* Get() const; |
|
|
|
|
|
protected: |
|
// The low NUM_SERIAL_BITS hold the index. If this value is less than MAX_EDICTS, then the entity is networkable. |
|
// The high NUM_SERIAL_NUM_BITS bits are the serial number. |
|
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 // BASEHANDLE_H
|
|
|