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;
|
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
|
* (c) 2004 Chris Danford
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
|||||||
@@ -80,28 +80,15 @@ namespace Enum
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const RString EMPTY_STRING;
|
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
|
#define XToString(X, CNT) \
|
||||||
// avoid initialization order problems when calling XToString.
|
|
||||||
// Use Check##X##ToStringParamType to enforce that.
|
|
||||||
#define XToString(X, CNT) \
|
|
||||||
static void Check##X##ToStringParamType( const char **p ) { } \
|
static void Check##X##ToStringParamType( const char **p ) { } \
|
||||||
|
COMPILE_ASSERT( NUM_##X == ARRAYLEN(X##Names) ); \
|
||||||
const RString& X##ToString( X x ) \
|
const RString& X##ToString( X x ) \
|
||||||
{ \
|
{ \
|
||||||
Check##X##ToStringParamType( X##Names ); \
|
static auto_ptr<RString> as_##X##Name[NUM_##X+2]; \
|
||||||
static auto_ptr<RString> as_##X##Name[NUM_##X]; \
|
return EnumToString( x, NUM_##X, X##Names, as_##X##Name ); \
|
||||||
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]; \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define XToLocalizedString(X) \
|
#define XToLocalizedString(X) \
|
||||||
|
|||||||
Reference in New Issue
Block a user