@@ -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
5054DECLARE_FIELD_SIZE ( FIELD_UINT64, sizeof (uint64) )
@@ -53,6 +57,8 @@ DECLARE_FIELD_SIZE( FIELD_POSITIVEINTEGER_OR_NULL, sizeof(int) )
5357DECLARE_FIELD_SIZE( FIELD_UINT, sizeof (uint) )
5458DECLARE_FIELD_SIZE( FIELD_UTLSTRINGTOKEN, sizeof (uint32) )
5559DECLARE_FIELD_SIZE( FIELD_QANGLE, sizeof (QAngle) )
60+ DECLARE_FIELD_SIZE( FIELD_VECTOR4D, sizeof (Vector4D) )
61+ DECLARE_FIELD_SIZE( FIELD_INT64, sizeof (int64) )
5662
5763using 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
238250DECLARE_DEDUCE_FIELDTYPE ( FIELD_VOID, void );
239251DECLARE_DEDUCE_FIELDTYPE ( FIELD_FLOAT, float );
240- // DECLARE_DEDUCE_FIELDTYPE( FIELD_INTEGER64, int64 );
252+ // dimhotepus: Uncomment int64 support.
253+ DECLARE_DEDUCE_FIELDTYPE ( FIELD_INT64, int64 );
241254DECLARE_DEDUCE_FIELDTYPE ( FIELD_UINT64, uint64 );
242255DECLARE_DEDUCE_FIELDTYPE ( FIELD_FLOAT64, float64 );
243256DECLARE_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+
830881template < class CValueAllocator >
831882inline 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