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