ttg 1.0.0
Template Task Graph (TTG): flowgraph-based programming model for high-performance distributed-memory algorithms
Loading...
Searching...
No Matches
typelist.h
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-3-Clause
2#ifndef TTG_UTIL_INPUTTYPES_H
3#define TTG_UTIL_INPUTTYPES_H
4
5#include <tuple>
6
7namespace ttg {
8
9 namespace meta {
10
11 template <typename T>
13 using type = T;
14 };
15
24 template <typename... Ts>
25 struct typelist {
27 constexpr auto size() const { return sizeof...(Ts); }
28
29 template <std::size_t I>
30 constexpr auto get() const {
31 return type_identity<std::tuple_element_t<I, std::tuple<Ts...>>>{};
32 }
33 };
34
35 template <typename T>
36 struct is_typelist : std::false_type {};
37
38 template <typename... Ts>
39 struct is_typelist<typelist<Ts...>> : std::true_type {};
40
41 template <typename T>
43
44 template <typename T>
46
47 template <typename... T>
49 using type = std::tuple<T...>;
50 };
51
52 template <typename T>
54
55 template <typename T>
57
58 template <typename... Ts>
60 constexpr static std::size_t value = sizeof...(Ts);
61 };
62
63 template <typename T>
65
66 template <typename T>
67 constexpr bool typelist_is_empty_v = (typelist_size_v<T> == 0);
68
69 template <typename T>
70 struct typelist_is_empty : std::bool_constant<typelist_is_empty_v<T>> {};
71
72 template <typename T>
74
75 template <typename T>
76 struct typelist_is_not_empty : std::bool_constant<typelist_is_not_empty_v<T>> {};
77
78 } // namespace meta
79
80 // typelist is user-centric API
81 template <typename... Ts>
82 using typelist = meta::typelist<Ts...>;
83
84} // namespace ttg
85
86namespace std {
87
88 template <typename... Ts>
89 struct tuple_size<ttg::meta::typelist<Ts...>> {
90 static constexpr auto value = sizeof...(Ts);
91 };
92
93 template <std::size_t I, typename... Ts>
94 struct tuple_element<I, ttg::meta::typelist<Ts...>> {
95 using type = typename decltype(ttg::meta::typelist<Ts...>{}.template get<I>())::type;
96 };
97
98} // namespace std
99
100namespace ttg::meta {
101 template <std::size_t I, typename T, typename... RestOfTs>
103 if constexpr (I == 0)
104 return type_identity<T>{};
105 else
106 return get<I - 1>(typelist<RestOfTs...>{});
107 }
108} // namespace ttg::meta
109
110#endif // TTG_UTIL_INPUTTYPES_H
STL namespace.
constexpr bool typelist_is_empty_v
Definition typelist.h:67
constexpr bool is_typelist_v
Definition typelist.h:42
constexpr std::size_t typelist_size_v
Definition typelist.h:64
constexpr bool typelist_is_not_empty_v
Definition typelist.h:73
typename typelist_to_tuple< T >::type typelist_to_tuple_t
Definition typelist.h:53
constexpr auto get(typelist< T, RestOfTs... >)
Definition typelist.h:102
top-level TTG namespace contains runtime-neutral functionality
Definition keymap.h:9
typename decltype(ttg::meta::typelist< Ts... >{}.template get< I >())::type type
Definition typelist.h:95
A container for types.
Definition typelist.h:25
constexpr auto size() const
Definition typelist.h:27
constexpr auto get() const
Definition typelist.h:30