Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
так что под CASE мы её всё равно не загоним
ullong const h1 = str_hash("\x03\x01", 2);
ullong const h2 = str_hash("\x01\x01\x01", 3);constexpr ullong raise_128_to(const uchar power)
{
return 0x1ULL << 7*power;
}Конечно, я рассматривал и perfect hash. Однако потом посчитал, что отсутствие коллизий важнее.
сравнение строк в рантайме — дорогостоящая операция, и проводить её для каждой строки из CASE слишком расточительно
case hash("string"):
....
template <std::size_t N>
struct Hash {
ullong value;
bool ok;
enum { size = N - 1 };
constexpr Hash(char const (&str)[N])
: value { str_hash(str,size) }
, ok { str_is_correct(str) }
{
static_assert((size <= MAX_LEN), "CASE string length is greater than 9");
};
};
} // namespace s_s
template <s_s::Hash H>
constexpr auto operator""_h()
{
static_assert(H.ok, "CASE string contains wrong characters");
return H.value;
}
....
case "april"_h:Я тоже не люблю макросы и немного подшаманил https://godbolt.org/z/j8q6fafrY
Да, просто так уж повелось, что в Linux исторически используется Юникод, а в Windows другая кодировка
Windows предлагает сохранять всё в «ANSI» — хотя Юникод она, конечно же, поддерживает
Вообще, в этих кодировках сам чёрт ногу сломит :)
int eval(const Expr& e)
{
Match(e)
{
Case(const Value& x) return x.value;
Case(const Plus& x) return eval(x.e1) + eval(x.e2);
Case(const Minus& x) return eval(x.e1) - eval(x.e2);
Case(const Times& y) return eval(y.e1) * eval(y.e2);
Case(const Divide& z) return eval(z.e1) / eval(z.e2);
}
EndMatch
} Или здесь
/* Jan-Dec to 1-12 */
unsigned long time_parse_month(unsigned char *b)
{
switch(*b)
{
case 'j':
case 'J':
if((b[1]=='a')||(b[1]=='A'))
{
return(1);
}
if((b[2]=='n')||(b[2]=='N'))
{
return(6);
}
return(7);
case 'f':
case 'F':
return(2);
case 'm':
case 'M':
if((b[2]=='r')||(b[2]=='R'))
{
return(3);
}
return(5);
case 'a':
case 'A':
if((b[1]=='p')||(b[1]=='P'))
{
return(4);
}
return(8);
case 's':
case 'S':
return(9);
case 'o':
case 'O':
return(10);
case 'n':
case 'N':
return(11);
case 'd':
case 'D':
return(12);
default:
break;
}
return(0);
}
Switch для строк в C++11