// This file is part of EnumeratorLib
// Copyright: Andreas Raczek
// This file is published under the The Code Project Open License (CPOL)
// See the file "CPOL.html" for the full license governing this code.
#pragma once
namespace lobster {
namespace enm {
// template shortcuts for list<tail<?>, ?> combinations
// variadic templates would be great here ...
template<typename tail, typename tail::enum_type v1>
struct list_1 {
typedef list<tail, v1> value;
};
template<typename tail, typename tail::enum_type v1, typename tail::enum_type v2>
struct list_2 {
typedef list<typename list_1<tail, v1>::value, v2> value;
};
template<typename tail, typename tail::enum_type v1, typename tail::enum_type v2, typename tail::enum_type v3>
struct list_3 {
typedef list<typename list_2<tail, v1, v2>::value, v3> value;
};
template<typename tail, typename tail::enum_type v1, typename tail::enum_type v2, typename tail::enum_type v3, typename tail::enum_type v4>
struct list_4 {
typedef list<typename list_3<tail, v1, v2, v3>::value, v4> value;
};
template<typename tail, typename tail::enum_type v1, typename tail::enum_type v2, typename tail::enum_type v3, typename tail::enum_type v4, typename tail::enum_type v5>
struct list_5 {
typedef list<typename list_4<tail, v1, v2, v3, v4>::value, v5> value;
};
template<typename tail, typename tail::enum_type v1, typename tail::enum_type v2, typename tail::enum_type v3, typename tail::enum_type v4, typename tail::enum_type v5, typename tail::enum_type v6>
struct list_6 {
typedef list<typename list_5<tail, v1, v2, v3, v4, v5>::value, v6> value;
};
template<typename tail, typename tail::enum_type v1, typename tail::enum_type v2, typename tail::enum_type v3, typename tail::enum_type v4, typename tail::enum_type v5, typename tail::enum_type v6, typename tail::enum_type v7>
struct list_7 {
typedef list<typename list_6<tail, v1, v2, v3, v4, v5, v6>::value, v7> value;
};
template<typename tail, typename tail::enum_type v1, typename tail::enum_type v2, typename tail::enum_type v3, typename tail::enum_type v4, typename tail::enum_type v5, typename tail::enum_type v6, typename tail::enum_type v7, typename tail::enum_type v8>
struct list_8 {
typedef list<typename list_7<tail, v1, v2, v3, v4, v5, v6, v7>::value, v8> value;
};
template<typename tail, typename tail::enum_type v1, typename tail::enum_type v2, typename tail::enum_type v3, typename tail::enum_type v4, typename tail::enum_type v5, typename tail::enum_type v6, typename tail::enum_type v7, typename tail::enum_type v8, typename tail::enum_type v9>
struct list_9 {
typedef list<typename list_8<tail, v1, v2, v3, v4, v5, v6, v7, v8>::value, v9> value;
};
template<typename tail, typename tail::enum_type v1, typename tail::enum_type v2, typename tail::enum_type v3, typename tail::enum_type v4, typename tail::enum_type v5, typename tail::enum_type v6, typename tail::enum_type v7, typename tail::enum_type v8, typename tail::enum_type v9, typename tail::enum_type v10>
struct list_10 {
typedef list<typename list_9<tail, v1, v2, v3, v4, v5, v6, v7, v8, v9>::value, v10> value;
};
}
}