Инструменты пользователя

Инструменты сайта


langcpp:strings

Работа со строками

Switch по строковым литералам, С++11

Пример подходит для заранее известных строковых литералов и требует проверки того, что хэш для всех строк получается разный. В противном случае - считать хэш по другому.

источник

#include <string>
 
constexpr size_t ct_hash_suffix(char c, size_t seed)
{
    return static_cast<size_t>(c) + 0x9e3779b9ul + (seed << 6) + (seed >> 2);
}
 
size_t hash_value(std::string const & str)
{
    size_t seed = 0;
    for(char c : str)
    {
        seed ^= ct_hash_suffix(c, seed);
    }
    return seed;
}
 
constexpr size_t ct_hash(char const * str, size_t seed = 0)
{
    return *str ? ct_hash(str + 1, seed ^ ct_hash_suffix(*str, seed)) : seed;
}

//===========  String Literals =============
constexpr const char * str_Name        = "Name";
constexpr const char * str_Descrition  = "Description";
constexpr const char * str_Value       = "Value";

//===========  String Literals Hash =============
constexpr size_t hash_Name             = ct_hash(str_Name);
constexpr size_t hash_Descrition       = ct_hash(str_Descrition);
constexpr size_t hash_Value            = ct_hash(str_Value);


//===========  Switch by String Literals =============
const char * GetStrByHash(const char *strID)
{
    switch (hash_value(strID))
    {
    case hash_Name      : return str_Name;
    case hash_Descrition: return str_Descrition;
    case hash_Value     : return str_Value;
    }

    return nullptr;
}

//===========  Test =============
const char * strID[] = {
    str_Name,
    str_Descrition,
    str_Value
}

// Get Array Length function
template<class T, size_t N>
constexpr size_t length(T(&)[N]) { return N; }

int main()
{
  ...

  for (int i = 0; i < length(strID); ++i)
  {
    if (strcmp(strID], GetStrByHash(strID[i])) != 0)
        ++errCnt;
  }
  
  ...

}
langcpp/strings.txt · Последние изменения: 2018/06/23 20:26 — vasco