Smith  0.1
Smith is an implicit thermal structural mechanics simulation code.
tuple.hpp
Go to the documentation of this file.
1 // Copyright (c) Lawrence Livermore National Security, LLC and
2 // other Smith Project Developers. See the top-level LICENSE file for
3 // details.
4 //
5 // SPDX-License-Identifier: (BSD-3-Clause)
6 
12 #pragma once
13 
14 #include "mfem.hpp"
15 
17 
18 namespace mfem::future {
19 
26 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
27  typename T8, typename T9>
28 struct tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> {
29  T0 v0;
30  T1 v1;
31  T2 v2;
32  T3 v3;
33  T4 v4;
34  T5 v5;
35  T6 v6;
36  T7 v7;
37  T8 v8;
38  T9 v9;
39 };
40 
44 template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
45  typename T8, typename T9, typename T10>
46 struct tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> {
47  T0 v0;
48  T1 v1;
49  T2 v2;
50  T3 v3;
51  T4 v4;
52  T5 v5;
53  T6 v6;
54  T7 v7;
55  T8 v8;
56  T9 v9;
57  T10 v10;
58 };
59 
60 namespace detail {
61 
63 template <int i, typename Tuple>
64 MFEM_HOST_DEVICE constexpr auto& tuple_get_extended(Tuple& values)
65 {
66  if constexpr (i == 0) {
67  return values.v0;
68  }
69  if constexpr (i == 1) {
70  return values.v1;
71  }
72  if constexpr (i == 2) {
73  return values.v2;
74  }
75  if constexpr (i == 3) {
76  return values.v3;
77  }
78  if constexpr (i == 4) {
79  return values.v4;
80  }
81  if constexpr (i == 5) {
82  return values.v5;
83  }
84  if constexpr (i == 6) {
85  return values.v6;
86  }
87  if constexpr (i == 7) {
88  return values.v7;
89  }
90  if constexpr (i == 8) {
91  return values.v8;
92  }
93  if constexpr (i == 9) {
94  return values.v9;
95  }
96  if constexpr (i == 10) {
97  return values.v10;
98  }
99  MFEM_UNREACHABLE();
100 }
101 
103 template <int i, typename Tuple>
104 MFEM_HOST_DEVICE constexpr const auto& tuple_get_extended(const Tuple& values)
105 {
106  if constexpr (i == 0) {
107  return values.v0;
108  }
109  if constexpr (i == 1) {
110  return values.v1;
111  }
112  if constexpr (i == 2) {
113  return values.v2;
114  }
115  if constexpr (i == 3) {
116  return values.v3;
117  }
118  if constexpr (i == 4) {
119  return values.v4;
120  }
121  if constexpr (i == 5) {
122  return values.v5;
123  }
124  if constexpr (i == 6) {
125  return values.v6;
126  }
127  if constexpr (i == 7) {
128  return values.v7;
129  }
130  if constexpr (i == 8) {
131  return values.v8;
132  }
133  if constexpr (i == 9) {
134  return values.v9;
135  }
136  if constexpr (i == 10) {
137  return values.v10;
138  }
139  MFEM_UNREACHABLE();
140 }
141 
142 } // namespace detail
143 
145 template <int i, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
146  typename T8, typename T9>
147 MFEM_HOST_DEVICE constexpr auto& get(tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& values)
148 {
149  static_assert(i < 10);
150  return detail::tuple_get_extended<i>(values);
151 }
152 
154 template <int i, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
155  typename T8, typename T9, typename T10>
156 MFEM_HOST_DEVICE constexpr auto& get(tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& values)
157 {
158  static_assert(i < 11);
159  return detail::tuple_get_extended<i>(values);
160 }
161 
163 template <int i, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
164  typename T8, typename T9>
165 MFEM_HOST_DEVICE constexpr const auto& get(const tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& values)
166 {
167  static_assert(i < 10);
168  return detail::tuple_get_extended<i>(values);
169 }
170 
172 template <int i, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
173  typename T8, typename T9, typename T10>
174 MFEM_HOST_DEVICE constexpr const auto& get(const tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& values)
175 {
176  static_assert(i < 11);
177  return detail::tuple_get_extended<i>(values);
178 }
179 
199 template <int i, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
200  typename T8, typename T9>
201 MFEM_HOST_DEVICE constexpr auto type(const tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9>& values)
202 {
203  static_assert(i < 10);
204  return detail::tuple_get_extended<i>(values);
205 }
206 
227 template <int i, typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7,
228  typename T8, typename T9, typename T10>
229 MFEM_HOST_DEVICE constexpr auto type(const tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& values)
230 {
231  static_assert(i < 11);
232  return detail::tuple_get_extended<i>(values);
233 }
234 
235 } // namespace mfem::future
236 
237 namespace smith {
238 
240 template <typename... T>
242 
244 using mfem::future::apply;
246 using mfem::future::get;
248 using mfem::future::make_tuple;
250 using mfem::future::type;
251 
253 template <class... Types>
255 
257 template <size_t I, class T>
258 using tuple_element = mfem::future::tuple_element<I, T>;
259 
261 template <typename T>
262 using is_tuple = mfem::future::is_tuple<T>;
263 
265 template <typename T>
266 using is_tuple_of_tuples = mfem::future::is_tuple_of_tuples<T>;
267 
268 } // namespace smith
269 
270 #include "smith/numerics/functional/tuple_tensor_dual_functions.hpp"
This file contains the interface used for initializing/terminating any hardware accelerator-related f...
constexpr auto get(std::integer_sequence< int, n... >)
return the Ith integer in {n...}
Accelerator functionality.
Definition: smith.cpp:36
mfem::future::is_tuple_of_tuples< T > is_tuple_of_tuples
Alias for the MFEM nested tuple detection trait.
Definition: tuple.hpp:266
mfem::future::is_tuple< T > is_tuple
Alias for the MFEM tuple detection trait.
Definition: tuple.hpp:262
mfem::future::tuple_size< Types... > tuple_size
Alias for the MFEM tuple size trait.
Definition: tuple.hpp:254
mfem::future::tuple< T... > tuple
Expose MFEM tuple in the Smith namespace.
Definition: tuple.hpp:241
mfem::future::tuple_element< I, T > tuple_element
Alias for the MFEM tuple element trait.
Definition: tuple.hpp:258
Smith compatibility extension for the MFEM tuple implementation.
Definition: tuple.hpp:46
Smith compatibility extension for the MFEM tuple implementation.
Definition: tuple.hpp:28
constexpr MFEM_HOST_DEVICE auto & tuple_get_extended(Tuple &values)
Return element i from a 10- or 11-element tuple.
Definition: tuple.hpp:64
constexpr MFEM_HOST_DEVICE auto type(const tuple< T0, T1, T2, T3, T4, T5, T6, T7, T8, T9 > &values)
a function intended to be used for extracting the ith type from a tuple.
Definition: tuple.hpp:201