//========= Copyright © 2008, Valve Corporation, All rights reserved. ============// #ifndef __TOKENSET_H #define __TOKENSET_H #ifdef _WIN32 #pragma once #endif //----------------------------------------------------------------------------- // // This class is a handy way to match a series of values to stings and vice // versa. It should be initalized as static like an array, for example: // // const tokenset_t tokens[] = { // { "token1", 1 }, // { "token2", 2 }, // { "token3", 3 }, // { NULL, -1 } // }; // // Then you can call the operators on it by using: // // int t = tokens->GetToken( s ); // // If s is "token1" it returns 1, etc. Invalid string returns the last NULL // value. GetNameByToken() returns "__UNKNOWN__" when passed a mismatched // token. GetNameByToken() returns szMismatchResult when passed a mismatched // token and a string to return in case of mismatch. // //----------------------------------------------------------------------------- template struct tokenset_t { const char *name; _T token; _T GetToken( const char *s ) const; _T GetTokenI( const char *s ) const; const char *GetNameByToken( _T token ) const; const char *GetNameByToken( _T token, const char *szMismatchResult ) const; }; template inline _T tokenset_t< _T >::GetToken( const char *s ) const { const tokenset_t< _T > *c; for ( c = this; c->name; ++c ) { if ( !s ) { continue; // Loop to the last NULL value } if ( Q_strcmp( s, c->name ) == 0 ) { return c->token; } } return c->token; // c points to the last NULL value } template inline _T tokenset_t< _T >::GetTokenI( const char *s ) const { const tokenset_t< _T > *c; for ( c = this; c->name; ++c ) { if ( !s ) { continue; // Loop to the last NULL value } if ( Q_stricmp( s, c->name ) == 0 ) { return c->token; } } return c->token; // c points to the last NULL value } template inline const char *tokenset_t< _T >::GetNameByToken( _T token ) const { static const char *unknown = "__UNKNOWN__"; const tokenset_t< _T > *c; for ( c = this; c->name; ++c ) { if ( c->token == token ) { return c->name; } } return unknown; } template inline const char *tokenset_t< _T >::GetNameByToken( _T token, char const *szMismatchResult ) const { const tokenset_t< _T > *c; for ( c = this; c->name; ++c ) { if ( c->token == token ) { return c->name; } } return szMismatchResult; } #endif //__TOKENSET_H