16#ifndef CABANA_PARAMETERPACK_HPP
17#define CABANA_PARAMETERPACK_HPP
19#include <Kokkos_Core.hpp>
35template <std::size_t N,
typename T,
typename... Types>
36struct PackTypeAtIndexImpl;
38template <
typename T,
typename... Types>
39struct PackTypeAtIndexImpl<0, T, Types...>
44template <std::size_t N,
typename T,
typename... Types>
45struct PackTypeAtIndexImpl
47 using type =
typename PackTypeAtIndexImpl<N - 1, Types...>::type;
52template <std::size_t N,
typename... Types>
56 using type =
typename PackTypeAtIndexImpl<N, Types...>
::type;
57 static_assert( N <
sizeof...( Types ),
"Type index out of bounds" );
62template <std::
size_t N,
typename T>
76template <
typename Sequence,
typename... Types>
77struct ParameterPackImpl;
79template <std::size_t... Indices,
typename... Types>
80struct ParameterPackImpl<std::index_sequence<Indices...>, Types...>
84 explicit ParameterPackImpl( Types... t )
93template <
typename... Types>
95 : ParameterPackImpl<std::make_index_sequence<sizeof...( Types )>, Types...>
99 : ParameterPackImpl<std::make_index_sequence<sizeof...( Types )>,
104 template <std::
size_t N>
108 template <std::
size_t N>
112 template <std::
size_t N>
116 static constexpr std::size_t
size =
sizeof...( Types );
122struct is_parameter_pack_impl :
public std::false_type
126template <
typename... Types>
127struct is_parameter_pack_impl<ParameterPack<Types...>> :
public std::true_type
135 :
public is_parameter_pack_impl<typename std::remove_cv<T>::type>::type
141template <std::
size_t N,
class ParameterPack_t>
142KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
144 typename ParameterPack_t::template value_type<N>&>::type
147 return static_cast<typename ParameterPack_t::template element_type<N>&
>(
153template <std::
size_t N,
class ParameterPack_t>
154KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
155 is_parameter_pack<ParameterPack_t>::value,
156 const typename ParameterPack_t::template value_type<N>&>::type
157get(
const ParameterPack_t& pp )
160 const typename ParameterPack_t::template element_type<N>&
>( pp )
166template <
typename ParameterPack_t,
typename T,
typename... Types>
167void fillParameterPackImpl( ParameterPack_t& pp,
168 const std::integral_constant<std::size_t, 0>,
169 const T& t,
const Types&... )
171 get<ParameterPack_t::size - 1>( pp ) = t;
174template <
typename ParameterPack_t, std::size_t N,
typename T,
176void fillParameterPackImpl( ParameterPack_t& pp,
177 const std::integral_constant<std::size_t, N>,
178 const T& t,
const Types&... ts )
180 get<ParameterPack_t::size - 1 - N>( pp ) = t;
181 fillParameterPackImpl( pp, std::integral_constant<std::size_t, N - 1>(),
188template <
typename ParameterPack_t,
typename... Types>
191 fillParameterPackImpl(
192 pp, std::integral_constant<std::size_t, ParameterPack_t::size - 1>(),
197template <
typename ParameterPack_t>
204template <
typename... Types>
Core: particle data structures and algorithms.
Definition Cabana_AoSoA.hpp:36
void fillParameterPack(ParameterPack_t &pp, const Types &... ts)
Definition Cabana_ParameterPack.hpp:189
ParameterPack< Types... > makeParameterPack(const Types &... ts)
Create a parameter pack.
Definition Cabana_ParameterPack.hpp:205
KOKKOS_FORCEINLINE_FUNCTION std::enable_if< is_parameter_pack< ParameterPack_t >::value, typenameParameterPack_t::templatevalue_type< N > & >::type get(ParameterPack_t &pp)
Get an element from a parameter pack.
Definition Cabana_ParameterPack.hpp:145
Get the type at the given index of a parameter pack.
Definition Cabana_ParameterPack.hpp:54
typename PackTypeAtIndexImpl< N, Types... >::type type
Packed type.
Definition Cabana_ParameterPack.hpp:56
Parameter pack element.
Definition Cabana_ParameterPack.hpp:64
value_type< N > _m
Definition Cabana_ParameterPack.hpp:71
ParameterPackElement(T value)
Ctor from variadic template args.
Definition Cabana_ParameterPack.hpp:66
Definition Cabana_ParameterPack.hpp:96
static constexpr std::size_t size
Pack size.
Definition Cabana_ParameterPack.hpp:116
typename PackTypeAtIndex< N, Types... >::type value_type
Packed type.
Definition Cabana_ParameterPack.hpp:105
typename std::add_const< value_type< N > >::type const_value_type
Packed const type.
Definition Cabana_ParameterPack.hpp:109
ParameterPackElement< N, value_type< N > > element_type
Packed element type.
Definition Cabana_ParameterPack.hpp:113
ParameterPack(Types... args)
Ctor from variadic template args.
Definition Cabana_ParameterPack.hpp:98
ParameterPack static type checker.
Definition Cabana_ParameterPack.hpp:136