1 #ifndef VERTEXCFD_PARAMETERPACK_HPP
2 #define VERTEXCFD_PARAMETERPACK_HPP
4 #include <Kokkos_Core.hpp>
21 template<std::size_t N,
typename T,
typename... Types>
22 struct PackTypeAtIndexImpl;
24 template<
typename T,
typename... Types>
30 template<std::size_t N,
typename T,
typename... Types>
36 template<std::size_t N,
typename... Types>
40 static_assert(N <
sizeof...(Types),
"Type index out of bounds");
45 template<std::
size_t N,
typename T>
54 template<
typename Sequence,
typename... Types>
57 template<std::size_t... Indices,
typename... Types>
63 template<
typename... Types>
67 template<std::
size_t N>
70 template<std::
size_t N>
71 using const_value_type =
typename std::add_const<value_type<N>>::type;
73 template<std::
size_t N>
76 static constexpr std::size_t size =
sizeof...(Types);
86 template<
typename... Types>
104 template<std::
size_t N,
class ParameterPack_t>
105 KOKKOS_FORCEINLINE_FUNCTION
106 typename std::enable_if<Utils::is_parameter_pack<ParameterPack_t>::value,
107 typename ParameterPack_t::template value_type<N>&>::type
108 get(ParameterPack_t& pp)
110 return static_cast<typename ParameterPack_t::template element_type<N>&
>(pp)
114 template<std::
size_t N,
class ParameterPack_t>
115 KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
116 Utils::is_parameter_pack<ParameterPack_t>::value,
117 typename ParameterPack_t::template const_value_type<N>&>::type
118 get(
const ParameterPack_t& pp)
120 return static_cast<const typename ParameterPack_t::template element_type<N>&
>(
131 template<
typename ParameterPack_t,
typename T,
typename... Types>
132 void fillParameterPackImpl(ParameterPack_t& pp,
133 const std::integral_constant<std::size_t, 0>,
137 get<ParameterPack_t::size - 1>(pp) = t;
140 template<
typename ParameterPack_t, std::size_t N,
typename T,
typename... Types>
141 void fillParameterPackImpl(ParameterPack_t& pp,
142 const std::integral_constant<std::size_t, N>,
146 get<ParameterPack_t::size - 1 - N>(pp) = t;
147 fillParameterPackImpl(
148 pp, std::integral_constant<std::size_t, N - 1>(), ts...);
151 template<
typename ParameterPack_t,
typename... Types>
152 void fillParameterPack(ParameterPack_t& pp,
const Types&... ts)
154 fillParameterPackImpl(
156 std::integral_constant<std::size_t, ParameterPack_t::size - 1>(),
161 template<
typename ParameterPack_t>
162 void fillParameterPack(ParameterPack_t&)
168 template<
typename... Types>
169 ParameterPack<Types...> makeParameterPack(
const Types&... ts)
171 ParameterPack<Types...> pp;
172 fillParameterPack(pp, ts...);
184 #endif // end VERTEXCFD_PARAMETERPACK_HPP