11#include "ddc/coordinate.hpp"
12#include "ddc/detail/macros.hpp"
13#include "ddc/detail/type_seq.hpp"
14#include "ddc/discrete_vector.hpp"
26template <
class... Tags>
37template <
class... Tags>
38struct ToTypeSeq<DiscreteElement<Tags...>>
40 using type = TypeSeq<Tags...>;
46
47using DiscreteElementType = std::size_t;
50KOKKOS_FUNCTION constexpr DiscreteElementType
const&
uid(DiscreteElement<Tag>
const& tuple)
noexcept
56KOKKOS_FUNCTION constexpr DiscreteElementType&
uid(DiscreteElement<Tag>& tuple)
noexcept
61template <
class QueryTag,
class... Tags>
63 DiscreteElement<Tags...>
const& tuple)
noexcept
65 return tuple.
template uid<QueryTag>();
68template <
class QueryTag,
class... Tags>
69KOKKOS_FUNCTION constexpr DiscreteElementType&
uid(DiscreteElement<Tags...>& tuple)
noexcept
71 return tuple.
template uid<QueryTag>();
74template <
class QueryTag,
class... Tags>
76 DiscreteElement<Tags...>
const& tuple,
77 DiscreteElementType
const& default_value)
noexcept
79 return tuple.
template uid_or<QueryTag>(default_value);
82template <
class... QueryTags,
class... Tags>
84 DiscreteElement<Tags...>
const& arr)
noexcept
86 return DiscreteElement<QueryTags...>(arr);
89template <
class... QueryTags,
class... Tags>
91 DiscreteElement<Tags...>&& arr)
noexcept
93 return DiscreteElement<QueryTags...>(std::move(arr));
102 is_discrete_element_v<HeadDElem> && (is_discrete_element_v<TailDElems> && ...),
104KOKKOS_FUNCTION constexpr auto const&
take(HeadDElem
const& head, TailDElems
const&... tail)
106 DDC_IF_NVCC_THEN_PUSH_AND_SUPPRESS(implicit_return_from_non_void_function)
107 if constexpr (type_seq_contains_v<detail::TypeSeq<QueryTag>, to_type_seq_t<HeadDElem>>) {
109 (!type_seq_contains_v<detail::TypeSeq<QueryTag>, to_type_seq_t<TailDElems>> && ...),
110 "ERROR: tag redundant");
113 static_assert(
sizeof...(TailDElems) > 0,
"ERROR: tag not found");
114 return take<QueryTag>(tail...);
122template <
class... Tags>
123KOKKOS_FUNCTION
constexpr std::array<DiscreteElementType,
sizeof...(Tags)>& array(
124 DiscreteElement<Tags...>& v)
noexcept
130template <
class... Tags>
131KOKKOS_FUNCTION
constexpr std::array<DiscreteElementType,
sizeof...(Tags)>
const& array(
132 DiscreteElement<Tags...>
const& v)
noexcept
140
141
142
143template <
class... Tags>
146 using tags_seq = detail::TypeSeq<Tags...>;
148 friend KOKKOS_FUNCTION
constexpr std::array<DiscreteElementType,
sizeof...(Tags)>& detail::
149 array<Tags...>(DiscreteElement<Tags...>& v)
noexcept;
151 friend KOKKOS_FUNCTION
constexpr std::array<DiscreteElementType,
sizeof...(Tags)>
const&
152 detail::array<Tags...>(DiscreteElement<Tags...>
const& v)
noexcept;
155 std::array<DiscreteElementType,
sizeof...(Tags)> m_values;
158 using value_type = DiscreteElementType;
162 return sizeof...(Tags);
168 KOKKOS_DEFAULTED_FUNCTION
constexpr DiscreteElement(DiscreteElement
const&) =
default;
170 KOKKOS_DEFAULTED_FUNCTION
constexpr DiscreteElement(DiscreteElement&&) =
default;
172 template <
class... DElems,
class = std::enable_if_t<(is_discrete_element_v<DElems> && ...)>>
174 : m_values {take<Tags>(delems...).
template uid<Tags>()...}
180 class = std::enable_if_t<(!is_discrete_element_v<Params> && ...)>,
181 class = std::enable_if_t<(std::is_integral_v<Params> && ...)>,
182 class = std::enable_if_t<
sizeof...(Params) ==
sizeof...(Tags)>>
184 : m_values {
static_cast<value_type>(params)...}
190 KOKKOS_DEFAULTED_FUNCTION DiscreteElement&
operator=(DiscreteElement
const& other) =
default;
192 KOKKOS_DEFAULTED_FUNCTION DiscreteElement&
operator=(DiscreteElement&& other) =
default;
194 template <
class... OTags>
196 DiscreteElement<OTags...>
const& other)
noexcept
198 m_values = other.m_values;
202 template <
class... OTags>
205 m_values = std::move(other.m_values);
209 template <
class QueryTag>
212 DDC_IF_NVCC_THEN_PUSH_AND_SUPPRESS(implicit_return_from_non_void_function)
213 if constexpr (in_tags_v<QueryTag, tags_seq>) {
214 return m_values[type_seq_rank_v<QueryTag, tags_seq>];
216 return default_value;
221 template <
class QueryTag>
224 using namespace detail;
225 static_assert(in_tags_v<QueryTag, tags_seq>,
"requested Tag absent from DiscreteElement");
226 return m_values[type_seq_rank_v<QueryTag, tags_seq>];
229 template <
class QueryTag>
232 using namespace detail;
233 static_assert(in_tags_v<QueryTag, tags_seq>,
"requested Tag absent from DiscreteElement");
234 return m_values[type_seq_rank_v<QueryTag, tags_seq>];
237 template <std::size_t N =
sizeof...(Tags)>
243 template <std::size_t N =
sizeof...(Tags)>
244 KOKKOS_FUNCTION constexpr std::enable_if_t<N == 1, value_type
const&>
uid()
const noexcept
249 template <std::size_t N =
sizeof...(Tags),
class = std::enable_if_t<N == 1>>
256 template <std::size_t N =
sizeof...(Tags),
class = std::enable_if_t<N == 1>>
259 DiscreteElement
const tmp = *
this;
264 template <std::size_t N =
sizeof...(Tags),
class = std::enable_if_t<N == 1>>
271 template <std::size_t N =
sizeof...(Tags),
class = std::enable_if_t<N == 1>>
274 DiscreteElement
const tmp = *
this;
279 template <
class... OTags>
282 static_assert(((type_seq_contains_v<detail::TypeSeq<OTags>, tags_seq>)&&...));
283 ((m_values[type_seq_rank_v<OTags, tags_seq>] += rhs.
template get<OTags>()), ...);
289 std::size_t N =
sizeof...(Tags),
290 class = std::enable_if_t<N == 1>,
291 class = std::enable_if_t<std::is_integral_v<IntegralType>>>
298 template <
class... OTags>
301 static_assert(((type_seq_contains_v<detail::TypeSeq<OTags>, tags_seq>)&&...));
302 ((m_values[type_seq_rank_v<OTags, tags_seq>] -= rhs.
template get<OTags>()), ...);
308 std::size_t N =
sizeof...(Tags),
309 class = std::enable_if_t<N == 1>,
310 class = std::enable_if_t<std::is_integral_v<IntegralType>>>
318inline std::ostream& operator<<(std::ostream& out, DiscreteElement<>
const&)
324template <
class Head,
class... Tags>
325std::ostream& operator<<(std::ostream& out, DiscreteElement<Head, Tags...>
const& arr)
328 out << uid<Head>(arr);
329 ((out <<
", " << uid<Tags>(arr)), ...);
335template <
class... Tags,
class... OTags>
337 DiscreteElement<Tags...>
const& lhs,
338 DiscreteElement<OTags...>
const& rhs)
noexcept
340 return ((lhs.
template uid<Tags>() == rhs.
template uid<Tags>()) && ...);
343template <
class... Tags,
class... OTags>
345 DiscreteElement<Tags...>
const& lhs,
346 DiscreteElement<OTags...>
const& rhs)
noexcept
348 return !(lhs == rhs);
353 DiscreteElement<Tag>
const& lhs,
354 DiscreteElement<Tag>
const& rhs)
356 return lhs.uid() < rhs.uid();
361 DiscreteElement<Tag>
const& lhs,
362 DiscreteElement<Tag>
const& rhs)
364 return lhs.uid() <= rhs.uid();
369 DiscreteElement<Tag>
const& lhs,
370 DiscreteElement<Tag>
const& rhs)
372 return lhs.uid() > rhs.uid();
377 DiscreteElement<Tag>
const& lhs,
378 DiscreteElement<Tag>
const& rhs)
380 return lhs.uid() >= rhs.uid();
385template <
class... Tags,
class... OTags>
387 DiscreteElement<Tags...>
const& lhs,
388 DiscreteVector<OTags...>
const& rhs)
390 using detail::TypeSeq;
391 static_assert(((type_seq_contains_v<TypeSeq<OTags>, TypeSeq<Tags...>>)&&...));
392 DiscreteElement<Tags...> result(lhs);
400 class = std::enable_if_t<std::is_integral_v<IntegralType>>,
401 class = std::enable_if_t<!is_discrete_vector_v<IntegralType>>>
403 DiscreteElement<Tag>
const& lhs,
404 IntegralType
const& rhs)
406 return DiscreteElement<Tag>(uid<Tag>(lhs) + rhs);
409template <
class... Tags,
class... OTags>
411 DiscreteElement<Tags...>
const& lhs,
412 DiscreteVector<OTags...>
const& rhs)
414 using detail::TypeSeq;
415 static_assert(((type_seq_contains_v<TypeSeq<OTags>, TypeSeq<Tags...>>)&&...));
416 DiscreteElement<Tags...> result(lhs);
424 class = std::enable_if_t<std::is_integral_v<IntegralType>>,
425 class = std::enable_if_t<!is_discrete_vector_v<IntegralType>>>
427 DiscreteElement<Tag>
const& lhs,
428 IntegralType
const& rhs)
430 return DiscreteElement<Tag>(uid<Tag>(lhs) - rhs);
435template <
class... Tags,
class... OTags>
437 DiscreteElement<Tags...>
const& lhs,
438 DiscreteElement<OTags...>
const& rhs)
440 static_assert(type_seq_same_v<detail::TypeSeq<Tags...>, detail::TypeSeq<OTags...>>);
441 return DiscreteVector<Tags...>((uid<Tags>(lhs) - uid<Tags>(rhs))...);
446template <
class... DDims>
447struct coordinate_of<
ddc::DiscreteElement<DDims...>>
450 using type = Coordinate<
typename DDims::continuous_dimension_type...>;
KOKKOS_FUNCTION constexpr DiscreteElement & operator+=(DiscreteVector< OTags... > const &rhs)
Definition: discrete_element.hpp:280
KOKKOS_FUNCTION constexpr value_type const & uid() const noexcept
Definition: discrete_element.hpp:230
KOKKOS_FUNCTION constexpr value_type & uid() noexcept
Definition: discrete_element.hpp:222
KOKKOS_DEFAULTED_FUNCTION ~DiscreteElement()=default
KOKKOS_FUNCTION constexpr DiscreteElement & operator++()
Definition: discrete_element.hpp:250
KOKKOS_FUNCTION constexpr DiscreteElement & operator=(DiscreteElement< OTags... > const &other) noexcept
Definition: discrete_element.hpp:195
KOKKOS_FUNCTION constexpr DiscreteElement & operator-=(IntegralType const &rhs)
Definition: discrete_element.hpp:311
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteElement(DiscreteElement const &)=default
KOKKOS_FUNCTION constexpr DiscreteElement(DElems const &... delems) noexcept
Definition: discrete_element.hpp:173
KOKKOS_FUNCTION constexpr value_type const & uid_or(value_type const &default_value) const &
Definition: discrete_element.hpp:210
KOKKOS_FUNCTION constexpr DiscreteElement & operator-=(DiscreteVector< OTags... > const &rhs)
Definition: discrete_element.hpp:299
KOKKOS_FUNCTION constexpr DiscreteElement operator++(int)
Definition: discrete_element.hpp:257
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteElement()=default
KOKKOS_FUNCTION constexpr DiscreteElement & operator--()
Definition: discrete_element.hpp:265
KOKKOS_DEFAULTED_FUNCTION DiscreteElement & operator=(DiscreteElement const &other)=default
KOKKOS_FUNCTION constexpr DiscreteElement operator--(int)
Definition: discrete_element.hpp:272
KOKKOS_FUNCTION constexpr std::enable_if_t< N==1, value_type & > uid() noexcept
Definition: discrete_element.hpp:238
KOKKOS_FUNCTION constexpr DiscreteElement & operator=(DiscreteElement< OTags... > &&other) noexcept
Definition: discrete_element.hpp:203
static KOKKOS_FUNCTION constexpr std::size_t size() noexcept
Definition: discrete_element.hpp:160
KOKKOS_FUNCTION constexpr std::enable_if_t< N==1, value_type const & > uid() const noexcept
Definition: discrete_element.hpp:244
KOKKOS_FUNCTION constexpr DiscreteElement & operator+=(IntegralType const &rhs)
Definition: discrete_element.hpp:292
KOKKOS_DEFAULTED_FUNCTION DiscreteElement & operator=(DiscreteElement &&other)=default
KOKKOS_FUNCTION constexpr DiscreteElement(Params const &... params) noexcept
Definition: discrete_element.hpp:183
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteElement(DiscreteElement &&)=default
Definition: aligned_allocator.hpp:9
KOKKOS_FUNCTION constexpr bool operator<(DiscreteElement< Tag > const &lhs, DiscreteElement< Tag > const &rhs)
Definition: discrete_element.hpp:352
KOKKOS_FUNCTION constexpr DiscreteElementType const & uid_or(DiscreteElement< Tags... > const &tuple, DiscreteElementType const &default_value) noexcept
Definition: discrete_element.hpp:75
KOKKOS_FUNCTION constexpr bool operator==(DiscreteElement< Tags... > const &lhs, DiscreteElement< OTags... > const &rhs) noexcept
Definition: discrete_element.hpp:336
KOKKOS_FUNCTION constexpr DiscreteElement< QueryTags... > select(DiscreteElement< Tags... > &&arr) noexcept
Definition: discrete_element.hpp:90
KOKKOS_FUNCTION constexpr DiscreteElement< QueryTags... > select(DiscreteElement< Tags... > const &arr) noexcept
Definition: discrete_element.hpp:83
KOKKOS_FUNCTION constexpr auto const & take(HeadDElem const &head, TailDElems const &... tail)
Returns a reference towards the DiscreteElement that contains the QueryTag.
Definition: discrete_element.hpp:104
KOKKOS_FUNCTION constexpr DiscreteElement< Tag > operator-(DiscreteElement< Tag > const &lhs, IntegralType const &rhs)
Definition: discrete_element.hpp:426
KOKKOS_FUNCTION constexpr DiscreteVector< Tags... > operator-(DiscreteElement< Tags... > const &lhs, DiscreteElement< OTags... > const &rhs)
binary operator: -
Definition: discrete_element.hpp:436
KOKKOS_FUNCTION constexpr DiscreteElementType const & uid(DiscreteElement< Tag > const &tuple) noexcept
Definition: discrete_element.hpp:50
KOKKOS_FUNCTION constexpr DiscreteElement< Tags... > operator+(DiscreteElement< Tags... > const &lhs, DiscreteVector< OTags... > const &rhs)
right external binary operators: +, -
Definition: discrete_element.hpp:386
constexpr bool is_discrete_element_v
Definition: discrete_element.hpp:32
KOKKOS_FUNCTION constexpr bool operator>=(DiscreteElement< Tag > const &lhs, DiscreteElement< Tag > const &rhs)
Definition: discrete_element.hpp:376
KOKKOS_FUNCTION constexpr bool operator<=(DiscreteElement< Tag > const &lhs, DiscreteElement< Tag > const &rhs)
Definition: discrete_element.hpp:360
KOKKOS_FUNCTION constexpr DiscreteElementType & uid(DiscreteElement< Tags... > &tuple) noexcept
Definition: discrete_element.hpp:69
KOKKOS_FUNCTION constexpr bool operator>(DiscreteElement< Tag > const &lhs, DiscreteElement< Tag > const &rhs)
Definition: discrete_element.hpp:368
KOKKOS_FUNCTION constexpr DiscreteElement< Tag > operator+(DiscreteElement< Tag > const &lhs, IntegralType const &rhs)
Definition: discrete_element.hpp:402
KOKKOS_FUNCTION constexpr DiscreteElementType & uid(DiscreteElement< Tag > &tuple) noexcept
Definition: discrete_element.hpp:56
KOKKOS_FUNCTION constexpr DiscreteElement< Tags... > operator-(DiscreteElement< Tags... > const &lhs, DiscreteVector< OTags... > const &rhs)
Definition: discrete_element.hpp:410
KOKKOS_FUNCTION constexpr DiscreteElementType const & uid(DiscreteElement< Tags... > const &tuple) noexcept
Definition: discrete_element.hpp:62
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteElement< Tags... > const &lhs, DiscreteElement< OTags... > const &rhs) noexcept
Definition: discrete_element.hpp:344
Definition: discrete_element.hpp:23