Renamed some constants and pp_map_gen.py.

This commit is contained in:
Anton Bachin 2015-05-24 10:59:00 -05:00
parent e784f0c860
commit 1ad787f94a
2 changed files with 73 additions and 74 deletions

138
enum.h
View File

@ -395,7 +395,7 @@ inline void _trim_names(const char * const *raw_names,
namespace _enum { \ namespace _enum { \
namespace _data_ ## Enum { \ namespace _data_ ## Enum { \
\ \
GenerateSwitchType(Integral, __VA_ARGS__); \ GenerateSwitchType(Integral, __VA_ARGS__) \
\ \
} \ } \
} \ } \
@ -621,37 +621,35 @@ _ENUM_CONSTEXPR inline bool operator >=(const Enum &a, const Enum &b) \
// C++98, C++11 // C++98, C++11
#define _ENUM_SET_UNDERLYING_TYPE_NO_OP(Integral) #define _ENUM_CXX98_UNDERLYING_TYPE(Integral)
// C++11 // C++11
#define _ENUM_SET_UNDERLYING_TYPE_IMPLEMENTED(Integral) \ #define _ENUM_CXX11_UNDERLYING_TYPE(Integral) \
: Integral : Integral
// C++98, C++11 // C++98, C++11
#define _ENUM_DISABLE_DEFAULT_BY_PRIVATE(Type) \ #define _ENUM_CXX98_NO_DEFAULT_CONSTRUCTOR(Type) \
private: Type() { }
// C++11 // C++11
#define _ENUM_DISABLE_DEFAULT_BY_DELETE(Type) \ #define _ENUM_CXX11_NO_DEFAULT_CONSTRUCTOR(Type) \
Type() = delete;
// C++98, C++11 // C++98, C++11
#define _ENUM_SWITCH_TYPE_IS_REGULAR_ENUM(Type) \ #define _ENUM_REGULAR_ENUM_SWITCH_TYPE(Type) \
_enumerated _enumerated
// C++11 // C++11
#define _ENUM_SWITCH_TYPE_IS_ENUM_CLASS(Type) \ #define _ENUM_ENUM_CLASS_SWITCH_TYPE(Type) \
_ENUM_NS(Type)::EnumClassForSwitchStatements _ENUM_NS(Type)::EnumClassForSwitchStatements
// C++98, C++11 // C++98, C++11
#define _ENUM_GENERATE_SWITCH_TYPE_REGULAR_ENUM(Integral, ...) #define _ENUM_REGULAR_ENUM_SWITCH_TYPE_GENERATE(Integral, ...)
// C++11 // C++11
#define _ENUM_GENERATE_SWITCH_TYPE_ENUM_CLASS(Integral, ...) \ #define _ENUM_ENUM_CLASS_SWITCH_TYPE_GENERATE(Integral, ...) \
enum class EnumClassForSwitchStatements : Integral { __VA_ARGS__ } enum class EnumClassForSwitchStatements : Integral { __VA_ARGS__ };
// C++98 // C++98
#define _ENUM_GENERATE_STRINGS_PREPARE_FOR_RUNTIME_WRAPPED(Enum, ...) \ #define _ENUM_CXX98_TRIM_STRINGS_ARRAYS(Enum, ...) \
inline const char** raw_names() \ inline const char** raw_names() \
{ \ { \
static const char *value[] = { _ENUM_STRINGIZE(__VA_ARGS__) }; \ static const char *value[] = { _ENUM_STRINGIZE(__VA_ARGS__) }; \
@ -671,7 +669,7 @@ _ENUM_CONSTEXPR inline bool operator >=(const Enum &a, const Enum &b) \
} }
// C++11 fast version // C++11 fast version
#define _ENUM_GENERATE_STRINGS_PREPARE_FOR_RUNTIME_CONSTEXPR(Enum, ...) \ #define _ENUM_CXX11_PARTIAL_CONSTEXPR_TRIM_STRINGS_ARRAYS(Enum, ...) \
constexpr const char *the_raw_names[] = \ constexpr const char *the_raw_names[] = \
{ _ENUM_STRINGIZE(__VA_ARGS__) }; \ { _ENUM_STRINGIZE(__VA_ARGS__) }; \
\ \
@ -693,7 +691,7 @@ _ENUM_CONSTEXPR inline bool operator >=(const Enum &a, const Enum &b) \
} }
// C++11 slow all-constexpr version // C++11 slow all-constexpr version
#define _ENUM_GENERATE_STRINGS_COMPILE_TIME(Enum, ...) \ #define _ENUM_CXX11_FULL_CONSTEXPR_TRIM_STRINGS_ARRAYS(Enum, ...) \
_ENUM_TRIM_STRINGS(__VA_ARGS__) \ _ENUM_TRIM_STRINGS(__VA_ARGS__) \
\ \
constexpr const char * const the_name_array[] = \ constexpr const char * const the_name_array[] = \
@ -710,21 +708,21 @@ _ENUM_CONSTEXPR inline bool operator >=(const Enum &a, const Enum &b) \
} }
// C++98, C++11 fast version // C++98, C++11 fast version
#define _ENUM_TO_STRING_NOT_CONSTEXPR #define _ENUM_NO_CONSTEXPR_TO_STRING_KEYWORD
// C++11 slow all-constexpr version // C++11 slow all-constexpr version
#define _ENUM_TO_STRING_CONSTEXPR \ #define _ENUM_CONSTEXPR_TO_STRING_KEYWORD \
constexpr constexpr
// C++98, C++11 fast version // C++98, C++11 fast version
#define _ENUM_DECLARE_INITIALIZE \ #define _ENUM_DO_DECLARE_INITIALIZE \
static int initialize(); static int initialize();
// C++11 slow all-constexpr version // C++11 slow all-constexpr version
#define _ENUM_INITIALIZE_DECLARATION_NOT_NEEDED #define _ENUM_DO_NOT_DECLARE_INITIALIZE
// C++98, C++11 fast version // C++98, C++11 fast version
#define _ENUM_DEFINE_INITIALIZE(Enum) \ #define _ENUM_DO_DEFINE_INITIALIZE(Enum) \
inline int Enum::initialize() \ inline int Enum::initialize() \
{ \ { \
if (_ENUM_NS(Enum)::initialized()) \ if (_ENUM_NS(Enum)::initialized()) \
@ -739,28 +737,28 @@ _ENUM_CONSTEXPR inline bool operator >=(const Enum &a, const Enum &b) \
} }
// C++11 slow all-constexpr version // C++11 slow all-constexpr version
#define _ENUM_DEFINE_INITIALIZE_NOT_NEEDED(Enum) #define _ENUM_DO_NOT_DEFINE_INITIALIZE(Enum)
// C++98, C++11 fast version // C++98, C++11 fast version
#define _ENUM_CALL_INITIALIZE(value) \ #define _ENUM_DO_CALL_INITIALIZE(value) \
_enum::continue_with(initialize(), value) _enum::continue_with(initialize(), value)
// C++11 slow all-constexpr version // C++11 slow all-constexpr version
#define _ENUM_CALL_INITIALIZE_IS_NO_OP(value) \ #define _ENUM_DO_NOT_CALL_INITIALIZE(value) \
value value
#ifdef BETTER_ENUMS_FORCE_STRICT_CONVERSION #ifdef BETTER_ENUMS_FORCE_STRICT_CONVERSION
# define _ENUM_DEFAULT_SWITCH_TYPE \ # define _ENUM_DEFAULT_SWITCH_TYPE \
_ENUM_SWITCH_TYPE_IS_ENUM_CLASS _ENUM_ENUM_CLASS_SWITCH_TYPE
# define _ENUM_DEFAULT_GENERATE_SWITCH_TYPE \ # define _ENUM_DEFAULT_SWITCH_TYPE_GENERATE \
_ENUM_GENERATE_SWITCH_TYPE_ENUM_CLASS _ENUM_ENUM_CLASS_SWITCH_TYPE_GENERATE
#else #else
# define _ENUM_DEFAULT_SWITCH_TYPE \ # define _ENUM_DEFAULT_SWITCH_TYPE \
_ENUM_SWITCH_TYPE_IS_REGULAR_ENUM _ENUM_REGULAR_ENUM_SWITCH_TYPE
# define _ENUM_DEFAULT_GENERATE_SWITCH_TYPE \ # define _ENUM_DEFAULT_SWITCH_TYPE_GENERATE \
_ENUM_GENERATE_SWITCH_TYPE_REGULAR_ENUM _ENUM_REGULAR_ENUM_SWITCH_TYPE_GENERATE
#endif #endif
@ -768,65 +766,65 @@ _ENUM_CONSTEXPR inline bool operator >=(const Enum &a, const Enum &b) \
#ifdef _ENUM_HAVE_CONSTEXPR #ifdef _ENUM_HAVE_CONSTEXPR
#ifdef BETTER_ENUMS_FORCE_CONSTEXPR_TO_STRING #ifdef BETTER_ENUMS_FORCE_CONSTEXPR_TO_STRING
# define _ENUM_DEFAULT_CONSTEXPR_TO_STRING \ # define _ENUM_DEFAULT_TRIM_STRINGS_ARRAYS \
_ENUM_GENERATE_STRINGS_COMPILE_TIME _ENUM_CXX11_FULL_CONSTEXPR_TRIM_STRINGS_ARRAYS
# define _ENUM_DEFAULT_TO_STRING_CONSTEXPR \ # define _ENUM_DEFAULT_TO_STRING_KEYWORD \
_ENUM_TO_STRING_CONSTEXPR _ENUM_CONSTEXPR_TO_STRING_KEYWORD
# define _ENUM_DEFAULT_INITIALIZE_DECLARATION \ # define _ENUM_DEFAULT_DECLARE_INITIALIZE \
_ENUM_INITIALIZE_DECLARATION_NOT_NEEDED _ENUM_DO_NOT_DECLARE_INITIALIZE
# define _ENUM_DEFAULT_INITIALIZE_DEFINITION \ # define _ENUM_DEFAULT_DEFINE_INITIALIZE \
_ENUM_DEFINE_INITIALIZE_NOT_NEEDED _ENUM_DO_NOT_DEFINE_INITIALIZE
# define _ENUM_DEFAULT_CALL_INITIALIZE \ # define _ENUM_DEFAULT_CALL_INITIALIZE \
_ENUM_CALL_INITIALIZE_IS_NO_OP _ENUM_DO_NOT_CALL_INITIALIZE
#else #else
# define _ENUM_DEFAULT_CONSTEXPR_TO_STRING \ # define _ENUM_DEFAULT_TRIM_STRINGS_ARRAYS \
_ENUM_GENERATE_STRINGS_PREPARE_FOR_RUNTIME_CONSTEXPR _ENUM_CXX11_PARTIAL_CONSTEXPR_TRIM_STRINGS_ARRAYS
# define _ENUM_DEFAULT_TO_STRING_CONSTEXPR \ # define _ENUM_DEFAULT_TO_STRING_KEYWORD \
_ENUM_TO_STRING_NOT_CONSTEXPR _ENUM_NO_CONSTEXPR_TO_STRING_KEYWORD
# define _ENUM_DEFAULT_INITIALIZE_DECLARATION \ # define _ENUM_DEFAULT_DECLARE_INITIALIZE \
_ENUM_DECLARE_INITIALIZE _ENUM_DO_DECLARE_INITIALIZE
# define _ENUM_DEFAULT_INITIALIZE_DEFINITION \ # define _ENUM_DEFAULT_DEFINE_INITIALIZE \
_ENUM_DEFINE_INITIALIZE _ENUM_DO_DEFINE_INITIALIZE
# define _ENUM_DEFAULT_CALL_INITIALIZE \ # define _ENUM_DEFAULT_CALL_INITIALIZE \
_ENUM_CALL_INITIALIZE _ENUM_DO_CALL_INITIALIZE
#endif #endif
#define ENUM(Enum, Integral, ...) \ #define ENUM(Enum, Integral, ...) \
_ENUM_TYPE(_ENUM_SET_UNDERLYING_TYPE_IMPLEMENTED, \ _ENUM_TYPE(_ENUM_CXX11_UNDERLYING_TYPE, \
_ENUM_DISABLE_DEFAULT_BY_DELETE, \ _ENUM_CXX11_NO_DEFAULT_CONSTRUCTOR, \
_ENUM_DEFAULT_SWITCH_TYPE, \ _ENUM_DEFAULT_SWITCH_TYPE, \
_ENUM_DEFAULT_GENERATE_SWITCH_TYPE, \ _ENUM_DEFAULT_SWITCH_TYPE_GENERATE, \
_ENUM_DEFAULT_CONSTEXPR_TO_STRING, \ _ENUM_DEFAULT_TRIM_STRINGS_ARRAYS, \
_ENUM_DEFAULT_TO_STRING_CONSTEXPR, \ _ENUM_DEFAULT_TO_STRING_KEYWORD, \
_ENUM_DEFAULT_INITIALIZE_DECLARATION, \ _ENUM_DEFAULT_DECLARE_INITIALIZE, \
_ENUM_DEFAULT_INITIALIZE_DEFINITION, \ _ENUM_DEFAULT_DEFINE_INITIALIZE, \
_ENUM_DEFAULT_CALL_INITIALIZE, \ _ENUM_DEFAULT_CALL_INITIALIZE, \
Enum, Integral, __VA_ARGS__) Enum, Integral, __VA_ARGS__)
#define CONSTEXPR_TO_STRING_ENUM(Enum, Integral, ...) \ #define CONSTEXPR_TO_STRING_ENUM(Enum, Integral, ...) \
_ENUM_TYPE(_ENUM_SET_UNDERLYING_TYPE_IMPLEMENTED, \ _ENUM_TYPE(_ENUM_CXX11_UNDERLYING_TYPE, \
_ENUM_DISABLE_DEFAULT_BY_DELETE, \ _ENUM_CXX11_NO_DEFAULT_CONSTRUCTOR, \
_ENUM_DEFAULT_SWITCH_TYPE, \ _ENUM_DEFAULT_SWITCH_TYPE, \
_ENUM_DEFAULT_GENERATE_SWITCH_TYPE, \ _ENUM_DEFAULT_SWITCH_TYPE_GENERATE, \
_ENUM_GENERATE_STRINGS_COMPILE_TIME, \ _ENUM_CXX11_FULL_CONSTEXPR_TRIM_STRINGS_ARRAYS, \
_ENUM_TO_STRING_CONSTEXPR, \ _ENUM_CONSTEXPR_TO_STRING_KEYWORD, \
_ENUM_INITIALIZE_DECLARATION_NOT_NEEDED, \ _ENUM_DO_NOT_DECLARE_INITIALIZE, \
_ENUM_DEFINE_INITIALIZE_NOT_NEEDED, \ _ENUM_DO_NOT_DEFINE_INITIALIZE, \
_ENUM_CALL_INITIALIZE_IS_NO_OP, \ _ENUM_DO_NOT_CALL_INITIALIZE, \
Enum, Integral, __VA_ARGS__) Enum, Integral, __VA_ARGS__)
#else #else
#define ENUM(Enum, Integral, ...) \ #define ENUM(Enum, Integral, ...) \
_ENUM_TYPE(_ENUM_SET_UNDERLYING_TYPE_NO_OP, \ _ENUM_TYPE(_ENUM_CXX98_UNDERLYING_TYPE, \
_ENUM_DISABLE_DEFAULT_BY_PRIVATE, \ _ENUM_CXX98_NO_DEFAULT_CONSTRUCTOR, \
_ENUM_DEFAULT_SWITCH_TYPE, \ _ENUM_DEFAULT_SWITCH_TYPE, \
_ENUM_DEFAULT_GENERATE_SWITCH_TYPE, \ _ENUM_DEFAULT_SWITCH_TYPE_GENERATE, \
_ENUM_GENERATE_STRINGS_PREPARE_FOR_RUNTIME_WRAPPED, \ _ENUM_CXX98_TRIM_STRINGS_ARRAYS, \
_ENUM_TO_STRING_NOT_CONSTEXPR, \ _ENUM_NO_CONSTEXPR_TO_STRING_KEYWORD, \
_ENUM_DECLARE_INITIALIZE, \ _ENUM_DO_DECLARE_INITIALIZE, \
_ENUM_DEFINE_INITIALIZE, \ _ENUM_DO_DEFINE_INITIALIZE, \
_ENUM_CALL_INITIALIZE, \ _ENUM_DO_CALL_INITIALIZE, \
Enum, Integral, __VA_ARGS__) Enum, Integral, __VA_ARGS__)
#endif #endif

