mirror of
https://github.com/aantron/better-enums.git
synced 2025-12-06 08:46:42 +08:00
Made enum class (strict) conversion opt-in on a global basis.
This makes C++98 and C++11 Better Enums fully compatible by default. If the user defines BETTER_ENUMS_FORCE_STRICT_CONVERSION before including enum.h, it is necessary to prefix enum constants in switch cases with '+', but Better Enums are not implicitly convertible to integers.
This commit is contained in:
parent
5ce9537d66
commit
e784f0c860
30
enum.h
30
enum.h
@ -401,7 +401,7 @@ GenerateSwitchType(Integral, __VA_ARGS__); \
|
||||
} \
|
||||
\
|
||||
class Enum { \
|
||||
protected: \
|
||||
private: \
|
||||
typedef better_enums::optional<Enum> _optional; \
|
||||
typedef better_enums::optional<size_t> _optional_index; \
|
||||
\
|
||||
@ -449,7 +449,7 @@ class Enum { \
|
||||
\
|
||||
DisableDefault(Enum) \
|
||||
\
|
||||
protected: \
|
||||
private: \
|
||||
DeclareInitialize \
|
||||
\
|
||||
_ENUM_CONSTEXPR static _optional_index \
|
||||
@ -751,6 +751,20 @@ _ENUM_CONSTEXPR inline bool operator >=(const Enum &a, const Enum &b) \
|
||||
|
||||
|
||||
|
||||
#ifdef BETTER_ENUMS_FORCE_STRICT_CONVERSION
|
||||
# define _ENUM_DEFAULT_SWITCH_TYPE \
|
||||
_ENUM_SWITCH_TYPE_IS_ENUM_CLASS
|
||||
# define _ENUM_DEFAULT_GENERATE_SWITCH_TYPE \
|
||||
_ENUM_GENERATE_SWITCH_TYPE_ENUM_CLASS
|
||||
#else
|
||||
# define _ENUM_DEFAULT_SWITCH_TYPE \
|
||||
_ENUM_SWITCH_TYPE_IS_REGULAR_ENUM
|
||||
# define _ENUM_DEFAULT_GENERATE_SWITCH_TYPE \
|
||||
_ENUM_GENERATE_SWITCH_TYPE_REGULAR_ENUM
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifdef _ENUM_HAVE_CONSTEXPR
|
||||
|
||||
#ifdef BETTER_ENUMS_FORCE_CONSTEXPR_TO_STRING
|
||||
@ -780,8 +794,8 @@ _ENUM_CONSTEXPR inline bool operator >=(const Enum &a, const Enum &b) \
|
||||
#define ENUM(Enum, Integral, ...) \
|
||||
_ENUM_TYPE(_ENUM_SET_UNDERLYING_TYPE_IMPLEMENTED, \
|
||||
_ENUM_DISABLE_DEFAULT_BY_DELETE, \
|
||||
_ENUM_SWITCH_TYPE_IS_ENUM_CLASS, \
|
||||
_ENUM_GENERATE_SWITCH_TYPE_ENUM_CLASS, \
|
||||
_ENUM_DEFAULT_SWITCH_TYPE, \
|
||||
_ENUM_DEFAULT_GENERATE_SWITCH_TYPE, \
|
||||
_ENUM_DEFAULT_CONSTEXPR_TO_STRING, \
|
||||
_ENUM_DEFAULT_TO_STRING_CONSTEXPR, \
|
||||
_ENUM_DEFAULT_INITIALIZE_DECLARATION, \
|
||||
@ -792,8 +806,8 @@ _ENUM_CONSTEXPR inline bool operator >=(const Enum &a, const Enum &b) \
|
||||
#define CONSTEXPR_TO_STRING_ENUM(Enum, Integral, ...) \
|
||||
_ENUM_TYPE(_ENUM_SET_UNDERLYING_TYPE_IMPLEMENTED, \
|
||||
_ENUM_DISABLE_DEFAULT_BY_DELETE, \
|
||||
_ENUM_SWITCH_TYPE_IS_ENUM_CLASS, \
|
||||
_ENUM_GENERATE_SWITCH_TYPE_ENUM_CLASS, \
|
||||
_ENUM_DEFAULT_SWITCH_TYPE, \
|
||||
_ENUM_DEFAULT_GENERATE_SWITCH_TYPE, \
|
||||
_ENUM_GENERATE_STRINGS_COMPILE_TIME, \
|
||||
_ENUM_TO_STRING_CONSTEXPR, \
|
||||
_ENUM_INITIALIZE_DECLARATION_NOT_NEEDED, \
|
||||
@ -806,8 +820,8 @@ _ENUM_CONSTEXPR inline bool operator >=(const Enum &a, const Enum &b) \
|
||||
#define ENUM(Enum, Integral, ...) \
|
||||
_ENUM_TYPE(_ENUM_SET_UNDERLYING_TYPE_NO_OP, \
|
||||
_ENUM_DISABLE_DEFAULT_BY_PRIVATE, \
|
||||
_ENUM_SWITCH_TYPE_IS_REGULAR_ENUM, \
|
||||
_ENUM_GENERATE_SWITCH_TYPE_REGULAR_ENUM, \
|
||||
_ENUM_DEFAULT_SWITCH_TYPE, \
|
||||
_ENUM_DEFAULT_GENERATE_SWITCH_TYPE, \
|
||||
_ENUM_GENERATE_STRINGS_PREPARE_FOR_RUNTIME_WRAPPED, \
|
||||
_ENUM_TO_STRING_NOT_CONSTEXPR, \
|
||||
_ENUM_DECLARE_INITIALIZE, \
|
||||
|
||||
@ -10,15 +10,15 @@ void respond_to_channel(Channel channel)
|
||||
// Try adding an extra case or removing one. Your compiler should issue a
|
||||
// warning.
|
||||
switch (channel) {
|
||||
case +Channel::Red:
|
||||
case Channel::Red:
|
||||
std::cout << "red channel" << std::endl;
|
||||
break;
|
||||
|
||||
case +Channel::Green:
|
||||
case Channel::Green:
|
||||
std::cout << "green channel" << std::endl;
|
||||
break;
|
||||
|
||||
case +Channel::Blue:
|
||||
case Channel::Blue:
|
||||
std::cout << "blue channel" << std::endl;
|
||||
break;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user