Skip to content

Commit 771eefc

Browse files
committed
vscript: Add basic int64 support
1 parent ee63b45 commit 771eefc

File tree

7 files changed

+435
-19
lines changed

7 files changed

+435
-19
lines changed

public/vscript/variant.h

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ enum ExtendedFieldType_t
4444
FIELD_UTLSTRINGTOKEN,
4545
FIELD_QANGLE,
4646
// dimhotepus: Add FIELD_VECTOR4D support.
47-
FIELD_VECTOR4D
47+
FIELD_VECTOR4D,
48+
// dimhotepus: Add FIELD_INTEGER64 support.
49+
FIELD_INTEGER64,
50+
// dimhotepus: Same name schema as FIELD_UINT64.
51+
FIELD_INT64 = FIELD_INTEGER64
4852
};
4953

5054
DECLARE_FIELD_SIZE( FIELD_UINT64, sizeof(uint64) )
@@ -53,6 +57,8 @@ DECLARE_FIELD_SIZE( FIELD_POSITIVEINTEGER_OR_NULL, sizeof(int) )
5357
DECLARE_FIELD_SIZE( FIELD_UINT, sizeof(uint) )
5458
DECLARE_FIELD_SIZE( FIELD_UTLSTRINGTOKEN, sizeof(uint32) )
5559
DECLARE_FIELD_SIZE( FIELD_QANGLE, sizeof(QAngle) )
60+
DECLARE_FIELD_SIZE( FIELD_VECTOR4D, sizeof(Vector4D) )
61+
DECLARE_FIELD_SIZE( FIELD_INT64, sizeof(int64) )
5662

5763
using VariantDataType_t = int;
5864

@@ -90,7 +96,8 @@ class CVariantBase
9096
CVariantBase() : m_flags( 0 ), m_type( FIELD_VOID ) { m_pVector = 0; }
9197
CVariantBase( int val ) : m_flags( 0 ), m_type( FIELD_INTEGER ) { m_int = val; }
9298
CVariantBase( uint32 val ) : m_flags( 0 ), m_type( FIELD_UINT ) { m_uint = val; }
93-
// CVariantBase( int64 val ) : m_flags( 0 ), m_type( FIELD_INTEGER64 ) { m_int64 = val; }
99+
// dimhotepus: Uncomment int64 support.
100+
CVariantBase( int64 val ) : m_flags( 0 ), m_type( FIELD_INT64 ) { m_int64 = val; }
94101
CVariantBase( uint64 val ) : m_flags( 0 ), m_type( FIELD_UINT64 ) { m_uint64 = val; }
95102
CVariantBase( float val ) : m_flags( 0 ), m_type( FIELD_FLOAT ) { m_float = val; }
96103
CVariantBase( float64 val ) : m_flags( 0 ), m_type( FIELD_FLOAT64 ) { m_float64 = val; }
@@ -114,7 +121,8 @@ class CVariantBase
114121

115122
operator int() const { Assert( m_type == FIELD_INTEGER || m_type == FIELD_FLOAT ); return ( m_type == FIELD_INTEGER ) ? m_int : (int)m_float; }
116123
operator uint() const { Assert( m_type == FIELD_UINT ); return m_uint; }
117-
// operator int64() const { Assert( m_type == FIELD_INTEGER64 ); return m_int64; }
124+
// dimhotepus: Uncomment int64 support.
125+
operator int64() const { Assert( m_type == FIELD_INT64 ); return m_int64; }
118126
operator uint64() const { Assert( m_type == FIELD_UINT64 ); return m_uint64; }
119127
operator float() const { Assert( m_type == FIELD_INTEGER || m_type == FIELD_FLOAT ); return ( m_type == FIELD_FLOAT ) ? m_float : (float)m_int; }
120128
operator float64() const { Assert( m_type == FIELD_FLOAT64 ); return m_float64; }
@@ -134,7 +142,8 @@ class CVariantBase
134142

