13#include "ddc/detail/macros.hpp"
14#include "ddc/detail/type_seq.hpp"
15#include "ddc/discrete_vector.hpp"
27template <
class... Tags>
38template <
class... Tags>
41 using type = TypeSeq<Tags...>;
62template <
class QueryTag,
class... Tags>
66 return tuple.template uid<QueryTag>();
69template <
class QueryTag,
class... Tags>
72 return tuple.template uid<QueryTag>();
75template <
class QueryTag,
class... Tags>
80 return tuple.template uid_or<QueryTag>(default_value);
83template <
class... QueryTags,
class... Tags>
90template <
class... QueryTags,
class... Tags>
103 is_discrete_element_v<HeadDElem> && (is_discrete_element_v<TailDElems> && ...),
105KOKKOS_FUNCTION
constexpr auto const&
take(HeadDElem
const& head, TailDElems
const&... tail)
107 DDC_IF_NVCC_THEN_PUSH_AND_SUPPRESS(implicit_return_from_non_void_function)
108 if constexpr (type_seq_contains_v<detail::TypeSeq<QueryTag>, to_type_seq_t<HeadDElem>>) {
110 (!type_seq_contains_v<detail::TypeSeq<QueryTag>, to_type_seq_t<TailDElems>> && ...),
111 "ERROR: tag redundant");
114 static_assert(
sizeof...(TailDElems) > 0,
"ERROR: tag not found");
115 return take<QueryTag>(tail...);
123template <
class... Tags>
125 DiscreteElement<Tags...>& v)
noexcept
131template <
class... Tags>
133 DiscreteElement<Tags...>
const& v)
noexcept
144template <
class... Tags>
147 using tags_seq = detail::TypeSeq<Tags...>;
149 friend KOKKOS_FUNCTION
constexpr std::array<
DiscreteElementType,
sizeof...(Tags)>& detail::
161 static KOKKOS_FUNCTION
constexpr std::size_t
size() noexcept
163 return sizeof...(Tags);
173 template <
class... DElems,
class = std::enable_if_t<(is_discrete_element_v<DElems> && ...)>>
175 : m_values {take<Tags>(delems...).template uid<Tags>()...}
181 class = std::enable_if_t<(!is_discrete_element_v<Params> && ...)>,
182 class = std::enable_if_t<(std::is_integral_v<Params> && ...)>,
183 class = std::enable_if_t<
sizeof...(Params) ==
sizeof...(Tags)>>
185 : m_values {
static_cast<value_type>(params)...}
195 template <
class... OTags>
199 m_values = other.m_values;
203 template <
class... OTags>
206 m_values = std::move(other.m_values);
210 template <
class QueryTag>
213 DDC_IF_NVCC_THEN_PUSH_AND_SUPPRESS(implicit_return_from_non_void_function)
214 if constexpr (in_tags_v<QueryTag, tags_seq>) {
215 return m_values[type_seq_rank_v<QueryTag, tags_seq>];
217 return default_value;
222 template <
class QueryTag>
225 using namespace detail;
226 static_assert(in_tags_v<QueryTag, tags_seq>,
"requested Tag absent from DiscreteElement");
227 return m_values[type_seq_rank_v<QueryTag, tags_seq>];
230 template <
class QueryTag>
233 using namespace detail;
234 static_assert(in_tags_v<QueryTag, tags_seq>,
"requested Tag absent from DiscreteElement");
235 return m_values[type_seq_rank_v<QueryTag, tags_seq>];
238 template <std::size_t N =
sizeof...(Tags)>
239 KOKKOS_FUNCTION
constexpr std::enable_if_t<N == 1, value_type&>
uid()
noexcept
244 template <std::size_t N =
sizeof...(Tags)>
245 KOKKOS_FUNCTION
constexpr std::enable_if_t<N == 1, value_type const&>
uid()
const noexcept
250 template <std::size_t N =
sizeof...(Tags),
class = std::enable_if_t<N == 1>>
257 template <std::size_t N =
sizeof...(Tags),
class = std::enable_if_t<N == 1>>
265 template <std::size_t N =
sizeof...(Tags),
class = std::enable_if_t<N == 1>>
272 template <std::size_t N =
sizeof...(Tags),
class = std::enable_if_t<N == 1>>
280 template <
class... OTags>
283 static_assert(((type_seq_contains_v<detail::TypeSeq<OTags>, tags_seq>)&&...));
284 ((m_values[type_seq_rank_v<OTags, tags_seq>] += rhs.template get<OTags>()), ...);
290 std::size_t N =
sizeof...(Tags),
291 class = std::enable_if_t<N == 1>,
292 class = std::enable_if_t<std::is_integral_v<IntegralType>>>
299 template <
class... OTags>
302 static_assert(((type_seq_contains_v<detail::TypeSeq<OTags>, tags_seq>)&&...));
303 ((m_values[type_seq_rank_v<OTags, tags_seq>] -= rhs.template get<OTags>()), ...);
309 std::size_t N =
sizeof...(Tags),
310 class = std::enable_if_t<N == 1>,
311 class = std::enable_if_t<std::is_integral_v<IntegralType>>>
325template <
class Head,
class... Tags>
329 out << uid<Head>(arr);
330 ((out <<
", " << uid<Tags>(arr)), ...);
336template <
class... Tags,
class... OTags>
341 return ((lhs.template uid<Tags>() == rhs.template uid<Tags>()) && ...);
344template <
class... Tags,
class... OTags>
349 return !(lhs == rhs);
357 return lhs.
uid() < rhs.
uid();
365 return lhs.
uid() <= rhs.
uid();
373 return lhs.
uid() > rhs.
uid();
381 return lhs.
uid() >= rhs.
uid();
386template <
class... Tags,
class... OTags>
391 using detail::TypeSeq;
392 static_assert(((type_seq_contains_v<TypeSeq<OTags>, TypeSeq<Tags...>>)&&...));
401 class = std::enable_if_t<std::is_integral_v<IntegralType>>,
405 IntegralType
const& rhs)
410template <
class... Tags,
class... OTags>
415 using detail::TypeSeq;
416 static_assert(((type_seq_contains_v<TypeSeq<OTags>, TypeSeq<Tags...>>)&&...));
425 class = std::enable_if_t<std::is_integral_v<IntegralType>>,
429 IntegralType
const& rhs)
436template <
class... Tags,
class... OTags>
441 static_assert(type_seq_same_v<detail::TypeSeq<Tags...>, detail::TypeSeq<OTags...>>);
442 return DiscreteVector<Tags...>((uid<Tags>(lhs) - uid<Tags>(rhs))...);
A DiscreteElement identifies an element of the discrete dimension.
Definition: discrete_element.hpp:146
KOKKOS_FUNCTION constexpr DiscreteElement & operator+=(DiscreteVector< OTags... > const &rhs)
Definition: discrete_element.hpp:281
KOKKOS_FUNCTION constexpr value_type const & uid() const noexcept
Definition: discrete_element.hpp:231
KOKKOS_FUNCTION constexpr value_type & uid() noexcept
Definition: discrete_element.hpp:223
KOKKOS_DEFAULTED_FUNCTION ~DiscreteElement()=default
KOKKOS_FUNCTION constexpr DiscreteElement & operator=(DiscreteElement< OTags... > const &other) noexcept
Definition: discrete_element.hpp:196
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteElement(DiscreteElement const &)=default
KOKKOS_FUNCTION constexpr DiscreteElement(DElems const &... delems) noexcept
Definition: discrete_element.hpp:174
KOKKOS_FUNCTION constexpr value_type const & uid_or(value_type const &default_value) const &
Definition: discrete_element.hpp:211
KOKKOS_FUNCTION constexpr DiscreteElement & operator-=(DiscreteVector< OTags... > const &rhs)
Definition: discrete_element.hpp:300
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteElement()=default
DiscreteElementType value_type
Definition: discrete_element.hpp:159
KOKKOS_DEFAULTED_FUNCTION DiscreteElement & operator=(DiscreteElement const &other)=default
KOKKOS_FUNCTION constexpr std::enable_if_t< N==1, value_type & > uid() noexcept
Definition: discrete_element.hpp:239
KOKKOS_FUNCTION constexpr DiscreteElement & operator=(DiscreteElement< OTags... > &&other) noexcept
Definition: discrete_element.hpp:204
static KOKKOS_FUNCTION constexpr std::size_t size() noexcept
Definition: discrete_element.hpp:161
KOKKOS_FUNCTION constexpr std::enable_if_t< N==1, value_type const & > uid() const noexcept
Definition: discrete_element.hpp:245
KOKKOS_DEFAULTED_FUNCTION DiscreteElement & operator=(DiscreteElement &&other)=default
KOKKOS_FUNCTION constexpr DiscreteElement(Params const &... params) noexcept
Definition: discrete_element.hpp:184
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteElement(DiscreteElement &&)=default
A DiscreteVector is a vector in the discrete dimension.
Definition: discrete_vector.hpp:254
The top-level namespace of DDC.
Definition: aligned_allocator.hpp:11
KOKKOS_FUNCTION constexpr bool operator<(DiscreteElement< Tag > const &lhs, DiscreteElement< Tag > const &rhs)
Definition: discrete_element.hpp:353
KOKKOS_FUNCTION constexpr DiscreteElementType const & uid_or(DiscreteElement< Tags... > const &tuple, DiscreteElementType const &default_value) noexcept
Definition: discrete_element.hpp:76
constexpr bool operator!=(AlignedAllocator< T, NT > const &, AlignedAllocator< U, NU > const &) noexcept
Definition: aligned_allocator.hpp:65
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:105
std::size_t DiscreteElementType
A DiscreteCoordElement is a scalar that identifies an element of the discrete dimension.
Definition: discrete_element.hpp:48
constexpr bool is_discrete_vector_v
Definition: discrete_vector.hpp:34
KOKKOS_FUNCTION constexpr DiscreteElementType const & uid(DiscreteElement< Tag > const &tuple) noexcept
Definition: discrete_element.hpp:51
KOKKOS_FUNCTION constexpr DiscreteElement< Tags... > operator+(DiscreteElement< Tags... > const &lhs, DiscreteVector< OTags... > const &rhs)
right external binary operators: +, -
Definition: discrete_element.hpp:387
std::ostream & operator<<(std::ostream &out, DiscreteElement<> const &)
Definition: discrete_element.hpp:319
constexpr bool is_discrete_element_v
Definition: discrete_element.hpp:33
KOKKOS_FUNCTION constexpr bool operator>=(DiscreteElement< Tag > const &lhs, DiscreteElement< Tag > const &rhs)
Definition: discrete_element.hpp:377
KOKKOS_FUNCTION constexpr bool operator<=(DiscreteElement< Tag > const &lhs, DiscreteElement< Tag > const &rhs)
Definition: discrete_element.hpp:361
KOKKOS_FUNCTION constexpr bool operator>(DiscreteElement< Tag > const &lhs, DiscreteElement< Tag > const &rhs)
Definition: discrete_element.hpp:369
constexpr bool operator==(AlignedAllocator< T, NT > const &, AlignedAllocator< U, NU > const &) noexcept
Definition: aligned_allocator.hpp:59
KOKKOS_FUNCTION constexpr DiscreteElement< Tags... > operator-(DiscreteElement< Tags... > const &lhs, DiscreteVector< OTags... > const &rhs)
Definition: discrete_element.hpp:411
KOKKOS_FUNCTION constexpr DiscreteDomain< QueryDDims... > select(DiscreteDomain< DDims... > const &domain)
Definition: discrete_domain.hpp:366
Definition: discrete_element.hpp:24