View File

@ -11,9 +11,10 @@
# enum can have. By default, this limit is 64 constants. # enum can have. By default, this limit is 64 constants.
# #
# _ENUM_ITERATE also has a limit. This one determines the maximum length of the # _ENUM_ITERATE also has a limit. This one determines the maximum length of the
# name of a constant that is followed by an explicit setting (" = 2"). By # name of a constant that is followed by an initializer (" = 2") when compiling
# default, this is 23 (24 with the obligatory null terminator). Constants # an enum with constexpr to_string function (i.e. usually, this limit does not
# without explicit setting can have any length. # apply). By default, the limit is 23 characters (24 with the obligatory null
# terminator).
# #
# If either of these limits is inadequate, you can still compile your code # If either of these limits is inadequate, you can still compile your code
# without changing enum.h. You need to generate an external macro file with # without changing enum.h. You need to generate an external macro file with
@ -23,7 +24,7 @@
# #
# 0. MACRO_FILE is the name of the external macro file. Make sure you put it # 0. MACRO_FILE is the name of the external macro file. Make sure you put it
# somewhere in your include path. # somewhere in your include path.
# 1. Run python pp_map_gen.py 512 128 > MACRO_FILE # 1. Run python make_macros.py 512 128 > MACRO_FILE
# 2. Build your code with an additional compiler flag: # 2. Build your code with an additional compiler flag:
# - for gcc and clang, -BETTER_ENUMS_MACRO_FILE='<MACRO_FILE>' # - for gcc and clang, -BETTER_ENUMS_MACRO_FILE='<MACRO_FILE>'
# - for VC++, /BETTER_ENUMS_MACRO_FILE='<MACRO_FILE>' # - for VC++, /BETTER_ENUMS_MACRO_FILE='<MACRO_FILE>'