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