1#ifndef KOUTIL_UTIL_TYPES_H
2#define KOUTIL_UTIL_TYPES_H
20template <
typename... T>
struct types {
21 static constexpr std::size_t
size =
sizeof...(T);
24template <
typename T>
struct are_types : std::false_type { };
26template <
typename... Types>
struct are_types<
types<Types...>> : std::true_type { };
39template <types_concept T, types_concept U>
struct types_cat;
64 typename T::template transform<int>;
65 typename T::template transform<int, int>;
66 typename T::template transform<int, int, int, int, int>;
83 template <
typename... Types>
using transform = std::tuple<Types...>;
90 template <
typename... Types>
using transform = std::variant<Types...>;
160 template <
typename T>
static constexpr std::size_t value = 0 + (std::is_same_v<T, Types> + ...);
172 return (std::is_same_v<T, Other> || ...);
180 template <
typename... Types>
struct unique_types_impl;
187 template <
typename T>
struct unique_types_impl<T> {
197 template <
typename T,
typename... Other>
struct unique_types_impl<T, Other...> {
198 using other_types = unique_types_impl<Other...>::type;
208 template <types_concept T, types_container Container>
struct types_to_containers;
216 template <
typename... Types, types_container Container>
struct types_to_containers<types<Types...>, Container> {
217 using type = types<typename Container::template container<Types>...>;
226 template <types_concept T, types_transform Transform>
struct types_transform_impl;
234 template <
typename... Types, types_transform Transform>
struct types_transform_impl<types<Types...>, Transform> {
235 using type = Transform::template transform<Types...>;
248 template <
typename T, std::size_t N, std::size_t I,
typename Type,
typename... Other>
250 if constexpr (std::is_same_v<T, Type>) {
251 if constexpr (N == 0) {
253 }
else if constexpr (
sizeof...(Other) != 0) {
256 }
else if constexpr (
sizeof...(Other) != 0) {
269 template <
typename T, types_concept Types, std::
size_t N>
struct types_index_of;
278 template <
typename T,
typename... Types, std::size_t N>
struct types_index_of<T,
types<Types...>, N> {
288 template <types_concept Types, std::
size_t I>
struct types_get_impl;
296 template <
typename... Types, std::size_t I>
297 requires(
sizeof...(Types) > 0)
298 struct types_get_impl<types<Types...>, I> {
299 using type = std::tuple_element_t<I, std::tuple<Types...>>;
302 template <std::
size_t I>
struct types_get_impl<types<>, I> {
311 template <types_concept Types>
struct types_unique_impl;
318 template <
typename... Types>
struct types_unique_impl<types<Types...>> {
319 using type = unique_types_impl<Types...>::type;
328 template <types_concept Types,
typename Unique>
struct types_to_arrays;
336 template <
typename... Types,
typename... Unique>
struct types_to_arrays<types<Types...>, types<Unique...>> {
337 using type = types<std::array<Unique, types_count<types<Types...>>::template value<Unique>>...>;
340 template <
typename Search,
typename Type,
typename... Other>
struct types_remove_impl {
341 using rest = types_remove_impl<Search, Other...>::type;
346 template <
typename Search,
typename Type>
struct types_remove_impl<Search, Type> {
347 using type = std::conditional_t<std::is_same_v<Type, Search>, types<>, types<Type>>;
350 template <
typename Types,
typename Type>
struct types_remove;
352 template <
typename... Types,
typename Type>
353 requires(
sizeof...(Types) > 0)
354 struct types_remove<types<Types...>, Type> {
355 using type = types_remove_impl<Type, Types...>::type;
358 template <
typename Type>
struct types_remove<types<>, Type> {
359 using type = types<>;
362 template <std::
size_t N, types_concept Types>
struct types_view;
364 template <std::size_t N,
typename Type,
typename... Other>
struct types_view<N, types<Type, Other...>> {
367 std::conditional_t<(N > 1),
typename types_view<N - 1, types<Other...>>::type, types<>>>;
370 template <std::
size_t N>
struct types_view<N, types<>> {
371 using type = types<>;
381template <types_concept Types, std::
size_t I>
using types_get_t = detail::types_get_impl<Types, I>::type;
388template <
typename... Types>
using unique_types_t = detail::unique_types_impl<Types...>::type;
395template <types_concept Types>
using types_unique_t = detail::types_unique_impl<Types>::type;
403template <types_concept Types, types_transform Transform>
412template <types_concept Types, types_container Container = types_containers::vector>
422template <types_concept Types,
typename T, std::
size_t Skip = 0>
423inline constexpr std::size_t
types_index_of_v = detail::types_index_of<T, Types, Skip>::value;
430template <types_concept Types>
using types_to_arrays_t = detail::types_to_arrays<Types, types_unique_t<Types>>::type;
438template <types_concept Types,
typename T>
using types_remove_t = detail::types_remove<Types, T>::type;
440template <types_concept Types, std::
size_t N>
using types_view_t = detail::types_view<N, Types>::type;
Concept for a type that provides a container template.
Definition types.h:73
consteval bool contains_type()
Helper to check if a type is contained in a list of types.
Definition types.h:171
constexpr std::size_t types_index_of_impl()
Helper to get the index of a type in a types list.
Definition types.h:249
Definition array_concat.h:9
detail::types_get_impl< Types, I >::type types_get_t
Alias for getting a type by index in a types list.
Definition types.h:381
detail::types_to_arrays< Types, types_unique_t< Types > >::type types_to_arrays_t
Alias for converting a types list to arrays of unique types.
Definition types.h:430
constexpr bool are_types_v
Definition types.h:28
detail::unique_types_impl< Types... >::type unique_types_t
Alias for creating a unique types list from a list of types.
Definition types.h:388
detail::types_to_containers< Types, Container >::type types_to_containers_t
Alias for transforming a types list to a containers list.
Definition types.h:413
detail::types_remove< Types, T >::type types_remove_t
Definition types.h:438
detail::types_unique_impl< Types >::type types_unique_t
Alias for creating a unique types list from a types list.
Definition types.h:395
types_cat< T, U >::type types_cat_t
Alias for the concatenated types list.
Definition types.h:57
detail::types_transform_impl< Types, Transform >::type types_transform_t
Alias for transforming a types list using a transform template.
Definition types.h:404
constexpr std::size_t types_index_of_v
Gets the index of a type in a types list.
Definition types.h:423
detail::types_view< N, Types >::type types_view_t
Definition types.h:440
Concatenates two types lists.
Definition types.h:39
Provides a std::vector container.
Definition types.h:136
std::vector< T > container
Definition types.h:137
A namespace containing container templates for types lists.
Definition types.h:132
A template structure to count occurrences of a specific type in a types list.
Definition types.h:146
A structure representing a variadic list of types.
Definition types.h:20
static constexpr std::size_t size
Definition types.h:21