135143
void operator=( int i ) { Free(); m_type = FIELD_INTEGER; m_int = i; }
136144
void operator=( uint i ) { Free(); m_type = FIELD_UINT; m_uint = i; }
137-
// void operator=( int64 i ) { Free(); m_type = FIELD_INTEGER64; m_int64 = i; }
145+
// dimhotepus: Uncomment int64 support.
146+
void operator=( int64 i ) { Free(); m_type = FIELD_INT64; m_int64 = i; }
138147
void operator=( uint64 i ) { Free(); m_type = FIELD_UINT64; m_uint64 = i; }
139148
void operator=( float f ) { Free(); m_type = FIELD_FLOAT; m_float = f; }
140149
void operator=( float64 f ) { Free(); m_type = FIELD_FLOAT64; m_float64 = f; }
@@ -168,6 +177,9 @@ class CVariantBase
168177
bool AssignTo( float *pDest ) const;
169178
bool AssignTo( uint *pDest ) const;
170179
bool AssignTo( int *pDest ) const;
180+
// dimhotepus: Add strongly-typed {u}int64 assignments.
181+
bool AssignTo( uint64 *pDest ) const;
182+
bool AssignTo( int64 *pDest ) const;
171183
bool AssignTo( bool *pDest ) const;
172184
bool AssignTo( Vector2D *pDest ) const;
173185
bool AssignTo( Vector *pDest ) const;
@@ -237,7 +249,8 @@ template <typename T> struct VariantDeducer_t { enum { FIELD_TYPE = FIELD_TYPEUN
237249

238250
DECLARE_DEDUCE_FIELDTYPE( FIELD_VOID, void );
239251
DECLARE_DEDUCE_FIELDTYPE( FIELD_FLOAT, float );
240-
//DECLARE_DEDUCE_FIELDTYPE( FIELD_INTEGER64, int64 );
252+
// dimhotepus: Uncomment int64 support.
253+
DECLARE_DEDUCE_FIELDTYPE( FIELD_INT64, int64 );
241254
DECLARE_DEDUCE_FIELDTYPE( FIELD_UINT64, uint64 );
242255
DECLARE_DEDUCE_FIELDTYPE( FIELD_FLOAT64, float64 );
243256
DECLARE_DEDUCE_FIELDTYPE( FIELD_CSTRING, const char * );
@@ -306,7 +319,8 @@ inline const char * VariantFieldTypeName( int16 eType )
306319
case FIELD_QANGLE: return "qangle";
307320
case FIELD_INTEGER: return "integer";
308321
case FIELD_UINT: return "unsigned";
309-
// case FIELD_INTEGER64: return "int64";
322+
// dimhotepus: Uncomment int64 support.
323+
case FIELD_INT64: return "int64";
310324
case FIELD_UINT64: return "uint64";
311325
case FIELD_FLOAT64: return "float64";
312326
case FIELD_BOOLEAN: return "boolean";
@@ -816,7 +830,8 @@ inline bool CVariantBase<CValueAllocator>::AssignTo( uint *pDest ) const
816830
switch( m_type )
817831
{
818832
case FIELD_VOID: *pDest = 0; return false;
819-
// case FIELD_INTEGER64: *pDest = (uint)clamp( m_int, UINT_MIN, UINT_MAX ); return true;
833+
// dimhotepus: Uncomment int64 support.
834+
case FIELD_INT64: *pDest = (int)clamp( m_int64, 0LL, (long long)INT_MAX ); return true;
820835
case FIELD_UINT64: *pDest = (uint)clamp( m_uint64, 0ULL/*UINT_MIN*/, (unsigned long long)UINT_MAX ); return true;
821836
case FIELD_BOOLEAN: *pDest = m_bool; return true;
822837
case FIELD_INTEGER: if ( m_int < 0 ) return false; *pDest = clamp( (unsigned)m_int, 0U, UINT_MAX ); return true;
@@ -827,6 +842,42 @@ inline bool CVariantBase<CValueAllocator>::AssignTo( uint *pDest ) const
827842
}
828843
}
829844

845+
template< class CValueAllocator >
846+
inline bool CVariantBase<CValueAllocator>::AssignTo( int64 *pDest ) const
847+
{
848+
switch( m_type )
849+
{
850+
case FIELD_VOID: *pDest = 0; return false;
851+
case FIELD_INTEGER: *pDest = m_int; return true;
852+
case FIELD_UINT: *pDest = m_uint; return true;
853+
case FIELD_FLOAT: *pDest = m_float; return true;
854+
case FIELD_BOOLEAN: *pDest = m_bool; return true;
855+
case FIELD_CSTRING: *pDest = atoi( m_pszString ); return true;
856+
case FIELD_UINT64: *pDest = (int64)min( m_uint64, (uint64)LLONG_MAX ); return true;
857+
case FIELD_INT64: *pDest = m_int64; return true;
858+
default:
859+
Warning( "No conversion from %s to int now\n", VariantFieldTypeName( m_type ) );
860+
return false;
861+
}
862+
}
863+
864+
template< class CValueAllocator >
865+
inline bool CVariantBase<CValueAllocator>::AssignTo( uint64 *pDest ) const
866+
{
867+
switch( m_type )
868+
{
869+
case FIELD_VOID: *pDest = 0; return false; return true;
870+
case FIELD_BOOLEAN: *pDest = m_bool; return true;
871+
case FIELD_INTEGER: if ( m_int < 0 ) return false; *pDest = clamp( (unsigned)m_int, 0U, UINT_MAX ); return true;
872+
case FIELD_UINT: *pDest = m_uint; return true;
873+
case FIELD_UINT64: *pDest = m_uint64; return true;
874+
case FIELD_INT64: if ( m_int64 < 0) return false; *pDest = clamp( (uint64)m_int64, 0ULL, ULLONG_MAX ); return true;
875+
default:
876+
Warning( "No conversion from %s to int now\n", VariantFieldTypeName( m_type ) );
877+
return false;
878+
}
879+
}
880+
830881
template< class CValueAllocator >
831882
inline bool CVariantBase<CValueAllocator>::AssignTo( bool *pDest ) const
832883
{
@@ -981,6 +1032,9 @@ inline bool operator ==( const CVariantBase<CValueAllocator1> & v1, const CVaria
9811032
case FIELD_CHARACTER: { return v1.m_char == v2.m_char; }
9821033
case FIELD_BOOLEAN: { return v1.m_bool == v2.m_bool; }
9831034
case FIELD_HSCRIPT: { return v1.m_hScript == v2.m_hScript; }
1035+
// dimhotepus: Add {u}int64 == support.
1036+
case FIELD_UINT64: { return v1.m_uint64 == v2.m_uint64; }
1037+
case FIELD_INT64: { return v1.m_int64 == v2.m_int64; }
9841038
case FIELD_UTLSTRINGTOKEN: { return v1.m_utlStringToken == v2.m_utlStringToken; }
9851039
}
9861040

0 commit comments

Comments
 (0)