Skip to content

Commit 23760f3

Browse files
authored
Add a constructor from std::array to DiscreteElement and DiscreteVector (#969)
* Add a constructor from std::array to DiscreteElement and DiscreteVector * Remove redundant static_assert
1 parent e36e5ba commit 23760f3

File tree

7 files changed

+138
-16
lines changed

7 files changed

+138
-16
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ target_sources(
140140
include/ddc/detail/tagged_vector.hpp
141141
include/ddc/detail/type_seq.hpp
142142
include/ddc/detail/type_traits.hpp
143+
include/ddc/detail/utils.hpp
143144
include/ddc/aligned_allocator.hpp
144145
include/ddc/chunk.hpp
145146
include/ddc/chunk_common.hpp

include/ddc/ddc.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ namespace ddc {
3939
#include "detail/macros.hpp"
4040
#include "detail/tagged_vector.hpp"
4141
#include "detail/type_seq.hpp"
42+
#include "detail/utils.hpp"
4243

4344
#include "real_type.hpp"
4445
#include "scope_guard.hpp"

include/ddc/detail/utils.hpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright (C) The DDC development team, see COPYRIGHT.md file
2+
//
3+
// SPDX-License-Identifier: MIT
4+
5+
#pragma once
6+
7+
#include <array>
8+
#include <cstddef>
9+
#include <type_traits>
10+
#include <utility>
11+
12+
#include <Kokkos_Macros.hpp>
13+
14+
namespace ddc::detail {
15+
16+
template <class OutputType, class InputType, std::size_t... Idx>
17+
KOKKOS_FUNCTION constexpr std::array<OutputType, sizeof...(Idx)> convert_array_to(
18+
std::array<InputType, sizeof...(Idx)> const& values,
19+
std::index_sequence<Idx...>) noexcept
20+
{
21+
static_assert(std::is_convertible_v<InputType, OutputType>);
22+
if constexpr (std::is_same_v<InputType, OutputType>) {
23+
return values;
24+
} else {
25+
return {static_cast<OutputType>(std::get<Idx>(values))...};
26+
}
27+
}
28+
29+
} // namespace ddc::detail

include/ddc/discrete_element.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "detail/macros.hpp"
1616
#include "detail/type_seq.hpp"
17+
#include "detail/utils.hpp"
1718

1819
#include "discrete_vector.hpp"
1920

@@ -190,6 +191,17 @@ class DiscreteElement
190191
{
191192
}
192193

194+
template <
195+
class IntegerType,
196+
class = std::enable_if_t<std::is_convertible_v<IntegerType, DiscreteElementType>>>
197+
KOKKOS_FUNCTION constexpr explicit DiscreteElement(
198+
std::array<IntegerType, sizeof...(Tags)> const& values) noexcept
199+
: m_values(
200+
detail::convert_array_to<
201+
DiscreteElementType>(values, std::make_index_sequence<sizeof...(Tags)>()))
202+
{
203+
}
204+
193205
template <
194206
class... Params,
195207
class = std::enable_if_t<(!is_discrete_element_v<Params> && ...)>,

include/ddc/discrete_vector.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "detail/macros.hpp"
1616
#include "detail/type_seq.hpp"
17+
#include "detail/utils.hpp"
1718

1819
namespace ddc {
1920

@@ -300,6 +301,18 @@ class DiscreteVector : public detail::DiscreteVectorConversionOperators<Discrete
300301
{
301302
}
302303

304+
template <
305+
class IntegerType,
306+
class = std::enable_if_t<std::is_convertible_v<IntegerType, DiscreteVectorElement>>>
307+
KOKKOS_FUNCTION constexpr explicit DiscreteVector(
308+
std::array<IntegerType, sizeof...(Tags)> const& values) noexcept
309+
: m_values(
310+
detail::convert_array_to<DiscreteVectorElement>(
311+
values,
312+
std::make_index_sequence<sizeof...(Tags)>()))
313+
{
314+
}
315+
303316
template <
304317
class... Params,
305318
class = std::enable_if_t<(!is_discrete_vector_v<Params> && ...)>,

tests/discrete_element.cpp

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,47 @@ using DVectXYZ = ddc::DiscreteVector<DDimX, DDimY, DDimZ>;
4444

4545
} // namespace anonymous_namespace_workaround_discrete_element_cpp
4646

47+
TEST(DiscreteElementXYTest, ValueConstructor)
48+
{
49+
DElemXY const ixy {};
50+
EXPECT_EQ(ixy.uid<DDimX>(), ddc::DiscreteElementType());
51+
EXPECT_EQ(ixy.uid<DDimY>(), ddc::DiscreteElementType());
52+
}
53+
54+
TEST(DiscreteElementXYTest, ConstructorFromIntegersWithoutConversion)
55+
{
56+
ddc::DiscreteElementType const uid_x = 7;
57+
ddc::DiscreteElementType const uid_y = 13;
58+
DElemXY const ixy(uid_x, uid_y);
59+
EXPECT_EQ(ixy.uid<DDimX>(), uid_x);
60+
EXPECT_EQ(ixy.uid<DDimY>(), uid_y);
61+
}
62+
63+
TEST(DiscreteElementXYTest, ConstructorFromIntegersWithConversion)
64+
{
65+
short const uid_x = 7;
66+
short const uid_y = 13;
67+
DElemXY const ixy(uid_x, uid_y);
68+
EXPECT_EQ(ixy.uid<DDimX>(), uid_x);
69+
EXPECT_EQ(ixy.uid<DDimY>(), uid_y);
70+
}
71+
72+
TEST(DiscreteElementXYTest, ConstructorFromArrayWithoutConversion)
73+
{
74+
std::array<ddc::DiscreteElementType, 2> const uids {7, 13};
75+
DElemXY const ixy(uids);
76+
EXPECT_EQ(ixy.uid<DDimX>(), uids[0]);
77+
EXPECT_EQ(ixy.uid<DDimY>(), uids[1]);
78+
}
79+
80+
TEST(DiscreteElementXYTest, ConstructorFromArrayWithConversion)
81+
{
82+
std::array<short, 2> const uids {7, 13};
83+
DElemXY const ixy(uids);
84+
EXPECT_EQ(ixy.uid<DDimX>(), uids[0]);
85+
EXPECT_EQ(ixy.uid<DDimY>(), uids[1]);
86+
}
87+
4788
TEST(DiscreteElementXYZTest, ConstructorFromDiscreteElements)
4889
{
4990
ddc::DiscreteElementType const uid_x = 7;
@@ -134,22 +175,6 @@ TEST(DiscreteElementXTest, BinaryOperatorMinus)
134175
EXPECT_EQ(ddc::get<DDimX>(dv2_x), dv_x);
135176
}
136177

137-
TEST(DiscreteElementXYTest, ValueConstructor)
138-
{
139-
DElemXY const ixy {};
140-
EXPECT_EQ(ixy.uid<DDimX>(), ddc::DiscreteElementType());
141-
EXPECT_EQ(ixy.uid<DDimY>(), ddc::DiscreteElementType());
142-
}
143-
144-
TEST(DiscreteElementXYTest, UntaggedConstructor)
145-
{
146-
ddc::DiscreteElementType const uid_x = 7;
147-
ddc::DiscreteElementType const uid_y = 13;
148-
DElemXY const ixy(uid_x, uid_y);
149-
EXPECT_EQ(ixy.uid<DDimX>(), uid_x);
150-
EXPECT_EQ(ixy.uid<DDimY>(), uid_y);
151-
}
152-
153178
TEST(DiscreteElementXYTest, RightExternalBinaryOperatorPlus)
154179
{
155180
ddc::DiscreteElementType const uid_x = 7;

tests/discrete_vector.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,47 @@ using DVectXYZ = ddc::DiscreteVector<DDimX, DDimY, DDimZ>;
3535

3636
} // namespace anonymous_namespace_workaround_discrete_vector_cpp
3737

38+
TEST(DiscreteVectorXZTest, ValueConstructor)
39+
{
40+
DVectXZ const ixz {};
41+
EXPECT_EQ(ixz.get<DDimX>(), ddc::DiscreteVectorElement());
42+
EXPECT_EQ(ixz.get<DDimZ>(), ddc::DiscreteVectorElement());
43+
}
44+
45+
TEST(DiscreteVectorXZTest, ConstructorFromIntegersWithoutConversion)
46+
{
47+
ddc::DiscreteVectorElement const dv_x = 7;
48+
ddc::DiscreteVectorElement const dv_z = 13;
49+
DVectXZ const ixz(dv_x, dv_z);
50+
EXPECT_EQ(ixz.get<DDimX>(), dv_x);
51+
EXPECT_EQ(ixz.get<DDimZ>(), dv_z);
52+
}
53+
54+
TEST(DiscreteVectorXZTest, ConstructorFromIntegersWithConversion)
55+
{
56+
short const dv_x = 7;
57+
short const dv_z = 13;
58+
DVectXZ const ixz(dv_x, dv_z);
59+
EXPECT_EQ(ixz.get<DDimX>(), dv_x);
60+
EXPECT_EQ(ixz.get<DDimZ>(), dv_z);
61+
}
62+
63+
TEST(DiscreteVectorXZTest, ConstructorFromArrayWithoutConversion)
64+
{
65+
std::array<ddc::DiscreteVectorElement, 2> const dvs {7, 13};
66+
DVectXZ const ixz(dvs);
67+
EXPECT_EQ(ixz.get<DDimX>(), dvs[0]);
68+
EXPECT_EQ(ixz.get<DDimZ>(), dvs[1]);
69+
}
70+
71+
TEST(DiscreteVectorXZTest, ConstructorFromArrayWithConversion)
72+
{
73+
std::array<short, 2> const dvs {7, 13};
74+
DVectXZ const ixz(dvs);
75+
EXPECT_EQ(ixz.get<DDimX>(), dvs[0]);
76+
EXPECT_EQ(ixz.get<DDimZ>(), dvs[1]);
77+
}
78+
3879
TEST(DiscreteVectorXYZTest, ConstructorFromDiscreteVectors)
3980
{
4081
ddc::DiscreteVectorElement const dv_x = 7;

0 commit comments

Comments
 (0)