diff --git a/dang-utils/include/dang-utils/typelist.h b/dang-utils/include/dang-utils/typelist.h index d3e11d4c..394058d0 100644 --- a/dang-utils/include/dang-utils/typelist.h +++ b/dang-utils/include/dang-utils/typelist.h @@ -19,6 +19,9 @@ struct is_null_type : std::is_same {}; template inline constexpr auto is_null_type_v = is_null_type::value; +template +concept NullTyped = is_null_type_v; + // --- TypeListExhaustion /// @brief The type list got exhausted from a drop, take or slice. @@ -32,6 +35,9 @@ struct is_type_list_exhaustion : std::is_same {}; template inline constexpr auto is_type_list_exhaustion_v = is_type_list_exhaustion::value; +template +concept ExhaustedTypeList = is_type_list_exhaustion_v; + // --- TypeList template @@ -56,6 +62,9 @@ inline constexpr auto is_type_list_v = is_type_list::value; template struct is_type_list> : std::true_type {}; +template +concept AnyTypeList = is_type_list_v; + // --- is_empty_type_list template @@ -64,12 +73,15 @@ struct is_empty_type_list : std::is_same> {}; template inline constexpr auto is_empty_type_list_v = is_empty_type_list::value; +template +concept EmptyTypeList = is_empty_type_list_v; + // --- type_list_size -template +template struct type_list_size; -template +template inline constexpr auto type_list_size_v = type_list_size::value; template @@ -77,10 +89,10 @@ struct type_list_size> : constant {}; // --- type_list_contains -template +template struct type_list_contains; -template +template inline constexpr auto type_list_contains_v = type_list_contains::value; template @@ -89,10 +101,10 @@ struct type_list_contains, TCheckedType> // --- type_list_at -template +template struct type_list_at; -template +template using type_list_at_t = typename type_list_at::type; template @@ -106,26 +118,26 @@ struct type_list_at, v_index> : type_list_at +template using type_list_first = type_list_at; -template +template using type_list_first_t = typename type_list_first::type; // --- type_list_last -template +template using type_list_last = type_list_at; -template +template using type_list_last_t = typename type_list_last::type; // --- type_list_append -template +template struct type_list_append; -template +template using type_list_append_t = typename type_list_append::type; template @@ -134,10 +146,10 @@ struct type_list_append, TSecondTypes...> // --- type_list_prepend -template +template struct type_list_prepend; -template +template using type_list_prepend_t = typename type_list_prepend::type; template @@ -146,125 +158,138 @@ struct type_list_prepend, TSecondTypes...> // --- type_list_join -template +template struct type_list_join; -template +template using type_list_join_t = typename type_list_join::type; template <> struct type_list_join<> : std::type_identity> {}; -template +template struct type_list_join : std::type_identity {}; -template +template struct type_list_join, TOtherTypeLists...> : type_list_join, TOtherTypeLists...> {}; // --- type_list_drop -template +template struct type_list_drop; -template +template using type_list_drop_t = typename type_list_drop::type; template struct type_list_drop, 0> : std::type_identity> {}; +// clang-format off template -struct type_list_drop, v_count, std::enable_if_t<(v_count > 0)>> : std::type_identity {}; +requires(v_count > 0) +struct type_list_drop, v_count> : std::type_identity {}; template -struct type_list_drop, v_count, std::enable_if_t<(v_count > 0)>> +requires(v_count > 0) +struct type_list_drop, v_count> : type_list_drop, v_count - 1> {}; +// clang-format on // --- type_list_take namespace detail { -template +template struct type_list_take_helper; template -struct type_list_take_helper, 0, true, TTakenTypes...> - : std::type_identity> {}; +struct type_list_take_helper, 0, TTakenTypes...> : std::type_identity> {}; +// clang-format off template -struct type_list_take_helper, v_count, false, TTakenTypes...> : std::type_identity {}; +requires(v_count > 0) +struct type_list_take_helper, v_count, TTakenTypes...> : std::type_identity {}; template -struct type_list_take_helper, v_count, false, TTakenTypes...> - : type_list_take_helper, v_count - 1, (v_count == 1), TTakenTypes..., TFirstType> {}; +requires(v_count > 0) +struct type_list_take_helper, v_count, TTakenTypes...> + : type_list_take_helper, v_count - 1, TTakenTypes..., TFirstType> {}; +// clang-format on } // namespace detail -template +template struct type_list_take : detail::type_list_take_helper {}; -template +template using type_list_take_t = typename type_list_take::type; // --- type_list_slice -template +template struct type_list_slice; -template +template using type_list_slice_t = typename type_list_slice::type; -template -struct type_list_slice TTypeList::size)>> - : std::type_identity {}; +// clang-format off +template +requires(v_begin <= v_end && v_end > TTypeList::size) +struct type_list_slice : std::type_identity {}; -template -struct type_list_slice> +template +requires(v_begin <= v_end && v_end <= TTypeList::size) +struct type_list_slice : type_list_take, v_end - v_begin> {}; +// clang-format on // --- type_list_erase -template +template struct type_list_erase; -template -struct type_list_erase TTypeList::size)>> - : std::type_identity {}; +// clang-format off +template +requires(v_begin <= v_end && v_end > TTypeList::size) +struct type_list_erase : std::type_identity {}; -template -struct type_list_erase> +template +requires(v_begin <= v_end && v_end <= TTypeList::size) +struct type_list_erase : type_list_join, type_list_drop_t> {}; +// clang-format on -template +template using type_list_erase_t = typename type_list_erase::type; // --- type_list_insert -template +template struct type_list_insert : type_list_join, TypeList, type_list_drop_t> {}; -template +template using type_list_insert_t = typename type_list_insert::type; // --- type_list_filter namespace detail { -template typename TFilter, - typename TParameterListBefore, - typename TParameterListAfter, + AnyTypeList TParameterListBefore, + AnyTypeList TParameterListAfter, bool v_invert, typename... TFilteredTypes> struct type_list_filter_helper; template