Idea: Turn a switch
into a bunch of if
statements that record their presence in an array.
Preamble:
#define BIG_ENOUGH 50 // Just needs to be bigger than the maximum enum value
#define BEGIN_DETECTED_SWITCH(x) \
{ \
vector<bool> __has(BIG_ENOUGH, false); \
vector<bool> __saw(BIG_ENOUGH, false); \
auto __x(x); \
{ ; // Dummy open brace to be consumed by first DETECTED_CASE()
#define END_DETECTED_SWITCH \
} \
for (int i = 0; i < BIG_ENOUGH; ++i) { \
if (__has[i] && !__saw[i]) { \
cout << "Didn't see any " << i << "'s!\n"; \
} \
} \
}
#define DETECTED_CASE(x) \
} \
__has[x] = true; \
if (__x == (x)) { \
__saw[x] = true;
Now turn each switch
statement into:
BEGIN_DETECTED_SWITCH(someEnumVal)
DETECTED_CASE(First)
// Code for first
DETECTED_CASE(Second)
// Code for second
DETECTED_CASE(Third)
// Code for Third
END_DETECTED_SWITCH
You could slightly generalise it by having END_DETECTED_SWITCH
take a lambda parameter that gets called with every non-firing case
, instead of hardcoding the "reaction".