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
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;
|
|
}
|
|
}
|