DDC 0.6.0
Loading...
Searching...
No Matches
discrete_domain.hpp
1// Copyright (C) The DDC development team, see COPYRIGHT.md file
2//
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
7#include <cassert>
8#include <cstddef>
9#include <iterator>
10#include <tuple>
11#include <type_traits>
12
13#include <Kokkos_Macros.hpp>
14
15#include "ddc/detail/type_seq.hpp"
16#include "ddc/discrete_element.hpp"
17#include "ddc/discrete_vector.hpp"
18
19namespace ddc {
20
21template <class DDim>
23
24template <class... DDims>
25class DiscreteDomain;
26
27template <class T>
28struct is_discrete_domain : std::false_type
29{
30};
31
32template <class... Tags>
33struct is_discrete_domain<DiscreteDomain<Tags...>> : std::true_type
34{
35};
36
37template <class T>
38inline constexpr bool is_discrete_domain_v = is_discrete_domain<T>::value;
39
40
41namespace detail {
42
43template <class... Tags>
44struct ToTypeSeq<DiscreteDomain<Tags...>>
45{
46 using type = TypeSeq<Tags...>;
47};
48
49template <class T, class U>
50struct RebindDomain;
51
52template <class... DDims, class... ODDims>
53struct RebindDomain<DiscreteDomain<DDims...>, detail::TypeSeq<ODDims...>>
54{
55 using type = DiscreteDomain<ODDims...>;
56};
57
58} // namespace detail
59
60template <class... DDims>
62{
63 template <class...>
64 friend class DiscreteDomain;
65
66public:
67 using discrete_element_type = DiscreteElement<DDims...>;
68
69 using discrete_vector_type = DiscreteVector<DDims...>;
70
71private:
72 DiscreteElement<DDims...> m_element_begin;
73
74 DiscreteElement<DDims...> m_element_end;
75
76public:
77 static KOKKOS_FUNCTION constexpr std::size_t rank()
78 {
79 return sizeof...(DDims);
80 }
81
83
84 /// Construct a DiscreteDomain by copies and merge of domains
85 template <class... DDoms, class = std::enable_if_t<(is_discrete_domain_v<DDoms> && ...)>>
86 KOKKOS_FUNCTION constexpr explicit DiscreteDomain(DDoms const&... domains)
87 : m_element_begin(domains.front()...)
88 , m_element_end((domains.front() + domains.extents())...)
89 {
90 }
91
92 /** Construct a DiscreteDomain starting from element_begin with size points.
93 * @param element_begin the lower bound in each direction
94 * @param size the number of points in each direction
95 */
97 discrete_element_type const& element_begin,
98 discrete_vector_type const& size)
99 : m_element_begin(element_begin)
100 , m_element_end(element_begin + size)
101 {
102 }
103
105
107
109
111
113
114 template <class... ODims>
115 KOKKOS_FUNCTION constexpr bool operator==(DiscreteDomain<ODims...> const& other) const
116 {
117 if (empty() && other.empty()) {
118 return true;
119 }
120 return m_element_begin == other.m_element_begin && m_element_end == other.m_element_end;
121 }
122
123#if !defined(__cpp_impl_three_way_comparison) || __cpp_impl_three_way_comparison < 201902L
124 // In C++20, `a!=b` shall be automatically translated by the compiler to `!(a==b)`
125 template <class... ODims>
126 KOKKOS_FUNCTION constexpr bool operator!=(DiscreteDomain<ODims...> const& other) const
127 {
128 return !(*this == other);
129 }
130#endif
131
132 KOKKOS_FUNCTION constexpr std::size_t size() const
133 {
134 return (1UL * ... * extent<DDims>().value());
135 }
136
137 KOKKOS_FUNCTION constexpr discrete_vector_type extents() const noexcept
138 {
139 return m_element_end - m_element_begin;
140 }
141
142 template <class QueryDDim>
143 KOKKOS_FUNCTION constexpr DiscreteVector<QueryDDim> extent() const noexcept
144 {
145 return DiscreteElement<QueryDDim>(m_element_end)
146 - DiscreteElement<QueryDDim>(m_element_begin);
147 }
148
149 KOKKOS_FUNCTION constexpr discrete_element_type front() const noexcept
150 {
151 return m_element_begin;
152 }
153
154 KOKKOS_FUNCTION constexpr discrete_element_type back() const noexcept
155 {
156 return discrete_element_type((DiscreteElement<DDims>(m_element_end) - 1)...);
157 }
158
159 KOKKOS_FUNCTION constexpr DiscreteDomain take_first(discrete_vector_type n) const
160 {
161 return DiscreteDomain(front(), n);
162 }
163
164 KOKKOS_FUNCTION constexpr DiscreteDomain take_last(discrete_vector_type n) const
165 {
166 return DiscreteDomain(front() + (extents() - n), n);
167 }
168
169 KOKKOS_FUNCTION constexpr DiscreteDomain remove_first(discrete_vector_type n) const
170 {
171 return DiscreteDomain(front() + n, extents() - n);
172 }
173
174 KOKKOS_FUNCTION constexpr DiscreteDomain remove_last(discrete_vector_type n) const
175 {
176 return DiscreteDomain(front(), extents() - n);
177 }
178
180 discrete_vector_type n1,
181 discrete_vector_type n2) const
182 {
183 return DiscreteDomain(front() + n1, extents() - n1 - n2);
184 }
185
186 KOKKOS_FUNCTION constexpr DiscreteElement<DDims...> operator()(
187 DiscreteVector<DDims...> const& dvect) const noexcept
188 {
189 return m_element_begin + dvect;
190 }
191
192 template <class... ODDims>
193 KOKKOS_FUNCTION constexpr auto restrict_with(DiscreteDomain<ODDims...> const& odomain) const
194 {
195 assert(((DiscreteElement<ODDims>(m_element_begin)
196 <= DiscreteElement<ODDims>(odomain.m_element_begin))
197 && ...));
198 assert(((DiscreteElement<ODDims>(m_element_end)
199 >= DiscreteElement<ODDims>(odomain.m_element_end))
200 && ...));
201 const DiscreteVector<DDims...> myextents = extents();
202 const DiscreteVector<ODDims...> oextents = odomain.extents();
203 return DiscreteDomain(
204 DiscreteElement<DDims...>((select_or<DDims>(
205 odomain.m_element_begin,
206 DiscreteElement<DDims>(m_element_begin)))...),
207 DiscreteVector<DDims...>(
208 (select_or<DDims>(oextents, DiscreteVector<DDims>(myextents)))...));
209 }
210
211 template <class... DElems>
212 KOKKOS_FUNCTION bool contains(DElems const&... delems) const noexcept
213 {
214 static_assert(
215 sizeof...(DDims) == (0 + ... + DElems::size()),
216 "Invalid number of dimensions");
217 static_assert((is_discrete_element_v<DElems> && ...), "Expected DiscreteElements");
218 return (((DiscreteElement<DDims>(take<DDims>(delems...))
219 >= DiscreteElement<DDims>(m_element_begin))
220 && ...)
221 && ((DiscreteElement<DDims>(take<DDims>(delems...))
222 < DiscreteElement<DDims>(m_element_end))
223 && ...));
224 }
225
226 template <class... DElems>
228 DElems const&... delems) const noexcept
229 {
230 static_assert(
231 sizeof...(DDims) == (0 + ... + DElems::size()),
232 "Invalid number of dimensions");
233 static_assert((is_discrete_element_v<DElems> && ...), "Expected DiscreteElements");
234 return DiscreteVector<DDims...>(
235 (DiscreteElement<DDims>(take<DDims>(delems...))
236 - DiscreteElement<DDims>(m_element_begin))...);
237 }
238
239 KOKKOS_FUNCTION constexpr bool empty() const noexcept
240 {
241 return size() == 0;
242 }
243
244 KOKKOS_FUNCTION constexpr explicit operator bool()
245 {
246 return !empty();
247 }
248
249 template <
250 std::size_t N = sizeof...(DDims),
251 class DDim0 = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
252 KOKKOS_FUNCTION auto begin() const
253 {
254 return DiscreteDomainIterator<DDim0>(front());
255 }
256
257 template <
258 std::size_t N = sizeof...(DDims),
259 class DDim0 = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
260 KOKKOS_FUNCTION auto end() const
261 {
262 return DiscreteDomainIterator<DDim0>(m_element_end);
263 }
264
265 template <
266 std::size_t N = sizeof...(DDims),
267 class DDim0 = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
268 KOKKOS_FUNCTION auto cbegin() const
269 {
270 return DiscreteDomainIterator<DDim0>(front());
271 }
272
273 template <
274 std::size_t N = sizeof...(DDims),
275 class DDim0 = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
276 KOKKOS_FUNCTION auto cend() const
277 {
278 return DiscreteDomainIterator<DDim0>(m_element_end);
279 }
280
281 template <
282 std::size_t N = sizeof...(DDims),
283 class = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
284 KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n)
285 {
286 return begin()[n];
287 }
288
289 template <
290 std::size_t N = sizeof...(DDims),
291 class = std::enable_if_t<N == 1, std::tuple_element_t<0, std::tuple<DDims...>>>>
292 KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n) const
293 {
294 return begin()[n];
295 }
296};
297
298template <>
299class DiscreteDomain<>
300{
301 template <class...>
302 friend class DiscreteDomain;
303
304public:
305 using discrete_element_type = DiscreteElement<>;
306
307 using discrete_vector_type = DiscreteVector<>;
308
309 static KOKKOS_FUNCTION constexpr std::size_t rank()
310 {
311 return 0;
312 }
313
314 KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteDomain() = default;
315
316 /// Construct a DiscreteDomain by copies and merge of domains
317 template <class... DDoms, class = std::enable_if_t<(is_discrete_domain_v<DDoms> && ...)>>
318 KOKKOS_FUNCTION constexpr explicit DiscreteDomain([[maybe_unused]] DDoms const&... domains)
319 {
320 }
321
322 /** Construct a DiscreteDomain starting from element_begin with size points.
323 * @param element_begin the lower bound in each direction
324 * @param size the number of points in each direction
325 */
327 [[maybe_unused]] discrete_element_type const& element_begin,
328 [[maybe_unused]] discrete_vector_type const& size)
329 {
330 }
331
333
335
337
339
341
342 KOKKOS_FUNCTION constexpr bool operator==([[maybe_unused]] DiscreteDomain const& other) const
343 {
344 return true;
345 }
346
347#if !defined(__cpp_impl_three_way_comparison) || __cpp_impl_three_way_comparison < 201902L
348 // In C++20, `a!=b` shall be automatically translated by the compiler to `!(a==b)`
349 KOKKOS_FUNCTION constexpr bool operator!=(DiscreteDomain const& other) const
350 {
351 return !(*this == other);
352 }
353#endif
354
355 static KOKKOS_FUNCTION constexpr std::size_t size()
356 {
357 return 1;
358 }
359
360 static KOKKOS_FUNCTION constexpr discrete_vector_type extents() noexcept
361 {
362 return {};
363 }
364
365 static KOKKOS_FUNCTION constexpr discrete_element_type front() noexcept
366 {
367 return {};
368 }
369
370 static KOKKOS_FUNCTION constexpr discrete_element_type back() noexcept
371 {
372 return {};
373 }
374
376 [[maybe_unused]] discrete_vector_type n) const
377 {
378 return *this;
379 }
380
382 [[maybe_unused]] discrete_vector_type n) const
383 {
384 return *this;
385 }
386
388 [[maybe_unused]] discrete_vector_type n) const
389 {
390 return *this;
391 }
392
394 [[maybe_unused]] discrete_vector_type n) const
395 {
396 return *this;
397 }
398
400 [[maybe_unused]] discrete_vector_type n1,
401 [[maybe_unused]] discrete_vector_type n2) const
402 {
403 return *this;
404 }
405
406 KOKKOS_FUNCTION constexpr DiscreteElement<> operator()(
407 DiscreteVector<> const& /* dvect */) const noexcept
408 {
409 return {};
410 }
411
412 template <class... ODims>
414 DiscreteDomain<ODims...> const& /* odomain */) const
415 {
416 return *this;
417 }
418
419 static KOKKOS_FUNCTION bool contains() noexcept
420 {
421 return true;
422 }
423
424 static KOKKOS_FUNCTION bool contains(DiscreteElement<>) noexcept
425 {
426 return true;
427 }
428
430 {
431 return {};
432 }
433
434 static KOKKOS_FUNCTION DiscreteVector<> distance_from_front(DiscreteElement<>) noexcept
435 {
436 return {};
437 }
438
439 static KOKKOS_FUNCTION constexpr bool empty() noexcept
440 {
441 return false;
442 }
443
444 KOKKOS_FUNCTION constexpr explicit operator bool()
445 {
446 return true;
447 }
448};
449
450template <class... QueryDDims, class... DDims>
451KOKKOS_FUNCTION constexpr DiscreteDomain<QueryDDims...> select(
452 DiscreteDomain<DDims...> const& domain)
453{
454 return DiscreteDomain<QueryDDims...>(
455 DiscreteElement<QueryDDims...>(domain.front()),
456 DiscreteVector<QueryDDims...>(domain.extents()));
457}
458
459namespace detail {
460
461template <class T>
462struct ConvertTypeSeqToDiscreteDomain;
463
464template <class... DDims>
465struct ConvertTypeSeqToDiscreteDomain<detail::TypeSeq<DDims...>>
466{
467 using type = DiscreteDomain<DDims...>;
468};
469
470template <class T>
471using convert_type_seq_to_discrete_domain_t = typename ConvertTypeSeqToDiscreteDomain<T>::type;
472
473} // namespace detail
474
475// Computes the cartesian product of DiscreteDomain types
476// Example usage : "using DDom = cartesian_prod_t<DDom1,DDom2,DDom3>;"
477template <typename... DDoms>
478struct cartesian_prod;
479
480template <typename... DDims1, typename... DDims2, typename... DDomsTail>
481struct cartesian_prod<DiscreteDomain<DDims1...>, DiscreteDomain<DDims2...>, DDomsTail...>
482{
483 using type = typename cartesian_prod<DiscreteDomain<DDims1..., DDims2...>, DDomsTail...>::type;
484};
485
486template <typename... DDims>
487struct cartesian_prod<DiscreteDomain<DDims...>>
488{
489 using type = DiscreteDomain<DDims...>;
490};
491
492template <>
493struct cartesian_prod<>
494{
495 using type = ddc::DiscreteDomain<>;
496};
497
498template <typename... DDoms>
499using cartesian_prod_t = typename cartesian_prod<DDoms...>::type;
500
501// Computes the subtraction DDom_a - DDom_b in the sense of linear spaces(retained dimensions are those in DDom_a which are not in DDom_b)
502template <class... DDimsA, class... DDimsB>
503KOKKOS_FUNCTION constexpr auto remove_dims_of(
504 DiscreteDomain<DDimsA...> const& DDom_a,
505 [[maybe_unused]] DiscreteDomain<DDimsB...> const& DDom_b) noexcept
506{
507 using TagSeqA = detail::TypeSeq<DDimsA...>;
508 using TagSeqB = detail::TypeSeq<DDimsB...>;
509
510 using type_seq_r = type_seq_remove_t<TagSeqA, TagSeqB>;
511 return detail::convert_type_seq_to_discrete_domain_t<type_seq_r>(DDom_a);
512}
513
514//! Remove the dimensions DDimsB from DDom_a
515//! @param[in] DDom_a The discrete domain on which to remove dimensions
516//! @return The discrete domain without DDimsB dimensions
517template <class... DDimsB, class... DDimsA>
518KOKKOS_FUNCTION constexpr auto remove_dims_of(DiscreteDomain<DDimsA...> const& DDom_a) noexcept
519{
520 using TagSeqA = detail::TypeSeq<DDimsA...>;
521 using TagSeqB = detail::TypeSeq<DDimsB...>;
522
523 using type_seq_r = type_seq_remove_t<TagSeqA, TagSeqB>;
524 return detail::convert_type_seq_to_discrete_domain_t<type_seq_r>(DDom_a);
525}
526
527// Remove dimensions from a domain type
528template <typename DDom, typename... DDims>
529using remove_dims_of_t = decltype(remove_dims_of<DDims...>(std::declval<DDom>()));
530
531namespace detail {
532
533// Checks if dimension of DDom_a is DDim1. If not, returns restriction to DDim2 of DDom_b. May not be useful in its own, it helps for replace_dim_of
534template <typename DDim1, typename DDim2, typename DDimA, typename... DDimsB>
535KOKKOS_FUNCTION constexpr std::conditional_t<
536 std::is_same_v<DDimA, DDim1>,
537 ddc::DiscreteDomain<DDim2>,
538 ddc::DiscreteDomain<DDimA>>
539replace_dim_of_1d(
540 DiscreteDomain<DDimA> const& DDom_a,
541 [[maybe_unused]] DiscreteDomain<DDimsB...> const& DDom_b) noexcept
542{
543 if constexpr (std::is_same_v<DDimA, DDim1>) {
544 return ddc::DiscreteDomain<DDim2>(DDom_b);
545 } else {
546 return DDom_a;
547 }
548}
549
550} // namespace detail
551
552// Replace in DDom_a the dimension Dim1 by the dimension Dim2 of DDom_b
553template <typename DDim1, typename DDim2, typename... DDimsA, typename... DDimsB>
554KOKKOS_FUNCTION constexpr auto replace_dim_of(
555 DiscreteDomain<DDimsA...> const& DDom_a,
556 [[maybe_unused]] DiscreteDomain<DDimsB...> const& DDom_b) noexcept
557{
558 // TODO : static_asserts
559 using TagSeqA = detail::TypeSeq<DDimsA...>;
560 using TagSeqB = detail::TypeSeq<DDim1>;
561 using TagSeqC = detail::TypeSeq<DDim2>;
562
563 using type_seq_r = ddc::type_seq_replace_t<TagSeqA, TagSeqB, TagSeqC>;
564 return ddc::detail::convert_type_seq_to_discrete_domain_t<type_seq_r>(
565 detail::replace_dim_of_1d<
566 DDim1,
567 DDim2,
568 DDimsA,
569 DDimsB...>(ddc::DiscreteDomain<DDimsA>(DDom_a), DDom_b)...);
570}
571
572// Replace dimensions from a domain type
573template <typename DDom, typename DDim1, typename DDim2>
574using replace_dim_of_t = decltype(replace_dim_of<DDim1, DDim2>(
575 std::declval<DDom>(),
576 std::declval<typename detail::RebindDomain<DDom, detail::TypeSeq<DDim2>>::type>()));
577
578
579template <class... QueryDDims, class... DDims>
580KOKKOS_FUNCTION constexpr DiscreteVector<QueryDDims...> extents(
581 DiscreteDomain<DDims...> const& domain) noexcept
582{
583 return DiscreteVector<QueryDDims...>(DiscreteDomain<QueryDDims>(domain).size()...);
584}
585
586template <class... QueryDDims, class... DDims>
587KOKKOS_FUNCTION constexpr DiscreteElement<QueryDDims...> front(
588 DiscreteDomain<DDims...> const& domain) noexcept
589{
590 return DiscreteElement<QueryDDims...>(DiscreteDomain<QueryDDims>(domain).front()...);
591}
592
593template <class... QueryDDims, class... DDims>
594KOKKOS_FUNCTION constexpr DiscreteElement<QueryDDims...> back(
595 DiscreteDomain<DDims...> const& domain) noexcept
596{
597 return DiscreteElement<QueryDDims...>(DiscreteDomain<QueryDDims>(domain).back()...);
598}
599
600template <class DDim>
602{
603private:
604 DiscreteElement<DDim> m_value = DiscreteElement<DDim>();
605
606public:
607 using iterator_category = std::random_access_iterator_tag;
608
609 using value_type = DiscreteElement<DDim>;
610
611 using difference_type = std::ptrdiff_t;
612
614
615 KOKKOS_FUNCTION constexpr explicit DiscreteDomainIterator(DiscreteElement<DDim> value)
616 : m_value(value)
617 {
618 }
619
620 KOKKOS_FUNCTION constexpr DiscreteElement<DDim> operator*() const noexcept
621 {
622 return m_value;
623 }
624
626 {
627 ++m_value;
628 return *this;
629 }
630
632 {
633 auto tmp = *this;
634 ++*this;
635 return tmp;
636 }
637
639 {
640 --m_value;
641 return *this;
642 }
643
645 {
646 auto tmp = *this;
647 --*this;
648 return tmp;
649 }
650
651 KOKKOS_FUNCTION constexpr DiscreteDomainIterator& operator+=(difference_type n)
652 {
653 if (n >= difference_type(0)) {
654 m_value += static_cast<DiscreteElementType>(n);
655 } else {
656 m_value -= static_cast<DiscreteElementType>(-n);
657 }
658 return *this;
659 }
660
661 KOKKOS_FUNCTION constexpr DiscreteDomainIterator& operator-=(difference_type n)
662 {
663 if (n >= difference_type(0)) {
664 m_value -= static_cast<DiscreteElementType>(n);
665 } else {
666 m_value += static_cast<DiscreteElementType>(-n);
667 }
668 return *this;
669 }
670
671 KOKKOS_FUNCTION constexpr DiscreteElement<DDim> operator[](difference_type n) const
672 {
673 return m_value + n;
674 }
675
676 friend KOKKOS_FUNCTION constexpr bool operator==(
677 DiscreteDomainIterator const& xx,
678 DiscreteDomainIterator const& yy)
679 {
680 return xx.m_value == yy.m_value;
681 }
682
683#if !defined(__cpp_impl_three_way_comparison) || __cpp_impl_three_way_comparison < 201902L
684 // In C++20, `a!=b` shall be automatically translated by the compiler to `!(a==b)`
685 friend KOKKOS_FUNCTION constexpr bool operator!=(
688 {
689 return xx.m_value != yy.m_value;
690 }
691#endif
692
693 friend KOKKOS_FUNCTION constexpr bool operator<(
694 DiscreteDomainIterator const& xx,
695 DiscreteDomainIterator const& yy)
696 {
697 return xx.m_value < yy.m_value;
698 }
699
700 friend KOKKOS_FUNCTION constexpr bool operator>(
701 DiscreteDomainIterator const& xx,
702 DiscreteDomainIterator const& yy)
703 {
704 return yy < xx;
705 }
706
707 friend KOKKOS_FUNCTION constexpr bool operator<=(
708 DiscreteDomainIterator const& xx,
709 DiscreteDomainIterator const& yy)
710 {
711 return !(yy < xx);
712 }
713
714 friend KOKKOS_FUNCTION constexpr bool operator>=(
715 DiscreteDomainIterator const& xx,
716 DiscreteDomainIterator const& yy)
717 {
718 return !(xx < yy);
719 }
720
723 difference_type n)
724 {
725 return i += n;
726 }
727
729 difference_type n,
731 {
732 return i += n;
733 }
734
737 difference_type n)
738 {
739 return i -= n;
740 }
741
742 friend KOKKOS_FUNCTION constexpr difference_type operator-(
743 DiscreteDomainIterator const& xx,
744 DiscreteDomainIterator const& yy)
745 {
746 return (yy.m_value > xx.m_value) ? (-static_cast<difference_type>(yy.m_value - xx.m_value))
747 : (xx.m_value - yy.m_value);
748 }
749};
750
751} // namespace ddc
static KOKKOS_FUNCTION constexpr discrete_vector_type extents() noexcept
KOKKOS_DEFAULTED_FUNCTION ~DiscreteDomain()=default
KOKKOS_FUNCTION constexpr DiscreteDomain(discrete_element_type const &element_begin, discrete_vector_type const &size)
Construct a DiscreteDomain starting from element_begin with size points.
KOKKOS_FUNCTION constexpr DiscreteDomain remove(discrete_vector_type n1, discrete_vector_type n2) const
KOKKOS_FUNCTION constexpr DiscreteDomain take_last(discrete_vector_type n) const
static KOKKOS_FUNCTION constexpr std::size_t rank()
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain(DiscreteDomain const &x)=default
static KOKKOS_FUNCTION bool contains() noexcept
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteDomain()=default
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain & operator=(DiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr operator bool()
static KOKKOS_FUNCTION constexpr std::size_t size()
static KOKKOS_FUNCTION constexpr bool empty() noexcept
KOKKOS_FUNCTION constexpr DiscreteDomain remove_last(discrete_vector_type n) const
static KOKKOS_FUNCTION bool contains(DiscreteElement<>) noexcept
static KOKKOS_FUNCTION constexpr discrete_element_type back() noexcept
static KOKKOS_FUNCTION DiscreteVector distance_from_front(DiscreteElement<>) noexcept
static KOKKOS_FUNCTION constexpr discrete_element_type front() noexcept
KOKKOS_FUNCTION constexpr DiscreteDomain take_first(discrete_vector_type n) const
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain & operator=(DiscreteDomain const &x)=default
KOKKOS_FUNCTION constexpr DiscreteDomain(DDoms const &... domains)
Construct a DiscreteDomain by copies and merge of domains.
KOKKOS_FUNCTION constexpr bool operator==(DiscreteDomain const &other) const
KOKKOS_FUNCTION constexpr DiscreteDomain remove_first(discrete_vector_type n) const
KOKKOS_FUNCTION constexpr DiscreteDomain restrict_with(DiscreteDomain< ODims... > const &) const
KOKKOS_FUNCTION constexpr DiscreteElement operator()(DiscreteVector<> const &) const noexcept
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain(DiscreteDomain &&x)=default
static KOKKOS_FUNCTION DiscreteVector distance_from_front() noexcept
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain(DiscreteDomain const &x)=default
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain(DiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr DiscreteDomain remove_last(discrete_vector_type n) const
KOKKOS_FUNCTION bool contains(DElems const &... delems) const noexcept
KOKKOS_FUNCTION constexpr DiscreteDomain take_last(discrete_vector_type n) const
KOKKOS_FUNCTION auto begin() const
KOKKOS_FUNCTION constexpr DiscreteDomain remove(discrete_vector_type n1, discrete_vector_type n2) const
KOKKOS_FUNCTION constexpr auto restrict_with(DiscreteDomain< ODDims... > const &odomain) const
static KOKKOS_FUNCTION constexpr std::size_t rank()
KOKKOS_FUNCTION constexpr bool empty() const noexcept
KOKKOS_FUNCTION constexpr std::size_t size() const
friend class DiscreteDomain
KOKKOS_FUNCTION constexpr discrete_vector_type extents() const noexcept
KOKKOS_FUNCTION constexpr DiscreteVector< QueryDDim > extent() const noexcept
KOKKOS_FUNCTION constexpr discrete_element_type front() const noexcept
KOKKOS_FUNCTION constexpr DiscreteDomain(DDoms const &... domains)
Construct a DiscreteDomain by copies and merge of domains.
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain & operator=(DiscreteDomain &&x)=default
KOKKOS_FUNCTION constexpr DiscreteDomain remove_first(discrete_vector_type n) const
KOKKOS_FUNCTION constexpr bool operator==(DiscreteDomain< ODims... > const &other) const
KOKKOS_FUNCTION auto cbegin() const
KOKKOS_FUNCTION auto end() const
KOKKOS_FUNCTION constexpr DiscreteDomain take_first(discrete_vector_type n) const
KOKKOS_DEFAULTED_FUNCTION ~DiscreteDomain()=default
KOKKOS_FUNCTION auto cend() const
KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n) const
KOKKOS_FUNCTION DiscreteVector< DDims... > distance_from_front(DElems const &... delems) const noexcept
KOKKOS_FUNCTION constexpr discrete_element_type back() const noexcept
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain & operator=(DiscreteDomain const &x)=default
KOKKOS_FUNCTION constexpr DiscreteElement< DDims... > operator()(DiscreteVector< DDims... > const &dvect) const noexcept
KOKKOS_DEFAULTED_FUNCTION DiscreteDomain()=default
KOKKOS_FUNCTION constexpr operator bool()
KOKKOS_FUNCTION constexpr DiscreteDomain(discrete_element_type const &element_begin, discrete_vector_type const &size)
Construct a DiscreteDomain starting from element_begin with size points.
KOKKOS_FUNCTION constexpr decltype(auto) operator[](std::size_t n)
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteElement()=default
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteVector< OTags... > const &rhs) const noexcept
KOKKOS_DEFAULTED_FUNCTION constexpr DiscreteVector()=default
The top-level namespace of DDC.
KOKKOS_FUNCTION constexpr DiscreteElement< QueryDDims... > back(DiscreteDomain< DDims... > const &domain) noexcept
KOKKOS_FUNCTION constexpr auto remove_dims_of(DiscreteDomain< DDimsA... > const &DDom_a) noexcept
Remove the dimensions DDimsB from DDom_a.
KOKKOS_FUNCTION constexpr DiscreteElement< QueryDDims... > front(DiscreteDomain< DDims... > const &domain) noexcept
KOKKOS_FUNCTION constexpr DiscreteVector< QueryDDims... > extents(DiscreteDomain< DDims... > const &domain) noexcept
KOKKOS_FUNCTION constexpr auto remove_dims_of(DiscreteDomain< DDimsA... > const &DDom_a, DiscreteDomain< DDimsB... > const &DDom_b) noexcept
KOKKOS_FUNCTION constexpr auto replace_dim_of(DiscreteDomain< DDimsA... > const &DDom_a, DiscreteDomain< DDimsB... > const &DDom_b) noexcept
constexpr bool is_discrete_domain_v
KOKKOS_FUNCTION constexpr DiscreteDomain< QueryDDims... > select(DiscreteDomain< DDims... > const &domain)
KOKKOS_FUNCTION constexpr DiscreteDomainIterator operator--(int)
friend KOKKOS_FUNCTION constexpr bool operator<=(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
KOKKOS_FUNCTION constexpr DiscreteElement< DDim > operator*() const noexcept
friend KOKKOS_FUNCTION constexpr bool operator>=(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
KOKKOS_DEFAULTED_FUNCTION DiscreteDomainIterator()=default
KOKKOS_FUNCTION constexpr DiscreteElement< DDim > operator[](difference_type n) const
KOKKOS_FUNCTION constexpr DiscreteDomainIterator & operator--()
KOKKOS_FUNCTION constexpr DiscreteDomainIterator operator++(int)
friend KOKKOS_FUNCTION constexpr DiscreteDomainIterator operator-(DiscreteDomainIterator i, difference_type n)
friend KOKKOS_FUNCTION constexpr DiscreteDomainIterator operator+(DiscreteDomainIterator i, difference_type n)
friend KOKKOS_FUNCTION constexpr bool operator>(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
friend KOKKOS_FUNCTION constexpr bool operator!=(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
friend KOKKOS_FUNCTION constexpr bool operator<(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
KOKKOS_FUNCTION constexpr DiscreteDomainIterator & operator+=(difference_type n)
KOKKOS_FUNCTION constexpr DiscreteDomainIterator & operator++()
friend KOKKOS_FUNCTION constexpr DiscreteDomainIterator operator+(difference_type n, DiscreteDomainIterator i)
friend KOKKOS_FUNCTION constexpr bool operator==(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)
KOKKOS_FUNCTION constexpr DiscreteDomainIterator(DiscreteElement< DDim > value)
KOKKOS_FUNCTION constexpr DiscreteDomainIterator & operator-=(difference_type n)
friend KOKKOS_FUNCTION constexpr difference_type operator-(DiscreteDomainIterator const &xx, DiscreteDomainIterator const &yy)