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 explicit ParameterPackElement( T value )
67 : _m( value )
68 {
69 }
70
71 T _m;
72};
73
74//---------------------------------------------------------------------------//
76template <typename Sequence, typename... Types>
77struct ParameterPackImpl;
78
79template <std::size_t... Indices, typename... Types>
80struct ParameterPackImpl<std::index_sequence<Indices...>, Types...>
81 : ParameterPackElement<Indices, Types>...
82{
84 explicit ParameterPackImpl( Types... t )
85 : ParameterPackElement<Indices, Types>( t )...
86 {
87 }
88};
90
93template <typename... Types>
95 : ParameterPackImpl<std::make_index_sequence<sizeof...( Types )>, Types...>
96{
98 explicit ParameterPack( Types... args )
99 : ParameterPackImpl<std::make_index_sequence<sizeof...( Types )>,
100 Types...>( args... )
101 {
102 }
103
104 template <std::size_t N>
105 using value_type = typename PackTypeAtIndex<N, Types...>::type;
106
108 template <std::size_t N>
109 using const_value_type = typename std::add_const<value_type<N>>::type;
110
112 template <std::size_t N>
114
116 static constexpr std::size_t size = sizeof...( Types );
117};
118
119//---------------------------------------------------------------------------//
121template <class>
122struct is_parameter_pack_impl : public std::false_type
123{
124};
125
126template <typename... Types>
127struct is_parameter_pack_impl<ParameterPack<Types...>> : public std::true_type
128{
129};
131
133template <class T>
135 : public is_parameter_pack_impl<typename std::remove_cv<T>::type>::type
136{
137};
138
139//---------------------------------------------------------------------------//
141template <std::size_t N, class ParameterPack_t>
142KOKKOS_FORCEINLINE_FUNCTION typename std::enable_if<
144 typename ParameterPack_t::template value_type<N>&>::type
145get( ParameterPack_t& pp )
146{
147 return static_cast<typename ParameterPack_t::template element_type<N>&>(
148 pp )
149 ._m;
150}
151
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 )
158{
159 return static_cast<
160 const typename ParameterPack_t::template element_type<N>&>( pp )
161 ._m;
162}
163
164//---------------------------------------------------------------------------//
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&... )
170{
171 get<ParameterPack_t::size - 1>( pp ) = t;
172}
173
174template <typename ParameterPack_t, std::size_t N, typename T,
175 typename... Types>
176void fillParameterPackImpl( ParameterPack_t& pp,
177 const std::integral_constant<std::size_t, N>,
178 const T& t, const Types&... ts )
179{
180 get<ParameterPack_t::size - 1 - N>( pp ) = t;
181 fillParameterPackImpl( pp, std::integral_constant<std::size_t, N - 1>(),
182 ts... );
183}
185
188template <typename ParameterPack_t, typename... Types>
189void fillParameterPack( ParameterPack_t& pp, const Types&... ts )
190{
191 fillParameterPackImpl(
192 pp, std::integral_constant<std::size_t, ParameterPack_t::size - 1>(),
193 ts... );
194}
195
197template <typename ParameterPack_t>
198void fillParameterPack( ParameterPack_t& )
199{
200}
201
202//---------------------------------------------------------------------------//
204template <typename... Types>
205ParameterPack<Types...> makeParameterPack( const Types&... ts )
206{
207 ParameterPack pp( ts... );
208 return pp;
209}
210
211//---------------------------------------------------------------------------//
212
213} // end namespace Cabana
214
215#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: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