9 #include "ddc/coordinate.hpp"
10 #include "ddc/detail/type_seq.hpp"
11 #include "ddc/discrete_element.hpp"
12 #include "ddc/discrete_vector.hpp"
17 struct DiscreteDomainIterator;
19 template <
class... DDims>
22 template <
class... DDims>
39 static constexpr std::size_t
rank()
41 return (0 + ... + DDims::rank());
47 template <
class... ODDims>
49 : m_element_begin(domain.
front())
56 template <std::size_t N =
sizeof...(DDims),
class = std::enable_if_t<(N != 1)>>
58 : m_element_begin(domains.
front()...)
59 , m_element_end((domains.
front() + domains.
extents())...)
71 , m_element_end(
get<DDims>(
size)...)
80 : m_element_begin(element_begin)
81 , m_element_end(element_begin +
size)
95 template <
class... ODims>
98 return m_element_begin == other.m_element_begin && m_element_end == other.m_element_end;
101 #if __cplusplus <= 201703L
106 return !(*
this == other);
112 return (1ul * ... * (uid<DDims>(m_element_end) - uid<DDims>(m_element_begin)));
117 return mlength_type((uid<DDims>(m_element_end) - uid<DDims>(m_element_begin))...);
120 template <
class QueryDDim>
124 uid<QueryDDim>(m_element_end) - uid<QueryDDim>(m_element_begin));
129 return m_element_begin;
162 template <
class... ODDims>
165 assert(((uid<ODDims>(m_element_begin) <= uid<ODDims>(odomain.m_element_begin)) && ...));
166 assert(((uid<ODDims>(m_element_end) >= uid<ODDims>(odomain.m_element_end)) && ...));
171 (uid_or<DDims>(odomain.m_element_begin, uid<DDims>(m_element_begin)))...),
175 constexpr
bool empty() const noexcept
180 constexpr
explicit operator bool()
186 std::size_t N =
sizeof...(DDims),
187 class DDim0 = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
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...>>>>
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 = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
226 std::size_t N =
sizeof...(DDims),
227 class = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
234 template <
class... QueryDDims,
class... DDims>
239 select<QueryDDims...>(domain.
extents()));
242 template <
class... QueryDDims,
class... DDims>
245 return DiscreteVector<QueryDDims...>(select<QueryDDims>(domain).size()...);
248 template <
class... QueryDDims,
class... DDims>
251 return DiscreteElement<QueryDDims...>(select<QueryDDims>(domain).front()...);
254 template <
class... QueryDDims,
class... DDims>
257 return DiscreteElement<QueryDDims...>(select<QueryDDims>(domain).back()...);
260 template <
class... QueryDDims,
class... DDims>
266 select<QueryDDims>(domain).coordinate(select<QueryDDims>(icoord))...);
269 template <
class... QueryDDims,
class... DDims>
272 return ddc::Coordinate<QueryDDims...>(select<QueryDDims>(domain).rmin()...);
275 template <
class... QueryDDims,
class... DDims>
278 return ddc::Coordinate<QueryDDims...>(select<QueryDDims>(domain).rmax()...);
281 namespace ddc_detail {
283 template <
class QueryDDimSeq>
286 template <
class... QueryDDims>
289 template <
class Domain>
290 static constexpr
auto select(Domain
const& domain)
298 template <
class QueryDDimSeq,
class... DDims>
304 template <
class DDim>
372 return m_value + __n;
379 return xx.m_value == yy.m_value;
386 return xx.m_value != yy.m_value;
393 return xx.m_value < yy.m_value;
442 return (yy.m_value > xx.m_value) ? (-
static_cast<difference_type>(yy.m_value - xx.m_value))
443 : (xx.m_value - yy.m_value);
Definition: discrete_domain.hpp:24
DiscreteDomain & operator=(DiscreteDomain &&x)=default
DiscreteVector< DDims... > mlength_type
Definition: discrete_domain.hpp:31
auto begin() const
Definition: discrete_domain.hpp:188
constexpr decltype(auto) operator[](std::size_t __n)
Definition: discrete_domain.hpp:220
constexpr bool empty() const noexcept
Definition: discrete_domain.hpp:175
DiscreteDomain(DiscreteDomain const &x)=default
constexpr DiscreteDomain remove(mlength_type n1, mlength_type n2) const
Definition: discrete_domain.hpp:157
friend class DiscreteDomain
Definition: discrete_domain.hpp:26
auto cbegin() const
Definition: discrete_domain.hpp:204
constexpr discrete_element_type back() const noexcept
Definition: discrete_domain.hpp:132
std::size_t size() const
Definition: discrete_domain.hpp:110
constexpr DiscreteDomain(DiscreteDomain< ODDims... > const &domain)
Construct a DiscreteDomain from a reordered copy of domain
Definition: discrete_domain.hpp:48
constexpr auto restrict(DiscreteDomain< ODDims... > const &odomain) const
Definition: discrete_domain.hpp:163
constexpr DiscreteDomain take_first(mlength_type n) const
Definition: discrete_domain.hpp:137
constexpr discrete_element_type front() const noexcept
Definition: discrete_domain.hpp:127
constexpr mlength_type extents() const noexcept
Definition: discrete_domain.hpp:115
DiscreteDomain & operator=(DiscreteDomain const &x)=default
auto cend() const
Definition: discrete_domain.hpp:212
constexpr DiscreteDomain(DiscreteDomain< DDims > const &... domains)
Definition: discrete_domain.hpp:57
constexpr DiscreteDomain take_last(mlength_type n) const
Definition: discrete_domain.hpp:142
~DiscreteDomain()=default
constexpr DiscreteVector< QueryDDim > extent() const noexcept
Definition: discrete_domain.hpp:121
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:79
static constexpr std::size_t rank()
Definition: discrete_domain.hpp:39
constexpr bool operator==(DiscreteDomain< ODims... > const &other) const
Definition: discrete_domain.hpp:96
constexpr bool operator!=(DiscreteDomain const &other) const
Definition: discrete_domain.hpp:104
constexpr DiscreteDomain remove_last(mlength_type n) const
Definition: discrete_domain.hpp:152
DiscreteDomain(DiscreteDomain &&x)=default
auto end() const
Definition: discrete_domain.hpp:196
constexpr DiscreteDomain(mlength_type const &size)
Construct a DiscreteDomain starting from (0, ..., 0) with size points.
Definition: discrete_domain.hpp:68
DiscreteElement< DDims... > discrete_element_type
Definition: discrete_domain.hpp:29
constexpr decltype(auto) operator[](std::size_t __n) const
Definition: discrete_domain.hpp:228
constexpr DiscreteDomain remove_first(mlength_type n) const
Definition: discrete_domain.hpp:147
constexpr value_type & uid() noexcept
Definition: discrete_element.hpp:204
A DiscreteVector is a vector in the discrete dimension.
Definition: discrete_vector.hpp:208
Definition: discrete_domain.hpp:284
Definition: aligned_allocator.hpp:9
ddc::Coordinate< QueryDDims... > rmin(DiscreteDomain< DDims... > const &domain) noexcept
Definition: discrete_domain.hpp:270
constexpr DiscreteVector< QueryDDims... > extents(DiscreteDomain< DDims... > const &domain) noexcept
Definition: discrete_domain.hpp:243
ddc::Coordinate< QueryDDims... > coordinate(DiscreteDomain< DDims... > const &domain, DiscreteElement< QueryDDims... > const &icoord) noexcept
Definition: discrete_domain.hpp:261
std::size_t DiscreteElementType
A DiscreteCoordElement is a scalar that identifies an element of the discrete dimension.
Definition: discrete_element.hpp:34
constexpr DiscreteElement< QueryDDims... > back(DiscreteDomain< DDims... > const &domain) noexcept
Definition: discrete_domain.hpp:255
constexpr DiscreteElement< QueryDDims... > front(DiscreteDomain< DDims... > const &domain) noexcept
Definition: discrete_domain.hpp:249
constexpr auto select_by_type_seq(DiscreteDomain< DDims... > const &domain)
Definition: discrete_domain.hpp:299
constexpr DiscreteDomain< QueryDDims... > select(DiscreteDomain< DDims... > const &domain)
Definition: discrete_domain.hpp:235
ddc_detail::TaggedVector< CoordinateElement, CDims... > Coordinate
A Coordinate represents a coordinate in the continuous space.
Definition: coordinate.hpp:19
ddc::Coordinate< QueryDDims... > rmax(DiscreteDomain< DDims... > const &domain) noexcept
Definition: discrete_domain.hpp:276
constexpr DiscreteVectorElement const & get(DiscreteVector< Tags... > const &tuple) noexcept
Definition: discrete_vector.hpp:36
Definition: discrete_domain.hpp:306
constexpr friend bool operator!=(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:382
constexpr friend DiscreteDomainIterator operator+(difference_type __n, DiscreteDomainIterator __i)
Definition: discrete_domain.hpp:424
DiscreteDomainIterator()=default
constexpr friend DiscreteDomainIterator operator+(DiscreteDomainIterator __i, difference_type __n)
Definition: discrete_domain.hpp:417
constexpr friend bool operator<(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:389
constexpr DiscreteDomainIterator & operator-=(difference_type __n)
Definition: discrete_domain.hpp:361
constexpr DiscreteDomainIterator operator++(int)
Definition: discrete_domain.hpp:332
constexpr DiscreteDomainIterator(DiscreteElement< DDim > __value)
Definition: discrete_domain.hpp:319
constexpr DiscreteDomainIterator & operator++()
Definition: discrete_domain.hpp:326
constexpr friend bool operator==(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:375
constexpr DiscreteElement< DDim > operator*() const noexcept
Definition: discrete_domain.hpp:321
constexpr friend difference_type operator-(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:438
constexpr friend DiscreteDomainIterator operator-(DiscreteDomainIterator __i, difference_type __n)
Definition: discrete_domain.hpp:431
constexpr DiscreteDomainIterator operator--(int)
Definition: discrete_domain.hpp:345
constexpr DiscreteElement< DDim > operator[](difference_type __n) const
Definition: discrete_domain.hpp:370
constexpr friend bool operator>=(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:410
std::ptrdiff_t difference_type
Definition: discrete_domain.hpp:315
constexpr friend bool operator>(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:396
std::random_access_iterator_tag iterator_category
Definition: discrete_domain.hpp:311
constexpr friend bool operator<=(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
Definition: discrete_domain.hpp:403
constexpr DiscreteDomainIterator & operator--()
Definition: discrete_domain.hpp:339
constexpr DiscreteDomainIterator & operator+=(difference_type __n)
Definition: discrete_domain.hpp:352
static constexpr auto select(Domain const &domain)
Definition: discrete_domain.hpp:290