- каждое перечисление должно иметь группу / категоризацию
- не нужно вручную писать индексы перечисления и диапазоны для групп
- в одном классе, чтобы я мог легко использовать в качестве переменных
мой текущий подход заключается в кодировании индекса группы в последних нескольких битах целочисленного значения перечисления:
#define TokenizerState_Normal 0
#define TokenizerState_InComment 1
#define TokenizerState_InLiteral 2
enum class TokenizerState : uint_fast32_t {
#define State (__COUNTER__ | ((GROUP << 25))) //Encode group into last 7 bits (of 32)
#define GROUP TokenizerState_Normal
Normal,
#undef GROUP
#define GROUP TokenizerState_InComment
InComment = State,
InCommentMultiline = State,
#undef GROUP
#define GROUP TokenizerState_InLiteral
InStringQuote = State,
InStringDoubleQuote = State,
InStringBacktick = State,
InInteger = State,
InDecimal = State,
InIdentifier = State
#undef GROUP
#undef State
};
//Get what group an enum belongs to. Returns 0,1 or 2 (groups defined above)
#define GetTokenizerStateGroup(INDEX) ((((unsigned int)INDEX) & 0xFE000000) >> 25)
, но id хотел бы сделать его более читаемым и избегать макросов, если возможно. Мне нужно иметь возможность узнать, в какой группе находится перечисление TokenizerState
. В настоящее время я делаю это, проверяя последние биты в макросе GetTokenizerStateGroup
.
Я делаю это так, потому что на самом деле у меня много перечислений и его намного быстрее и проще сравнивать с категорией, чем с каждым перечислением (и поскольку все они по сути содержат группу, мне не нужно выполнять поиск или сравнение из списка). и поскольку у меня их много и я часто редактирую, я не хочу писать индексы и группировать диапазоны каждый раз, когда редактирую.
я не настолько продвинут в C ++, поэтому шаблоны и другие более современные конструкции C ++ приветствуются, если в основном удовлетворяет условиям.