Skip to content

Commit 8b65e04

Browse files
authored
Enforce that the dimensions passed to discrete element, vector and domain are unique (CExA-project#972)
* Enforce that the dimensions passed to discrete element, vector and domain are unique * Introduce a `type_seq_is_unique` trait
1 parent 23760f3 commit 8b65e04

File tree

7 files changed

+45
-0
lines changed

7 files changed

+45
-0
lines changed

include/ddc/detail/type_seq.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,9 @@ constexpr bool in_tags_v = false;
189189
template <class TypeSeq, class OTypeSeq>
190190
constexpr bool type_seq_contains_v = false;
191191

192+
template <class TypeSeq>
193+
constexpr bool type_seq_is_unique_v = false;
194+
192195
template <class TypeSeq, class B>
193196
constexpr bool type_seq_same_v = type_seq_contains_v<TypeSeq, B> && type_seq_contains_v<B, TypeSeq>;
194197

@@ -220,6 +223,12 @@ template <class TagSeqA, class TagSeqB, class TagSeqC>
220223
using type_seq_replace_t =
221224
typename detail::TypeSeqReplace<TagSeqA, TagSeqB, TagSeqC, detail::TypeSeq<>>::type;
222225

226+
template <class... Tags>
227+
constexpr bool type_seq_is_unique_v<detail::TypeSeq<Tags...>>
228+
= ((type_seq_size_v<type_seq_remove_t<detail::TypeSeq<Tags...>, detail::TypeSeq<Tags>>>
229+
== sizeof...(Tags) - 1)
230+
&& ...);
231+
223232
template <class T>
224233
using to_type_seq_t = typename detail::ToTypeSeq<T>::type;
225234

include/ddc/discrete_domain.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ class DiscreteDomain
6363
template <class...>
6464
friend class DiscreteDomain;
6565

66+
static_assert(
67+
type_seq_is_unique_v<detail::TypeSeq<DDims...>>,
68+
"The dimensions of a DiscreteDomain must be unique");
69+
6670
public:
6771
using discrete_element_type = DiscreteElement<DDims...>;
6872

include/ddc/discrete_element.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ class DiscreteElement
161161
{
162162
using tags_seq = detail::TypeSeq<Tags...>;
163163

164+
static_assert(
165+
type_seq_is_unique_v<tags_seq>,
166+
"The dimensions of a DiscreteElement must be unique");
167+
164168
friend KOKKOS_FUNCTION constexpr std::array<DiscreteElementType, sizeof...(Tags)>& detail::
165169
array<Tags...>(DiscreteElement<Tags...>& v) noexcept;
166170

include/ddc/discrete_vector.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,10 @@ class DiscreteVector : public detail::DiscreteVectorConversionOperators<Discrete
277277

278278
using tags_seq = detail::TypeSeq<Tags...>;
279279

280+
static_assert(
281+
type_seq_is_unique_v<tags_seq>,
282+
"The dimensions of a DiscreteVector must be unique");
283+
280284
private:
281285
std::array<DiscreteVectorElement, sizeof...(Tags)> m_values;
282286

include/ddc/sparse_discrete_domain.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ class SparseDiscreteDomain
122122
template <class...>
123123
friend class SparseDiscreteDomain;
124124

125+
static_assert(
126+
type_seq_is_unique_v<detail::TypeSeq<DDims...>>,
127+
"The dimensions of a SparseDiscreteDomain must be unique");
128+
125129
public:
126130
using discrete_element_type = DiscreteElement<DDims...>;
127131

include/ddc/strided_discrete_domain.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ class StridedDiscreteDomain
7171
template <class...>
7272
friend class StridedDiscreteDomain;
7373

74+
static_assert(
75+
type_seq_is_unique_v<detail::TypeSeq<DDims...>>,
76+
"The dimensions of a StridedDiscreteDomain must be unique");
77+
7478
public:
7579
using discrete_element_type = DiscreteElement<DDims...>;
7680

tests/type_seq.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,19 @@ TEST(TypeSeqTest, Replace)
9393
using ExpectedR = ddc::detail::TypeSeq<a, y, c, z, e>;
9494
EXPECT_TRUE((ddc::type_seq_same_v<R, ExpectedR>));
9595
}
96+
97+
TEST(TypeSeqTest, IsUnique)
98+
{
99+
using A = ddc::detail::TypeSeq<a, b, c, d, e>;
100+
using B = ddc::detail::TypeSeq<>;
101+
using C = ddc::detail::TypeSeq<y>;
102+
using D = ddc::detail::TypeSeq<y, y>;
103+
using E = ddc::detail::TypeSeq<a, b, c, d, b, e>;
104+
using F = ddc::detail::TypeSeq<a, b, a, c, b, a, d, b, e, a>;
105+
EXPECT_TRUE((ddc::type_seq_is_unique_v<A>));
106+
EXPECT_TRUE((ddc::type_seq_is_unique_v<B>));
107+
EXPECT_TRUE((ddc::type_seq_is_unique_v<C>));
108+
EXPECT_FALSE((ddc::type_seq_is_unique_v<D>));
109+
EXPECT_FALSE((ddc::type_seq_is_unique_v<E>));
110+
EXPECT_FALSE((ddc::type_seq_is_unique_v<F>));
111+
}

0 commit comments

Comments
 (0)