Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.
 
 
 
 
 
 

277 lines
6.7 KiB

//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "coerciblevariant_t.h"
#include "entitylist.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
#pragma warning(disable: 4800) // yes, we really do want to coerce ints to bools,
// that's the whole point of this class.
coerciblevariant_t::~coerciblevariant_t()
{
if (szVal)
delete[] szVal;
}
// Note: the constructor and SetXXX() functions are
// almost identical, except that the Sets() have a Void()
// step, because they may need to wipe out a string that's
// been allocated.
coerciblevariant_t::coerciblevariant_t( bool b ) : szVal(NULL)
{
// do the bool, int, and float conversions right now, set the flags
bVal = b;
iVal = b ? 1 : 0;
flVal = b ? 1.0f : 0.0f;
m_bvInitFields = kINIT_BOOLEAN | kINIT_INT | kINIT_FLOAT ;
fieldType = FIELD_BOOLEAN;
}
void coerciblevariant_t::SetBool( bool b )
{
Void();
// do the bool, int, and float conversions right now, set the flags
bVal = b;
iVal = b ? 1 : 0;
flVal = b ? 1.0f : 0.0f;
m_bvInitFields = kINIT_BOOLEAN | kINIT_INT | kINIT_FLOAT ;
fieldType = FIELD_BOOLEAN;
}
coerciblevariant_t::coerciblevariant_t( int i ) : szVal(NULL)
{
// do the bool, int, and float conversions right now, set the flags
bVal = i;
iVal = i;
flVal = i;
m_bvInitFields = kINIT_BOOLEAN | kINIT_INT | kINIT_FLOAT ;
fieldType = FIELD_INTEGER;
}
void coerciblevariant_t::SetInt( int i )
{
Void();
// do the bool, int, and float conversions right now, set the flags
bVal = i;
iVal = i;
flVal = i;
m_bvInitFields = kINIT_BOOLEAN | kINIT_INT | kINIT_FLOAT ;
fieldType = FIELD_INTEGER;
}
coerciblevariant_t::coerciblevariant_t( float f ) : szVal(NULL)
{
// do the bool, int, and float conversions right now, set the flags
bVal = f;
iVal = f;
flVal = f;
m_bvInitFields = kINIT_BOOLEAN | kINIT_INT | kINIT_FLOAT ;
fieldType = FIELD_FLOAT;
}
void coerciblevariant_t::SetFloat( float f )
{
Void();
// do the bool, int, and float conversions right now, set the flags
bVal = f;
iVal = f;
flVal = f;
m_bvInitFields = kINIT_BOOLEAN | kINIT_INT | kINIT_FLOAT ;
fieldType = FIELD_FLOAT;
}
coerciblevariant_t::coerciblevariant_t( const char * str )
{
SetString(str);
}
void coerciblevariant_t::SetString( const char * str )
{
Void();
// make a copy of the string for me.
szVal = new char[DEFAULT_VARIANT_STRING_SIZE];
Q_strncpy( szVal, str, DEFAULT_VARIANT_STRING_SIZE );
m_bvInitFields = kINIT_STRING;
fieldType = FIELD_STRING;
}
coerciblevariant_t::coerciblevariant_t( const EHANDLE &handle )
: eVal(handle), fieldType(FIELD_EHANDLE), m_bvInitFields(kINIT_EHANDLE), szVal(NULL)
{};
coerciblevariant_t::coerciblevariant_t( CBaseEntity *ent )
: eVal(ent), fieldType(FIELD_EHANDLE), m_bvInitFields(kINIT_EHANDLE), szVal(NULL)
{};
void coerciblevariant_t::SetEntity( CBaseEntity *val )
{
Void();
eVal = val;
m_bvInitFields = kINIT_EHANDLE;
fieldType = FIELD_EHANDLE;
}
// Get me as a string
const char * coerciblevariant_t::String( void )
{
if ( (m_bvInitFields & kINIT_STRING) == 0 )
{
// need to initialize the string.
AssertMsg(szVal == NULL, "A variant tried to convert itself to a string when it already was one.");
// convert from the appropriate native type
switch (fieldType)
{
case FIELD_BOOLEAN:
szVal = new char[2];
szVal[0] = bVal ? '1' : '0';
szVal[1] = '\0';
break;
case FIELD_INTEGER:
szVal = new char[24];
Q_snprintf( szVal, 24, "%d", iVal );
break;
case FIELD_FLOAT:
szVal = new char[32];
Q_snprintf( szVal, 32, "%.3f", flVal );
break;
case FIELD_EHANDLE: // entity name, or ""
{
CBaseEntity *ent = eVal.Get();
if (ent)
{
szVal = new char[DEFAULT_VARIANT_STRING_SIZE];
Q_strncpy( szVal, ent->GetEntityName().ToCStr(), DEFAULT_VARIANT_STRING_SIZE );
}
else
{
szVal = new char[1];
szVal[0] = 0;
}
break;
}
case FIELD_STRING:
AssertMsg( false, "Tried to convert a variant from string to string?!" );
break;
default:
AssertMsg1( false, "Tried to convert a variant from unknown field type %d", fieldType );
szVal = new char[1];
szVal[0] = 0;
break;
}
m_bvInitFields |= kINIT_STRING;
}
return szVal;
}
float coerciblevariant_t::ConvertFloat() const
{
// convert from salient native type to a float.
switch (fieldType)
{
case FIELD_STRING:
// try to turn the string into a float
return atof(szVal);
case FIELD_EHANDLE:
AssertMsg(false, "Variant tried to convert from EHANDLE to float?!" );
return eVal.Get() ? 1 : 0;
case FIELD_FLOAT:
case FIELD_INTEGER:
case FIELD_BOOLEAN:
AssertMsg( false, "Can't-happen: coercible variant tried to convert from float to a number, which should already have been done" );
return flVal;
default:
AssertMsg1( false, "Tried to convert a variant from unknown field type %d", fieldType );
return 0;
}
}
int coerciblevariant_t::ConvertInt() const
{
// convert from salient native type to an int.
switch (fieldType)
{
case FIELD_STRING:
// try to turn the string into an int
return atoi(szVal);
case FIELD_EHANDLE:
AssertMsg(false, "Variant tried to convert from EHANDLE to int?!" );
return eVal.Get() ? 1 : 0;
case FIELD_FLOAT:
case FIELD_INTEGER:
case FIELD_BOOLEAN:
AssertMsg( false, "Can't-happen: coercible variant tried to convert from int to a number, which should already have been done" );
return iVal;
default:
AssertMsg1( false, "Tried to convert a variant from unknown field type %d", fieldType );
return 0;
}
}
bool coerciblevariant_t::ConvertBool() const
{
// convert from salient native type to an bool.
switch (fieldType)
{
case FIELD_STRING:
// try to turn the string into an int
return atoi(szVal);
case FIELD_EHANDLE:
return eVal.Get();
case FIELD_FLOAT:
case FIELD_INTEGER:
case FIELD_BOOLEAN:
AssertMsg( false, "Can't-happen: coercible variant tried to convert from int to a number, which should already have been done" );
return iVal;
default:
AssertMsg1( false, "Tried to convert a variant from unknown field type %d", fieldType );
return 0;
}
}
CBaseEntity *coerciblevariant_t::ConvertEntity() const
{
// convert from salient native type to an entity pointer.
switch (fieldType)
{
case FIELD_STRING:
// try to look up the entity by name
return gEntList.FindEntityByName(NULL, szVal);
case FIELD_EHANDLE:
return eVal.Get();
case FIELD_FLOAT:
case FIELD_INTEGER:
case FIELD_BOOLEAN:
AssertMsg( false, "Coercible variant tried to turn a number into an entity, which is just plain wierd." );
return NULL;
default:
AssertMsg1( false, "Tried to convert a variant from unknown field type %d", fieldType );
return NULL;
}
}