COMPILE_ASSERT XToString table sizes

pull out common XToString code
simplify XToString
This commit is contained in:
Glenn Maynard
2006-09-27 04:19:47 +00:00
parent dc37273a02
commit 2baddd84fc
2 changed files with 26 additions and 18 deletions
+21
View File
@@ -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.
+5 -18
View File
@@ -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) \