Ginkgo  Generated from pipelines/1554403166 branch based on develop. Ginkgo version 1.9.0
A numerical linear algebra library targeting many-core architectures
containers.hpp
1 // SPDX-FileCopyrightText: 2017 - 2024 The Ginkgo authors
2 //
3 // SPDX-License-Identifier: BSD-3-Clause
4 
5 #ifndef GKO_PUBLIC_CORE_SYNTHESIZER_CONTAINERS_HPP_
6 #define GKO_PUBLIC_CORE_SYNTHESIZER_CONTAINERS_HPP_
7 
8 
9 #include <array>
10 #include <type_traits>
11 
12 
13 namespace gko {
19 namespace syn {
20 
21 
28 template <typename T, T... Values>
29 struct value_list {};
30 
31 
37 template <typename... Types>
38 struct type_list {};
39 
40 
48 template <int Start, int End, int Step = 1>
49 struct range {};
50 
51 
52 namespace detail {
53 
54 
61 template <typename List1, typename List2>
62 struct concatenate_impl;
63 
71 template <typename T, T... Values1, T... Values2>
72 struct concatenate_impl<value_list<T, Values1...>, value_list<T, Values2...>> {
73  using type = value_list<T, Values1..., Values2...>;
74 };
75 
76 
77 } // namespace detail
78 
79 
86 template <typename List1, typename List2>
87 using concatenate = typename detail::concatenate_impl<List1, List2>::type;
88 
89 
90 namespace detail {
91 
92 
98 template <typename T, typename = void>
99 struct as_list_impl;
100 
107 template <typename T, T... Values>
108 struct as_list_impl<value_list<T, Values...>> {
109  using type = value_list<T, Values...>;
110 };
111 
117 template <typename... Types>
118 struct as_list_impl<type_list<Types...>> {
119  using type = type_list<Types...>;
120 };
121 
130 template <int Start, int End, int Step>
131 struct as_list_impl<range<Start, End, Step>, std::enable_if_t<(Start < End)>> {
132  using type = concatenate<
134  typename as_list_impl<range<Start + Step, End, Step>>::type>;
135 };
136 
144 template <int Start, int End, int Step>
145 struct as_list_impl<range<Start, End, Step>, std::enable_if_t<(Start >= End)>> {
146  using type = value_list<int>;
147 };
148 
149 
150 } // namespace detail
151 
152 
159 template <typename T>
160 using as_list = typename detail::as_list_impl<T>::type;
161 
162 
174 template <typename T, T... Value>
175 constexpr std::array<T, sizeof...(Value)> as_array(value_list<T, Value...> vl)
176 {
177  return std::array<T, sizeof...(Value)>{Value...};
178 }
179 
180 
181 } // namespace syn
182 } // namespace gko
183 
184 
185 #endif // GKO_PUBLIC_CORE_SYNTHESIZER_CONTAINERS_HPP_
gko::syn::as_list
typename detail::as_list_impl< T >::type as_list
as_list<T> gives the alias type of as_list_impl<T>::type.
Definition: containers.hpp:160
gko::syn::type_list
type_list records several types in template
Definition: containers.hpp:38
gko::layout_type::array
The matrix should be written as dense matrix in column-major order.
gko::syn::as_array
constexpr std::array< T, sizeof...(Value)> as_array(value_list< T, Value... > vl)
as_array<T> returns the array from value_list.
Definition: containers.hpp:175
gko::syn::value_list
value_list records several values with the same type in template.
Definition: containers.hpp:29
gko::syn::range
range records start, end, step in template
Definition: containers.hpp:49
gko
The Ginkgo namespace.
Definition: abstract_factory.hpp:20
gko::syn::concatenate
typename detail::concatenate_impl< List1, List2 >::type concatenate
concatenate combines two value_list into one value_list.
Definition: containers.hpp:87