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>
71template <
typename Sequence,
typename... Types>
72struct ParameterPackImpl;
74template <std::size_t... Indices,
typename... Types>
75struct ParameterPackImpl<std::index_sequence<Indices...>, Types...>
83template <
typename... Types>
85 : ParameterPackImpl<std::make_index_sequence<sizeof...( Types )>, Types...>
88 template <std::
size_t N>
92 template <std::
size_t N>
96 template <std::
size_t N>
100 static constexpr std::size_t
size =
sizeof...( Types );
106struct is_parameter_pack_impl :
public std::false_type
110template <
typename... Types>
111struct is_parameter_pack_impl<ParameterPack<Types...>> :
public std::true_type
119 :
public is_parameter_pack_impl<typename std::remove_cv<T>::type>::type
125template <std::
size_t N,
class ParameterPack_t>
126KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
128 typename ParameterPack_t::template value_type<N>&>::type
131 return static_cast<typename ParameterPack_t::template element_type<N>&
>(
137template <std::
size_t N,
class ParameterPack_t>
138KOKKOS_FORCEINLINE_FUNCTION
typename std::enable_if<
139 is_parameter_pack<ParameterPack_t>::value,
140 const typename ParameterPack_t::template value_type<N>&>::type
141get(
const ParameterPack_t& pp )
144 const typename ParameterPack_t::template element_type<N>&
>( pp )
150template <
typename ParameterPack_t,
typename T,
typename... Types>
151void fillParameterPackImpl( ParameterPack_t& pp,
152 const std::integral_constant<std::size_t, 0>,
153 const T& t,
const Types&... )
155 get<ParameterPack_t::size - 1>( pp ) = t;
158template <
typename ParameterPack_t, std::size_t N,
typename T,
160void fillParameterPackImpl( ParameterPack_t& pp,
161 const std::integral_constant<std::size_t, N>,
162 const T& t,
const Types&... ts )
164 get<ParameterPack_t::size - 1 - N>( pp ) = t;
165 fillParameterPackImpl( pp, std::integral_constant<std::size_t, N - 1>(),
172template <
typename ParameterPack_t,
typename... Types>
175 fillParameterPackImpl(
176 pp, std::integral_constant<std::size_t, ParameterPack_t::size - 1>(),
181template <
typename ParameterPack_t>
188template <
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:173
ParameterPack< Types... > makeParameterPack(const Types &... ts)
Create a parameter pack.
Definition Cabana_ParameterPack.hpp:189
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:129
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:66
Definition Cabana_ParameterPack.hpp:86
static constexpr std::size_t size
Pack size.
Definition Cabana_ParameterPack.hpp:100
typename PackTypeAtIndex< N, Types... >::type value_type
Packed type.
Definition Cabana_ParameterPack.hpp:89
typename std::add_const< value_type< N > >::type const_value_type
Packed const type.
Definition Cabana_ParameterPack.hpp:93
ParameterPackElement< N, value_type< N > > element_type
Packed element type.
Definition Cabana_ParameterPack.hpp:97
ParameterPack static type checker.
Definition Cabana_ParameterPack.hpp:120