13#include "ddc/detail/type_seq.hpp"
14#include "ddc/discrete_element.hpp"
15#include "ddc/discrete_vector.hpp"
20struct DiscreteDomainIterator;
22template <
class... DDims>
30template <
class... Tags>
41template <
class... Tags>
44 using type = TypeSeq<Tags...>;
49template <
class... DDims>
66 static KOKKOS_FUNCTION
constexpr std::size_t
rank()
68 return sizeof...(DDims);
74 template <
class... DDoms,
class = std::enable_if_t<(is_discrete_domain_v<DDoms> && ...)>>
76 : m_element_begin(domains.
front()...)
77 , m_element_end((domains.
front() + domains.
extents())...)
88 : m_element_begin(element_begin)
89 , m_element_end(element_begin +
size)
103 template <
class... ODims>
106 return m_element_begin == other.m_element_begin && m_element_end == other.m_element_end;
109#if __cplusplus <= 201703L
114 return !(*
this == other);
118 KOKKOS_FUNCTION
constexpr std::size_t
size()
const
120 return (1ul * ... * (uid<DDims>(m_element_end) - uid<DDims>(m_element_begin)));
125 return mlength_type((uid<DDims>(m_element_end) - uid<DDims>(m_element_begin))...);
128 template <
class QueryDDim>
132 uid<QueryDDim>(m_element_end) - uid<QueryDDim>(m_element_begin));
137 return m_element_begin;
170 template <
class... ODDims>
173 assert(((uid<ODDims>(m_element_begin) <= uid<ODDims>(odomain.m_element_begin)) && ...));
174 assert(((uid<ODDims>(m_element_end) >= uid<ODDims>(odomain.m_element_end)) && ...));
179 (uid_or<DDims>(odomain.m_element_begin, uid<DDims>(m_element_begin)))...),
183 KOKKOS_FUNCTION
constexpr bool empty() const noexcept
188 KOKKOS_FUNCTION
constexpr explicit operator bool()
194 std::size_t N =
sizeof...(DDims),
195 class DDim0 = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
202 std::size_t N =
sizeof...(DDims),
203 class DDim0 = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
204 KOKKOS_FUNCTION
auto end()
const
210 std::size_t N =
sizeof...(DDims),
211 class DDim0 = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
218 std::size_t N =
sizeof...(DDims),
219 class DDim0 = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
220 KOKKOS_FUNCTION
auto cend()
const
226 std::size_t N =
sizeof...(DDims),
227 class = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
228 KOKKOS_FUNCTION
constexpr decltype(
auto)
operator[](std::size_t n)
234 std::size_t N =
sizeof...(DDims),
235 class = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
236 KOKKOS_FUNCTION
constexpr decltype(
auto)
operator[](std::size_t n)
const
253 static KOKKOS_FUNCTION
constexpr std::size_t
rank()
261 template <
class... ODDims>
292#if __cplusplus <= 201703L
297 return !(*
this == other);
301 KOKKOS_FUNCTION
constexpr std::size_t
size()
const
348 template <
class... ODims>
354 KOKKOS_FUNCTION
constexpr bool empty() const noexcept
359 KOKKOS_FUNCTION
constexpr explicit operator bool()
365template <
class... QueryDDims,
class... DDims>
371 select<QueryDDims...>(domain.
extents()));
377struct ConvertTypeSeqToDiscreteDomain;
379template <
class... DDims>
380struct ConvertTypeSeqToDiscreteDomain<detail::TypeSeq<DDims...>>
382 using type = DiscreteDomain<DDims...>;
386using convert_type_seq_to_discrete_domain =
typename ConvertTypeSeqToDiscreteDomain<T>::type;
392template <
typename... DDom>
395template <
typename... DDim1,
typename... DDim2>
401template <
typename DDom>
407template <
typename DDom1,
typename DDom2,
typename... Tail>
414template <
typename... DDom>
418template <
class... DDimsA,
class... DDimsB>
423 using TagSeqA = detail::TypeSeq<DDimsA...>;
424 using TagSeqB = detail::TypeSeq<DDimsB...>;
426 using type_seq_r = type_seq_remove_t<TagSeqA, TagSeqB>;
427 return detail::convert_type_seq_to_discrete_domain<type_seq_r>(DDom_a);
433template <
class... DDimsB,
class DDomA>
436 using TagSeqA =
typename detail::ToTypeSeq<DDomA>::type;
437 using TagSeqB = detail::TypeSeq<DDimsB...>;
439 using type_seq_r = type_seq_remove_t<TagSeqA, TagSeqB>;
440 return detail::convert_type_seq_to_discrete_domain<type_seq_r>(DDom_a);
446template <
typename DDim1,
typename DDim2,
typename DDimA,
typename... DDimsB>
447KOKKOS_FUNCTION
constexpr std::conditional_t<
448 std::is_same_v<DDimA, DDim1>,
452 DiscreteDomain<DDimA>
const& DDom_a,
453 [[maybe_unused]] DiscreteDomain<DDimsB...>
const& DDom_b)
noexcept
455 if constexpr (std::is_same_v<DDimA, DDim1>) {
456 return ddc::select<DDim2>(DDom_b);
465template <
typename DDim1,
typename DDim2,
typename... DDimsA,
typename... DDimsB>
471 using TagSeqA = detail::TypeSeq<DDimsA...>;
472 using TagSeqB = detail::TypeSeq<DDim1>;
473 using TagSeqC = detail::TypeSeq<DDim2>;
475 using type_seq_r = ddc::type_seq_replace_t<TagSeqA, TagSeqB, TagSeqC>;
476 return ddc::detail::convert_type_seq_to_discrete_domain<type_seq_r>(
477 detail::replace_dim_of_1d<
481 DDimsB...>(ddc::select<DDimsA>(DDom_a), DDom_b)...);
484template <
class... QueryDDims,
class... DDims>
488 return DiscreteVector<QueryDDims...>(select<QueryDDims>(domain).size()...);
491template <
class... QueryDDims,
class... DDims>
495 return DiscreteElement<QueryDDims...>(select<QueryDDims>(domain).front()...);
498template <
class... QueryDDims,
class... DDims>
502 return DiscreteElement<QueryDDims...>(select<QueryDDims>(domain).back()...);
507template <
class QueryDDimSeq>
510template <
class... QueryDDims>
511struct Selection<detail::TypeSeq<QueryDDims...>>
513 template <
class Domain>
514 static KOKKOS_FUNCTION
constexpr auto select(Domain
const& domain)
522template <
class QueryDDimSeq,
class... DDims>
525 return detail::Selection<QueryDDimSeq>::select(domain);
606 return xx.m_value == yy.m_value;
613 return xx.m_value != yy.m_value;
620 return xx.m_value < yy.m_value;
669 return (yy.m_value > xx.m_value) ? (-
static_cast<difference_type>(yy.m_value - xx.m_value))
670 : (xx.m_value - yy.m_value);
Definition: discrete_domain.hpp:244
KOKKOS_FUNCTION constexpr discrete_element_type back() const noexcept
Definition: discrete_domain.hpp:316
KOKKOS_DEFAULTED_FUNCTION ~DiscreteDomain()=default
KOKKOS_FUNCTION constexpr DiscreteDomain take_first(mlength_type n) const
Definition: discrete_domain.hpp:321
static KOKKOS_FUNCTION constexpr std::size_t rank()
Definition: discrete_domain.hpp:253
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain(DiscreteDomain const &x)=default
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteDomain const &other) const
Definition: discrete_domain.hpp:295
KOKKOS_FUNCTION constexpr mlength_type extents() const noexcept
Definition: discrete_domain.hpp:306
friend class DiscreteDomain
Definition: discrete_domain.hpp:246
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteDomain()=default
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain & operator=(DiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr bool empty() const noexcept
Definition: discrete_domain.hpp:354
KOKKOS_FUNCTION constexpr DiscreteDomain remove_first(mlength_type n) const
Definition: discrete_domain.hpp:331
KOKKOS_FUNCTION constexpr DiscreteDomain remove_last(mlength_type n) const
Definition: discrete_domain.hpp:336
KOKKOS_FUNCTION constexpr std::size_t size() const
Definition: discrete_domain.hpp:301
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain & operator=(DiscreteDomain const &x)=default
KOKKOS_FUNCTION constexpr DiscreteDomain(DiscreteDomain< ODDims... > const &domain)
Definition: discrete_domain.hpp:262
KOKKOS_FUNCTION constexpr DiscreteDomain restrict(DiscreteDomain< ODims... > const &) const
Definition: discrete_domain.hpp:349
KOKKOS_FUNCTION constexpr DiscreteDomain remove(mlength_type n1, mlength_type n2) const
Definition: discrete_domain.hpp:341
KOKKOS_FUNCTION constexpr bool operator==(DiscreteDomain const &other) const
Definition: discrete_domain.hpp:287
KOKKOS_FUNCTION constexpr DiscreteDomain take_last(mlength_type n) const
Definition: discrete_domain.hpp:326
KOKKOS_FUNCTION constexpr DiscreteDomain(discrete_element_type const &element_begin, mlength_type const &size)
Construct a DiscreteDomain starting from element_begin with size points.
Definition: discrete_domain.hpp:271
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain(DiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr discrete_element_type front() const noexcept
Definition: discrete_domain.hpp:311
Definition: discrete_domain.hpp:51
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain(DiscreteDomain const &x)=default
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain(DiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr DiscreteDomain take_first(mlength_type n) const
Definition: discrete_domain.hpp:145
DiscreteVector< DDims... > mlength_type
Definition: discrete_domain.hpp:58
KOKKOS_FUNCTION auto begin() const
Definition: discrete_domain.hpp:196
static KOKKOS_FUNCTION constexpr std::size_t rank()
Definition: discrete_domain.hpp:66
KOKKOS_FUNCTION constexpr bool empty() const noexcept
Definition: discrete_domain.hpp:183
KOKKOS_FUNCTION constexpr std::size_t size() const
Definition: discrete_domain.hpp:118
friend class DiscreteDomain
Definition: discrete_domain.hpp:53
KOKKOS_FUNCTION constexpr DiscreteDomain remove_last(mlength_type n) const
Definition: discrete_domain.hpp:160
KOKKOS_FUNCTION constexpr DiscreteVector< QueryDDim > extent() const noexcept
Definition: discrete_domain.hpp:129
KOKKOS_FUNCTION constexpr discrete_element_type front() const noexcept
Definition: discrete_domain.hpp:135
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteDomain const &other) const
Definition: discrete_domain.hpp:112
KOKKOS_FUNCTION constexpr DiscreteDomain(DDoms const &... domains)
Construct a DiscreteDomain by copies and merge of domains.
Definition: discrete_domain.hpp:75
KOKKOS_FUNCTION constexpr DiscreteDomain(discrete_element_type const &element_begin, mlength_type const &size)
Construct a DiscreteDomain starting from element_begin with size points.
Definition: discrete_domain.hpp:85
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain & operator=(DiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr bool operator==(DiscreteDomain< ODims... > const &other) const
Definition: discrete_domain.hpp:104
KOKKOS_FUNCTION constexpr DiscreteDomain take_last(mlength_type n) const
Definition: discrete_domain.hpp:150
KOKKOS_FUNCTION constexpr DiscreteDomain remove_first(mlength_type n) const
Definition: discrete_domain.hpp:155
KOKKOS_FUNCTION auto cbegin() const
Definition: discrete_domain.hpp:212
KOKKOS_FUNCTION auto end() const
Definition: discrete_domain.hpp:204
KOKKOS_DEFAULTED_FUNCTION ~DiscreteDomain()=default
KOKKOS_FUNCTION auto cend() const
Definition: discrete_domain.hpp:220
KOKKOS_FUNCTION constexpr DiscreteDomain remove(mlength_type n1, mlength_type n2) const
Definition: discrete_domain.hpp:165
KOKKOS_FUNCTION constexpr auto restrict(DiscreteDomain< ODDims... > const &odomain) const
Definition: discrete_domain.hpp:171
KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n) const
Definition: discrete_domain.hpp:236
KOKKOS_FUNCTION constexpr discrete_element_type back() const noexcept
Definition: discrete_domain.hpp:140
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain & operator=(DiscreteDomain const &x)=default
DiscreteElement< DDims... > discrete_element_type
Definition: discrete_domain.hpp:56
KOKKOS_FUNCTION constexpr mlength_type extents() const noexcept
Definition: discrete_domain.hpp:123
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain()=default
KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n)
Definition: discrete_domain.hpp:228
KOKKOS_FUNCTION constexpr value_type & uid() noexcept
Definition: discrete_element.hpp:223
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 DiscreteElement< QueryDDims... > back(DiscreteDomain< DDims... > const &domain) noexcept
Definition: discrete_domain.hpp:499
typename cartesian_prod< typename cartesian_prod< DDom1, DDom2 >::type, Tail... >::type type
Definition: discrete_domain.hpp:411
KOKKOS_FUNCTION constexpr auto select_by_type_seq(DiscreteDomain< DDims... > const &domain)
Definition: discrete_domain.hpp:523
std::size_t DiscreteElementType
A DiscreteCoordElement is a scalar that identifies an element of the discrete dimension.
Definition: discrete_element.hpp:48
KOKKOS_FUNCTION constexpr DiscreteElement< QueryDDims... > front(DiscreteDomain< DDims... > const &domain) noexcept
Definition: discrete_domain.hpp:492
typename cartesian_prod< DDom... >::type cartesian_prod_t
Definition: discrete_domain.hpp:415
KOKKOS_FUNCTION constexpr DiscreteVector< QueryDDims... > extents(DiscreteDomain< DDims... > const &domain) noexcept
Definition: discrete_domain.hpp:485
KOKKOS_FUNCTION constexpr auto remove_dims_of(DiscreteDomain< DDimsA... > const &DDom_a, DiscreteDomain< DDimsB... > const &DDom_b) noexcept
Definition: discrete_domain.hpp:419
KOKKOS_FUNCTION constexpr auto replace_dim_of(DiscreteDomain< DDimsA... > const &DDom_a, DiscreteDomain< DDimsB... > const &DDom_b) noexcept
Definition: discrete_domain.hpp:466
constexpr bool is_discrete_domain_v
Definition: discrete_domain.hpp:36
DDom type
Definition: discrete_domain.hpp:404
KOKKOS_FUNCTION constexpr DiscreteDomain< QueryDDims... > select(DiscreteDomain< DDims... > const &domain)
Definition: discrete_domain.hpp:366
Definition: discrete_domain.hpp:393
Definition: discrete_domain.hpp:530
KOKKOS_FUNCTION constexpr DiscreteDomainIterator operator--(int)
Definition: discrete_domain.hpp:572
friend KOKKOS_FUNCTION constexpr bool operator<=(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:630
KOKKOS_FUNCTION constexpr DiscreteElement< DDim > operator*() const noexcept
Definition: discrete_domain.hpp:548
friend KOKKOS_FUNCTION constexpr bool operator>=(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:637
KOKKOS_DEFAULTED_FUNCTION DiscreteDomainIterator()=default
KOKKOS_FUNCTION constexpr DiscreteElement< DDim > operator[](difference_type n) const
Definition: discrete_domain.hpp:597
KOKKOS_FUNCTION constexpr DiscreteDomainIterator & operator--()
Definition: discrete_domain.hpp:566
KOKKOS_FUNCTION constexpr DiscreteDomainIterator operator++(int)
Definition: discrete_domain.hpp:559
friend KOKKOS_FUNCTION constexpr DiscreteDomainIterator operator-(DiscreteDomainIterator i, difference_type n)
Definition: discrete_domain.hpp:658
friend KOKKOS_FUNCTION constexpr DiscreteDomainIterator operator+(DiscreteDomainIterator i, difference_type n)
Definition: discrete_domain.hpp:644
friend KOKKOS_FUNCTION constexpr bool operator>(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:623
friend KOKKOS_FUNCTION constexpr bool operator!=(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:609
friend KOKKOS_FUNCTION constexpr bool operator<(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:616
KOKKOS_FUNCTION constexpr DiscreteDomainIterator & operator+=(difference_type n)
Definition: discrete_domain.hpp:579
std::ptrdiff_t difference_type
Definition: discrete_domain.hpp:539
KOKKOS_FUNCTION constexpr DiscreteDomainIterator & operator++()
Definition: discrete_domain.hpp:553
friend KOKKOS_FUNCTION constexpr DiscreteDomainIterator operator+(difference_type n, DiscreteDomainIterator i)
Definition: discrete_domain.hpp:651
friend KOKKOS_FUNCTION constexpr bool operator==(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:602
std::random_access_iterator_tag iterator_category
Definition: discrete_domain.hpp:535
KOKKOS_FUNCTION constexpr DiscreteDomainIterator(DiscreteElement< DDim > value)
Definition: discrete_domain.hpp:543
KOKKOS_FUNCTION constexpr DiscreteDomainIterator & operator-=(difference_type n)
Definition: discrete_domain.hpp:588
friend KOKKOS_FUNCTION constexpr difference_type operator-(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:665
Definition: discrete_domain.hpp:27