2016-08-22 3 views
1

Я читаю значение из потока байтов и хочу утверждать, что это значение находится в диапазоне перечислений. Мне было интересно, есть ли более общий подход, чем тот, который приведен ниже.Как утверждать, находится ли значение в пределах диапазона перечислений

int nval = ReadValue(); 
Assert(nval); 

bool Assert(nval) 
{ 
if(nval == zero || nval == one || nval==two || (nval>=reserved_low && nval <= reserved_high)) 
    return true; 
return false 
} 
    enum Foo 
    { 
    zero = 0, 
    one = 1, 
    two = 2, 
    reserved_low = 3, 
    reserved_high = 255, 
    } 
+0

Мне кажется, что вам нужно только 'nval> = zero && nval <= reserved_high' – EdChum

+0

Вы можете указать дополнительные константы в перечислении' Foo_min = zero, Foo_max = reserved_high'. – StoryTeller

+0

Пожалуйста, найдите свой вопрос на SO перед запросом. (Http://stackoverflow.com/questions/2102582/how-can-i-count-the-items-in-an-enum) – Warezovvv

ответ

1

Не в C++ 03, no.

Ваш путь довольно оптимальный (и, конечно, читаемый), хотя вы могли бы признать, что, поскольку все ваши перечисления находятся в диапазоне от 0 до 255, return !(nval & ~0xff); выполнит эту работу.

Возможно, вы сможете сжать немного больше производительности, используя switch и сравнить nval>=reserved_low && nval <= reserved_high в корпусе default.

+0

У меня не было бы подумал, что эти оптимизации будут иметь большое значение; исходный код довольно прост, поэтому компилятор, вероятно, будет лучше оптимизировать его, чем мы. – TartanLlama

+0

Было бы интересно узнать, скомпилировал ли компилятор его в '! (Nval & ~ 0xff)' – Bathsheba

+0

. В приведенной выше версии (когда исправлено) просто появляется 'cmpl', за которым следует' setbe' из [GCC] (https: //godbolt.org/g/KS4GcZ). – TartanLlama

1

Вот похожий, но немного чище трюк:

enum Foo { 
zero = 0, 
one = 1, 
two = 2, 
reserved_low = 3, 
reserved_high = 255, 
foo_count 
}; 

bool Assert(nval) { 
    if(nval > zero && nval < foo_count) { 
    return true; 
    } 
    return false; 
} 

Поскольку перечисление шагом каждая запись с 1, граф теперь будет присвоено значение 256. Если вы хотите добавить дополнительные допустимые значения позже счет будет автоматически обновляться.

Смежные вопросы