00001
00002
00003 #ifndef DUNE_COMMON_TYPELIST_HH
00004 #define DUNE_COMMON_TYPELIST_HH
00005
00006 #include <type_traits>
00007 #include <tuple>
00008
00009
00010 namespace Dune {
00011
00029 template<class... T>
00030 struct TypeList
00031 {};
00032
00033
00034
00043 template<class T>
00044 struct IsTypeList : std::false_type {};
00045
00051 template<class... T>
00052 struct IsTypeList<TypeList<T...> > : std::true_type {};
00053
00054
00055
00064 template<class T>
00065 struct IsEmptyTypeList : std::integral_constant<bool, IsTypeList<T>() and std::is_same<T, TypeList<> >() > {};
00066
00067
00068
00069 template<class T>
00070 struct TypeListSize {};
00071
00080 template<class... T>
00081 struct TypeListSize<TypeList<T...>> : std::integral_constant<std::size_t, sizeof...(T)> {};
00082
00083
00084
00085 template<std::size_t i, class T>
00086 struct TypeListElement {};
00087
00093 template<std::size_t i, class... T>
00094 struct TypeListElement<i, TypeList<T...>>
00095 {
00101 using type = typename std::tuple_element<i, std::tuple<T...>>::type;
00102
00108 using Type = type;
00109 };
00110
00114 template<std::size_t i, class T>
00115 using TypeListEntry_t = typename TypeListElement<i, T>::type;
00116
00117
00118 }
00119
00120 #endif // DUNE_COMMON_TYPELIST_HH