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