Using some nasty macro and template magic it's possible to get an unrolled binary search at compiletime with pretty syntax -- but the MATCHES ("case") have to be sorted: fastmatch.h
NEWMATCH
MATCH("asd")
some c++ code
MATCH("bqr")
... the buffer for the match is in _buf
MATCH("zzz")
... user.YOURSTUFF
/*ELSE
optional
*/
ENDMATCH(xy_match)
This will generate (roughly) a function bool xy_match(char *&_buf,T &user)
, so it must be at the outer level. Call it e.g. with:
xy_match("bqr",youruserdata);
And the break
s are implicit, you cannot fall-thru. It's also not heavily documented, sorry. But you'll find, that there are some more usage-possibilities, have a look. NOTE: Only tested with g++.
Update C++11:
Lambdas and initializer list make things much prettier (no macros involved!):
#include <utility>
#include <algorithm>
#include <initializer_list>
template <typename KeyType,typename FunPtrType,typename Comp>
void Switch(const KeyType &value,std::initializer_list<std::pair<const KeyType,FunPtrType>> sws,Comp comp) {
typedef std::pair<const KeyType &,FunPtrType> KVT;
auto cmp=[&comp](const KVT &a,const KVT &b){ return comp(a.first,b.first); };
auto val=KVT(value,FunPtrType());
auto r=std::lower_bound(sws.begin(),sws.end(),val,cmp);
if ( (r!=sws.end())&&(!cmp(val,*r)) ) {
r->second();
} // else: not found
}
#include <string.h>
#include <stdio.h>
int main()
{
Switch<const char *,void (*)()>("ger",{ // sorted:
{"asdf",[]{ printf("0
"); }},
{"bde",[]{ printf("1
"); }},
{"ger",[]{ printf("2
"); }}
},[](const char *a,const char *b){ return strcmp(a,b)<0;});
return 0;
}
That's the idea. A more complete implementation can be found here: switch.hpp.
Update 2016: Compile time trie
My newest take on this problem uses advanced c++11 metaprogramming to
generate a search-trie at compile time.
Unlike the previous approaches, this will handle unsorted
case-branches/strings just fine; they only have to be string-literals.
G++ also allows constexpr for them, but not clang (as of HEAD 3.9.0 / trunk 274233).
In each trie node a switch-statement is utilized to harness the compiler's advanced code generator.
The full implementation is available at github: smilingthax/cttrie.