COMPILE_ASSERT XToString table sizes
pull out common XToString code simplify XToString
This commit is contained in:
@@ -31,6 +31,27 @@ int CheckEnum( lua_State *L, LuaReference &table, int iPos, int iInvalid, const
|
||||
return iRet;
|
||||
}
|
||||
|
||||
// szNameArray is of size iMax; pNameCache is of size iMax+2.
|
||||
const RString &EnumToString( int iVal, int iMax, const char **szNameArray, auto_ptr<RString> *pNameCache )
|
||||
{
|
||||
if( unlikely(pNameCache[0].get() == NULL) )
|
||||
{
|
||||
for( int i = 0; i < iMax; ++i )
|
||||
{
|
||||
auto_ptr<RString> ap( new RString( szNameArray[i] ) );
|
||||
pNameCache[i] = ap;
|
||||
}
|
||||
|
||||
auto_ptr<RString> ap( new RString );
|
||||
pNameCache[iMax+1] = ap;
|
||||
}
|
||||
|
||||
// iMax+1 is "Invalid". iMax+0 is the NUM_ size value, which can not be converted
|
||||
// to a string.
|
||||
ASSERT_M( iVal >= 0 && (iVal < iMax || iVal == iMax+1), ssprintf("%i, %i", iVal, iMax) );
|
||||
return *pNameCache[iVal];
|
||||
}
|
||||
|
||||
/*
|
||||
* (c) 2004 Chris Danford
|
||||
* All rights reserved.
|
||||
|
||||
@@ -80,28 +80,15 @@ namespace Enum
|
||||
};
|
||||
|
||||
static const RString EMPTY_STRING;
|
||||
const RString &EnumToString( int iVal, int iMax, const char **szNameArray, auto_ptr<RString> *pNameCache ); // XToString helper
|
||||
|
||||
// TypeName[] must be an array of const char *, not RString, to
|
||||
// avoid initialization order problems when calling XToString.
|
||||
// Use Check##X##ToStringParamType to enforce that.
|
||||
#define XToString(X, CNT) \
|
||||
#define XToString(X, CNT) \
|
||||
static void Check##X##ToStringParamType( const char **p ) { } \
|
||||
COMPILE_ASSERT( NUM_##X == ARRAYLEN(X##Names) ); \
|
||||
const RString& X##ToString( X x ) \
|
||||
{ \
|
||||
Check##X##ToStringParamType( X##Names ); \
|
||||
static auto_ptr<RString> as_##X##Name[NUM_##X]; \
|
||||
if( as_##X##Name[0].get() == NULL ) { \
|
||||
for( unsigned i = 0; i < NUM_##X; ++i ) \
|
||||
{ \
|
||||
auto_ptr<RString> ap( new RString( X##Names[i] ) ); \
|
||||
as_##X##Name[i] = ap; \
|
||||
} \
|
||||
} \
|
||||
ASSERT( NUM_##X == ARRAYLEN(X##Names) ); \
|
||||
if( x == NUM_##X+1 ) \
|
||||
return EMPTY_STRING; \
|
||||
ASSERT( x < NUM_##X ); \
|
||||
return *as_##X##Name[x]; \
|
||||
static auto_ptr<RString> as_##X##Name[NUM_##X+2]; \
|
||||
return EnumToString( x, NUM_##X, X##Names, as_##X##Name ); \
|
||||
}
|
||||
|
||||
#define XToLocalizedString(X) \
|
||||
|
||||
Reference in New Issue
Block a user