Skip to content

Commit edb0c7c

Browse files
authored
Allow ParameterPack to be constructed from elements that are not default constructible (#855)
* ctor in ParameterPack that copies elements * makeParameterPack should use ctor directly and not require default constructability * test construction and filling separately
1 parent 8fb4b3e commit edb0c7c

File tree

2 files changed

+59
-8
lines changed

2 files changed

+59
-8
lines changed

core/src/Cabana_ParameterPack.hpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ struct PackTypeAtIndex
6262
template <std::size_t N, typename T>
6363
struct ParameterPackElement
6464
{
65+
//! Ctor from variadic template args
66+
explicit ParameterPackElement( T value )
67+
: _m( value )
68+
{
69+
}
6570
//! Packed element.
6671
T _m;
6772
};
@@ -75,6 +80,11 @@ template <std::size_t... Indices, typename... Types>
7580
struct ParameterPackImpl<std::index_sequence<Indices...>, Types...>
7681
: ParameterPackElement<Indices, Types>...
7782
{
83+
//! Ctor from variadic template args
84+
explicit ParameterPackImpl( Types... t )
85+
: ParameterPackElement<Indices, Types>( t )...
86+
{
87+
}
7888
};
7989
//! \endcond
8090

@@ -84,6 +94,12 @@ template <typename... Types>
8494
struct ParameterPack
8595
: ParameterPackImpl<std::make_index_sequence<sizeof...( Types )>, Types...>
8696
{
97+
//! Ctor from variadic template args
98+
explicit ParameterPack( Types... args )
99+
: ParameterPackImpl<std::make_index_sequence<sizeof...( Types )>,
100+
Types...>( args... )
101+
{
102+
}
87103
//! Packed type.
88104
template <std::size_t N>
89105
using value_type = typename PackTypeAtIndex<N, Types...>::type;
@@ -188,8 +204,7 @@ void fillParameterPack( ParameterPack_t& )
188204
template <typename... Types>
189205
ParameterPack<Types...> makeParameterPack( const Types&... ts )
190206
{
191-
ParameterPack<Types...> pp;
192-
fillParameterPack( pp, ts... );
207+
ParameterPack pp( ts... );
193208
return pp;
194209
}
195210

core/unit_test/tstParameterPack.hpp

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,17 @@
1717

1818
namespace Test
1919
{
20+
namespace
21+
{
22+
struct NonDefaultConstructableType
23+
{
24+
explicit NonDefaultConstructableType( int i )
25+
: value( i )
26+
{
27+
}
28+
int value;
29+
};
30+
} // namespace
2031

2132
//---------------------------------------------------------------------------//
2233
void captureTest()
@@ -25,18 +36,20 @@ void captureTest()
2536
Kokkos::View<double[1], TEST_MEMSPACE> dbl_view( "dbl_view" );
2637
Kokkos::View<int[1][1], TEST_MEMSPACE> int_view( "int_view" );
2738

28-
// Make a parameter pack so we can capture them as a group.
29-
auto pack = Cabana::makeParameterPack( dbl_view, int_view );
39+
// Make a parameter pack via the ctor so we can capture them as a group.
40+
auto pack = Cabana::makeParameterPack( dbl_view, int_view,
41+
NonDefaultConstructableType{ 1 } );
3042

3143
// Update the pack in a kernel
3244
Kokkos::parallel_for(
3345
"fill_pack", Kokkos::RangePolicy<TEST_EXECSPACE>( 0, 1 ),
3446
KOKKOS_LAMBDA( const int ) {
3547
auto dv = Cabana::get<0>( pack );
3648
auto iv = Cabana::get<1>( pack );
49+
auto ndc = Cabana::get<2>( pack );
3750

38-
dv( 0 ) = 3.14;
39-
iv( 0, 0 ) = 12;
51+
dv( 0 ) = 2. * ndc.value;
52+
iv( 0, 0 ) = 2 * ndc.value;
4053
} );
4154

4255
// Check the capture.
@@ -45,8 +58,31 @@ void captureTest()
4558
auto int_host =
4659
Kokkos::create_mirror_view_and_copy( Kokkos::HostSpace(), int_view );
4760

48-
EXPECT_DOUBLE_EQ( dbl_host( 0 ), 3.14 );
49-
EXPECT_EQ( int_host( 0, 0 ), 12 );
61+
EXPECT_DOUBLE_EQ( dbl_host( 0 ), 2. * 1 );
62+
EXPECT_EQ( int_host( 0, 0 ), 2 * 1 );
63+
64+
Cabana::fillParameterPack( pack, dbl_view, int_view,
65+
NonDefaultConstructableType{ 3 } );
66+
// Update the pack in a kernel
67+
Kokkos::parallel_for(
68+
"fill_pack", Kokkos::RangePolicy<TEST_EXECSPACE>( 0, 1 ),
69+
KOKKOS_LAMBDA( const int ) {
70+
auto dv = Cabana::get<0>( pack );
71+
auto iv = Cabana::get<1>( pack );
72+
auto ndc = Cabana::get<2>( pack );
73+
74+
dv( 0 ) = 2. * ndc.value;
75+
iv( 0, 0 ) = 2 * ndc.value;
76+
} );
77+
78+
// Check the capture.
79+
dbl_host =
80+
Kokkos::create_mirror_view_and_copy( Kokkos::HostSpace(), dbl_view );
81+
int_host =
82+
Kokkos::create_mirror_view_and_copy( Kokkos::HostSpace(), int_view );
83+
84+
EXPECT_DOUBLE_EQ( dbl_host( 0 ), 2. * 3 );
85+
EXPECT_EQ( int_host( 0, 0 ), 2 * 3 );
5086
}
5187

5288
//---------------------------------------------------------------------------//

0 commit comments

Comments
 (0)