Cabana 0.8.0-dev
 
Loading...
Searching...
No Matches
Cabana_ParameterPack.hpp
Go to the documentation of this file.
1/****************************************************************************
2 * Copyright (c) 2018-2023 by the Cabana authors *
3 * All rights reserved. *
4 * *
5 * This file is part of the Cabana library. Cabana is distributed under a *
6 * BSD 3-clause license. For the licensing terms see the LICENSE file in *
7 * the top-level directory. *
8 * *
9 * SPDX-License-Identifier: BSD-3-Clause *
10 ****************************************************************************/
11
16#ifndef CABANA_PARAMETERPACK_HPP
17#define CABANA_PARAMETERPACK_HPP
18
19#include <Kokkos_Core.hpp>
20
21#include <type_traits>
22#include <utility>
23
24namespace Cabana
25{
26//---------------------------------------------------------------------------//
27// Parameter pack device capture.
28//
29// NOTE: In general this would not be needed but NVCC cannot capture parameter
30// packs in lambda functions hence we need to wrap them in something that can
31// be captured.
32//---------------------------------------------------------------------------//
33
35template <std::size_t N, typename T, typename... Types>
36struct PackTypeAtIndexImpl;
37
38template <typename T, typename... Types>
39struct PackTypeAtIndexImpl<0, T, Types...>
40{
41 using type = T;
42};
43
44template <std::size_t N, typename T, typename... Types>
45struct PackTypeAtIndexImpl
46{
47 using type = typename PackTypeAtIndexImpl<N - 1, Types...>::type;
48};
50
52template <std::size_t N, typename... Types>
54{
56 using type = typename PackTypeAtIndexImpl<N, Types...>::type;
57 static_assert( N < sizeof...( Types ), "Type index out of bounds" );
58};
59
60//---------------------------------------------------------------------------//
62template <std::size_t N, typename T>
64{
66 T _m;
67};
68
69//---------------------------------------------------------------------------//
71template <typename Sequence, typename... Types>
72struct ParameterPackImpl;
73
74template <std::size_t... Indices, typename... Types>
75struct ParameterPackImpl<std::index_sequence<Indices...>, Types...>
76 : ParameterPackElement<Indices, Types>...
77{
78};
80
83template <typename... Types>
85 : ParameterPackImpl<std::make_index_sequence<sizeof...( Types )>, Types...>
86{
88 template <std::size_t N>
89 using value_type = typename PackTypeAtIndex<N, Types...>::type;
90
92 template <std::size_t N>
93 using const_value_type = typename std::add_const<value_type<N>>::type;
94
96 template <std::size_t N>
98
100 static constexpr std::size_t size = sizeof...( Types );
101};
102
103//---------------------------------------------------------------------------//
105template <class>
106struct is_parameter_pack_impl : public std::false_type
107{
108};
109
110template <typename... Types>
111struct is_parameter_pack_impl<ParameterPack<Types...>> : public std::true_type
112{
113};
115
117template <class T>
119 : public is_parameter_pack_impl<typename std::remove_cv<T>::type>::type
120{
121};
122
123//---------------------------------------------------------------------------//
125template <std::size_t N, class ParameterPack_t>
126KOKKOS_FORCEINLINE_FUNCTION typename std::enable_if<
128 typename ParameterPack_t::template value_type<N>&>::type
129get( ParameterPack_t& pp )
130{
131 return static_cast<typename ParameterPack_t::template element_type<N>&>(
132 pp )
133 ._m;
134}
135
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 )
142{
143 return static_cast<
144 const typename ParameterPack_t::template element_type<N>&>( pp )
145 ._m;
146}
147
148//---------------------------------------------------------------------------//
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&... )
154{
155 get<ParameterPack_t::size - 1>( pp ) = t;
156}
157
158template <typename ParameterPack_t, std::size_t N, typename T,
159 typename... Types>
160void fillParameterPackImpl( ParameterPack_t& pp,
161 const std::integral_constant<std::size_t, N>,
162 const T& t, const Types&... ts )
163{
164 get<ParameterPack_t::size - 1 - N>( pp ) = t;
165 fillParameterPackImpl( pp, std::integral_constant<std::size_t, N - 1>(),
166 ts... );
167}
169
172template <typename ParameterPack_t, typename... Types>
173void fillParameterPack( ParameterPack_t& pp, const Types&... ts )
174{
175 fillParameterPackImpl(
176 pp, std::integral_constant<std::size_t, ParameterPack_t::size - 1>(),
177 ts... );
178}
179
181template <typename ParameterPack_t>
182void fillParameterPack( ParameterPack_t& )
183{
184}
185
186//---------------------------------------------------------------------------//
188template <typename... Types>
189ParameterPack<Types...> makeParameterPack( const Types&... ts )
190{
191 ParameterPack<Types...> pp;
192 fillParameterPack( pp, ts... );
193 return pp;
194}
195
196//---------------------------------------------------------------------------//
197
198} // end namespace Cabana
199
200#endif // end CABANA_PARAMETERPACK_HPP
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