Группировка / категоризация перечислений в C ++ - PullRequest
0 голосов
/ 29 мая 2020
  1. каждое перечисление должно иметь группу / категоризацию
  2. не нужно вручную писать индексы перечисления и диапазоны для групп
  3. в одном классе, чтобы я мог легко использовать в качестве переменных

мой текущий подход заключается в кодировании индекса группы в последних нескольких битах целочисленного значения перечисления:

#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 ++ приветствуются, если в основном удовлетворяет условиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...