Compile-time linked list and key-value store
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <type_traits> | |
using namespace std; | |
struct Nil { | |
typedef Nil Head; | |
typedef Nil Tail; | |
}; | |
template <typename H, typename T = Nil> struct Lst { | |
typedef H Head; | |
typedef T Tail; | |
static const int Length = 1 + T::Length; | |
}; | |
template <typename H> struct Lst <H, Nil> { | |
typedef H Head; | |
typedef Nil Tail; | |
static const int Length = 1; | |
}; | |
template <typename L, int I> struct LstIndex { | |
typedef typename LstIndex<typename L::Tail, I-1>::Value Value; | |
}; | |
template <typename L> struct LstIndex <L, 0> { | |
typedef typename L::Head Value; | |
}; | |
template <int N> struct Int { | |
static const int value = N; | |
}; | |
template <int K, int V> struct IntPair { | |
static const int key = K; | |
static const int value = V; | |
}; | |
template <int QK, typename KVs> struct KeySearch : | |
conditional<KVs::Head::key == QK, typename KVs::Head, KeySearch<QK, typename KVs::Tail>>::type {}; | |
template <int QK> struct KeySearch <QK, Nil> : Nil {}; | |
typedef Lst< IntPair<4, 8>, | |
Lst< IntPair<6, 12>, | |
Lst< IntPair<1, 2> | |
>>> Foo; | |
int main(int argc, char** argv) { | |
cout << Foo::Length << ' ' | |
<< Foo::Tail::Length << ' ' | |
<< Foo::Tail::Tail::Length | |
<< endl; | |
cout << Foo::Head::key << ' ' | |
<< Foo::Tail::Head::key << ' ' | |
<< Foo::Tail::Tail::Head::key | |
<< endl; | |
cout << Foo::Head::value << ' ' | |
<< Foo::Tail::Head::value << ' ' | |
<< Foo::Tail::Tail::Head::value | |
<< endl; | |
cout << LstIndex<Foo, 0>::Value::value << ' ' | |
<< LstIndex<Foo, 1>::Value::value << ' ' | |
<< LstIndex<Foo, 2>::Value::value | |
<< endl; | |
cout << KeySearch<1, Foo>::value << ' ' | |
<< KeySearch<4, Foo>::value << ' ' | |
<< KeySearch<6, Foo>::value | |
<< endl; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment