|
Why not just hash the string using constexpr ? ==================== C preprocessor based compile time hash from lolengine: http://lolengine.net/blog/2011/12/20/cpp-constant-string-has... ==================== #define H1(s,i,x)(x65599u+(uint8_t)s[(i)
<strlen(s)?strlen(s)-1-(i):strlen(s)]) #define H4(s,i,x) H1(s,i,H1(s,i+1,H1(s,i+2,H1(s,i+3,x)))) #define H16(s,i,x) H4(s,i,H4(s,i+4,H4(s,i+8,H4(s,i+12,x)))) #define H64(s,i,x) H16(s,i,H16(s,i+16,H16(s,i+32,H16(s,i+48,x)))) #define H256(s,i,x) H64(s,i,H64(s,i+64,H64(s,i+128,H64(s,i+192,x)))) #define HASH(s) ((uint32_t)(H256(s,0,0)^(H256(s,0,0)>>16))) template<size_t N>
constexpr uint32_t h(char const (&s)[N]) { return HASH(s); } constexpr uint32_t h(const char s) { return HASH(s); } uint32_t h(const std::string& s) { return h(s.c_str()); } int main(int argc, const char argv)
{ auto s = "keep";
std::string x = "simple";
switch(h(x))
{
case h("keep") : std::cout << "keep"; break;
case h("it") : std::cout << "it"; break;
case h("simple"): std::cout << "simple"; break;
};
|
Also with that approach since it can't be made into a jump table it's still going to compile into a bunch of if/else combinations. At least with the trie it can early-return if the input doesn't have any chance of matching anything.