1#ifndef NNGN_UTILS_TYPES_H
2#define NNGN_UTILS_TYPES_H
4#include "utils/utils.h"
8namespace detail {
struct types_tag; }
11concept type_list = std::derived_from<T, detail::types_tag>;
16template<
typename ...Ts>
struct types_impl;
17template<type_list T>
struct types_first;
18template<type_list T>
struct types_last;
19template<type_list T>
using types_first_t =
typename types_first<T>::type;
20template<type_list T>
using types_last_t =
typename types_last<T>::type;
21template<type_list T>
using type = types_first<T>;
22template<type_list T>
using type_t = types_first_t<T>;
24template<
typename T,
typename ...Ts>
25struct types_first<types_impl<
T, Ts...>> : std::type_identity<T> {};
27template<
typename ...Ts>
28struct types_last<types_impl<Ts...>>
29 : std::type_identity<types_first_t<decltype((..., types_impl<Ts>{}))>> {};
31template<
typename ...Ts>
42template<
typename ...Ts>
using types = detail::types_impl<Ts...>;
#define FWD(...)
Definition: utils.h:18
typename types_first< T >::type types_first_t
Definition: types.h:19
typename types_last< T >::type types_last_t
Definition: types.h:20
types_first< T > type
Definition: types.h:21
types_first_t< T > type_t
Definition: types.h:22
detail::types_impl< Ts... > types
Definition: types.h:42
constexpr void map(auto &&f) const
Definition: types.h:33