Здравствуйте, WiseAlex, Вы писали:
WA>как это реализовать? Решение необходимо типовое, т.к. таких switch много и в разных фунциях и классах.
Можно так:
#define C1_FINISHED 0x01
#define C2_FINISHED 0x02
#define C3_FINISHED 0x04
#define C4_FINISHED 0x08
#define C5_FINISHED 0x10
#define C6_FINISHED 0x20
#define C7_FINISHED 0x40
#define C8_FINISHED 0x80
BYTE flags = 0;
while (){
...
switch(a)
{
case c1:...
flags |= C1_FINISHED;
break;
case c2:...
flags |= C2_FINISHED;
break;
...
default:
}
if (flags == 0xFF)
{
// all variants finished
...
}
flags = 0;
Соответственно, если у типа enum больше значений, то можно взять WORD или DWORD.
... << RSDN@Home 1.1 beta 2 >>
Здравствуйте, WiseAlex, Вы писали:
WA>Проблема в том, что индицировать нужно какие именно case не выполнились. Т.е. операции рутинне — нужны красивые 2-3 макроса дли типовой реализации.
Возьми std::set...
... << RSDN@Home 1.1 beta 2 >>
Здравствуйте, WiseAlex, Вы писали:
WA>Проблема в том, что индицировать нужно какие именно case не выполнились. Т.е. операции рутинне — нужны красивые 2-3 макроса дли типовой реализации.
Если enum имеет диапазон 0..31, то можно использовать битовые маски; если в пределах, скажем, 256 — массив булей; иначе — std::vector<bool>, std::set<YourEnum>
При общей структуре кода
CLEAR_CASES();
while(...)
{
...
SET_CASE(a);
switch(a)
{
...
}
...
}
if(CASE_NOT_PASSED(A1)) { ... }
if(CASE_NOT_PASSED(A2)) { ... }
реализации будут такими:
DWORD
// CLEAR_CASES()
DWORD allcases = 0;
// SET_CASE(a)
allcases |= (1<<a);
// CASE_NOT_PASSED(v)
((allcases & (1<<v)) == 0)
vector<bool>; bool[n]
// CLEAR_CASES()
vector<bool> allcases(max_a - min_a);
bool allcases[max_a - min_a] = { false };
// SET_CASE(a)
allcases[a - min_a] = true;
// CASE_NOT_PASSED(v)
!(allcases[v - min_a])
set<YourEnum>
// CLEAR_CASES()
set<int> allcases;
// SET_CASE(a)
allcases.insert(a);
// CASE_NOT_PASSED(v)
(allcases.find(a) == allcases.end())