#ifndef KGR_KANGARU_INCLUDE_KANGARU_DETAIL_META_LIST_HPP #define KGR_KANGARU_INCLUDE_KANGARU_DETAIL_META_LIST_HPP #include namespace kgr { namespace detail { template struct meta_list {}; template struct meta_list_element; template struct meta_list_element> {}; template struct meta_list_element<0, meta_list> { using type = Head; }; template struct meta_list_element> : meta_list_element> {}; template struct meta_list_contains; template struct meta_list_contains> : std::false_type {}; template struct meta_list_contains> : meta_list_contains> {}; template struct meta_list_contains> : std::true_type {}; template struct meta_list_size; template class> struct meta_list_transform; template class F> struct meta_list_transform, F> { using type = meta_list...>; }; template class F> using meta_list_transform_t = typename meta_list_transform::type; template struct meta_list_size> { static constexpr std::size_t value = sizeof...(Types); }; template using meta_list_element_t = typename meta_list_element::type; template struct meta_list_empty; template struct meta_list_empty> : std::integral_constant {}; } // namespace detail } // namespace kgr #endif // KGR_KANGARU_INCLUDE_KANGARU_DETAIL_META_LIST_HPP