33 #ifndef GKO_CORE_BASE_RANGE_HPP_ 34 #define GKO_CORE_BASE_RANGE_HPP_ 37 #include <ginkgo/core/base/math.hpp> 38 #include <ginkgo/core/base/std_extensions.hpp> 39 #include <ginkgo/core/base/types.hpp> 40 #include <ginkgo/core/base/utils.hpp> 82 :
span{point, point + 1}
114 GKO_ATTRIBUTES GKO_INLINE constexpr
bool operator<(
const span &first,
121 GKO_ATTRIBUTES GKO_INLINE constexpr
bool operator<=(
const span &first,
128 GKO_ATTRIBUTES GKO_INLINE constexpr
bool operator>(
const span &first,
131 return second < first;
135 GKO_ATTRIBUTES GKO_INLINE constexpr
bool operator>=(
const span &first,
138 return second <= first;
142 GKO_ATTRIBUTES GKO_INLINE constexpr
bool operator==(
const span &first,
149 GKO_ATTRIBUTES GKO_INLINE constexpr
bool operator!=(
const span &first,
152 return !(first == second);
159 template <
size_type CurrentDimension = 0,
typename FirstRange,
160 typename SecondRange>
161 GKO_ATTRIBUTES constexpr GKO_INLINE
162 xstd::enable_if_t<(CurrentDimension >=
max(FirstRange::dimensionality,
163 SecondRange::dimensionality)),
165 equal_dimensions(
const FirstRange &,
const SecondRange &)
170 template <
size_type CurrentDimension = 0,
typename FirstRange,
171 typename SecondRange>
172 GKO_ATTRIBUTES constexpr GKO_INLINE
173 xstd::enable_if_t<(CurrentDimension <
max(FirstRange::dimensionality,
174 SecondRange::dimensionality)),
176 equal_dimensions(
const FirstRange &first,
const SecondRange &second)
178 return first.length(CurrentDimension) == second.length(CurrentDimension) &&
179 equal_dimensions<CurrentDimension + 1>(first, second);
295 template <
typename Accessor>
306 static constexpr
size_type dimensionality = accessor::dimensionality;
316 template <
typename... AccessorParams>
317 GKO_ATTRIBUTES constexpr
explicit range(AccessorParams &&... params)
318 : accessor_{std::forward<AccessorParams>(params)...}
333 template <
typename... DimensionTypes>
334 GKO_ATTRIBUTES constexpr
auto operator()(DimensionTypes &&... dimensions)
335 const -> decltype(std::declval<accessor>()(
336 std::forward<DimensionTypes>(dimensions)...))
338 static_assert(
sizeof...(dimensions) <= dimensionality,
339 "Too many dimensions in range call");
340 return accessor_(std::forward<DimensionTypes>(dimensions)...);
351 template <
typename OtherAccessor>
355 GKO_ASSERT(detail::equal_dimensions(*
this, other));
356 accessor_.copy_from(other);
375 GKO_ASSERT(detail::equal_dimensions(*
this, other));
389 return accessor_.length(dimension);
427 enum class operation_kind { range_by_range, scalar_by_range, range_by_scalar };
430 template <
typename Accessor,
typename Operation>
431 struct implement_unary_operation {
433 static constexpr
size_type dimensionality = accessor::dimensionality;
435 GKO_ATTRIBUTES constexpr
explicit implement_unary_operation(
436 const Accessor &operand)
440 template <
typename... DimensionTypes>
441 GKO_ATTRIBUTES constexpr
auto operator()(
442 const DimensionTypes &... dimensions)
const 443 -> decltype(Operation::evaluate(std::declval<accessor>(),
446 return Operation::evaluate(operand, dimensions...);
451 return operand.length(dimension);
454 template <
typename OtherAccessor>
455 GKO_ATTRIBUTES
void copy_from(
const OtherAccessor &other)
const =
delete;
461 template <operation_kind Kind,
typename FirstOperand,
typename SecondOperand,
463 struct implement_binary_operation {};
465 template <
typename FirstAccessor,
typename SecondAccessor,
typename Operation>
466 struct implement_binary_operation<operation_kind::range_by_range, FirstAccessor,
468 using first_accessor = FirstAccessor;
469 using second_accessor = SecondAccessor;
470 static_assert(first_accessor::dimensionality ==
471 second_accessor::dimensionality,
472 "Both ranges need to have the same number of dimensions");
473 static constexpr
size_type dimensionality = first_accessor::dimensionality;
475 GKO_ATTRIBUTES
explicit implement_binary_operation(
476 const FirstAccessor &first,
const SecondAccessor &second)
477 : first{first}, second{second}
479 GKO_ASSERT(gko::detail::equal_dimensions(first, second));
482 template <
typename... DimensionTypes>
483 GKO_ATTRIBUTES constexpr
auto operator()(
484 const DimensionTypes &... dimensions)
const 485 -> decltype(Operation::evaluate_range_by_range(
486 std::declval<first_accessor>(), std::declval<second_accessor>(),
489 return Operation::evaluate_range_by_range(first, second, dimensions...);
494 return first.length(dimension);
497 template <
typename OtherAccessor>
498 GKO_ATTRIBUTES
void copy_from(
const OtherAccessor &other)
const =
delete;
500 const first_accessor first;
501 const second_accessor second;
504 template <
typename FirstOperand,
typename SecondAccessor,
typename Operation>
505 struct implement_binary_operation<operation_kind::scalar_by_range, FirstOperand,
507 using second_accessor = SecondAccessor;
508 static constexpr
size_type dimensionality = second_accessor::dimensionality;
510 GKO_ATTRIBUTES constexpr
explicit implement_binary_operation(
511 const FirstOperand &first,
const SecondAccessor &second)
512 : first{first}, second{second}
515 template <
typename... DimensionTypes>
516 GKO_ATTRIBUTES constexpr
auto operator()(
517 const DimensionTypes &... dimensions)
const 518 -> decltype(Operation::evaluate_scalar_by_range(
519 std::declval<FirstOperand>(), std::declval<second_accessor>(),
522 return Operation::evaluate_scalar_by_range(first, second,
528 return second.length(dimension);
531 template <
typename OtherAccessor>
532 GKO_ATTRIBUTES
void copy_from(
const OtherAccessor &other)
const =
delete;
534 const FirstOperand first;
535 const second_accessor second;
538 template <
typename FirstAccessor,
typename SecondOperand,
typename Operation>
539 struct implement_binary_operation<operation_kind::range_by_scalar,
540 FirstAccessor, SecondOperand,
Operation> {
541 using first_accessor = FirstAccessor;
542 static constexpr
size_type dimensionality = first_accessor::dimensionality;
544 GKO_ATTRIBUTES constexpr
explicit implement_binary_operation(
545 const FirstAccessor &first,
const SecondOperand &second)
546 : first{first}, second{second}
549 template <
typename... DimensionTypes>
550 GKO_ATTRIBUTES constexpr
auto operator()(
551 const DimensionTypes &... dimensions)
const 552 -> decltype(Operation::evaluate_range_by_scalar(
553 std::declval<first_accessor>(), std::declval<SecondOperand>(),
556 return Operation::evaluate_range_by_scalar(first, second,
562 return first.length(dimension);
565 template <
typename OtherAccessor>
566 GKO_ATTRIBUTES
void copy_from(
const OtherAccessor &other)
const =
delete;
568 const first_accessor first;
569 const SecondOperand second;
576 #define GKO_ENABLE_UNARY_RANGE_OPERATION(_operation_name, _operator_name, \ 578 namespace accessor { \ 579 template <typename Operand> \ 580 struct _operation_name \ 581 : ::gko::detail::implement_unary_operation<Operand, \ 582 ::gko::_operator> { \ 583 using ::gko::detail::implement_unary_operation< \ 584 Operand, ::gko::_operator>::implement_unary_operation; \ 587 GKO_BIND_UNARY_RANGE_OPERATION_TO_OPERATOR(_operation_name, _operator_name) 590 #define GKO_BIND_UNARY_RANGE_OPERATION_TO_OPERATOR(_operation_name, \ 592 template <typename Accessor> \ 593 GKO_ATTRIBUTES constexpr GKO_INLINE \ 594 range<accessor::_operation_name<Accessor>> \ 595 _operator_name(const range<Accessor> &operand) \ 597 return range<accessor::_operation_name<Accessor>>( \ 598 operand.get_accessor()); \ 600 static_assert(true, \ 601 "This assert is used to counter the false positive extra " \ 602 "semi-colon warnings") 605 #define GKO_DEFINE_SIMPLE_UNARY_OPERATION(_name, ...) \ 608 template <typename Operand> \ 609 GKO_ATTRIBUTES static constexpr auto simple_evaluate_impl( \ 610 const Operand &operand) -> decltype(__VA_ARGS__) \ 612 return __VA_ARGS__; \ 616 template <typename AccessorType, typename... DimensionTypes> \ 617 GKO_ATTRIBUTES static constexpr auto evaluate( \ 618 const AccessorType &accessor, \ 619 const DimensionTypes &... dimensions) \ 620 -> decltype(simple_evaluate_impl(accessor(dimensions...))) \ 622 return simple_evaluate_impl(accessor(dimensions...)); \ 632 GKO_DEFINE_SIMPLE_UNARY_OPERATION(
unary_plus, +operand);
633 GKO_DEFINE_SIMPLE_UNARY_OPERATION(
unary_minus, -operand);
636 GKO_DEFINE_SIMPLE_UNARY_OPERATION(
logical_not, !operand);
639 GKO_DEFINE_SIMPLE_UNARY_OPERATION(
bitwise_not, ~(operand));
643 GKO_DEFINE_SIMPLE_UNARY_OPERATION(one_operation,
one(operand));
644 GKO_DEFINE_SIMPLE_UNARY_OPERATION(abs_operation,
abs(operand));
645 GKO_DEFINE_SIMPLE_UNARY_OPERATION(real_operation,
real(operand));
646 GKO_DEFINE_SIMPLE_UNARY_OPERATION(imag_operation,
imag(operand));
647 GKO_DEFINE_SIMPLE_UNARY_OPERATION(conj_operation,
conj(operand));
648 GKO_DEFINE_SIMPLE_UNARY_OPERATION(squared_norm_operation,
656 GKO_ENABLE_UNARY_RANGE_OPERATION(
unary_plus,
operator+,
657 accessor::detail::unary_plus);
658 GKO_ENABLE_UNARY_RANGE_OPERATION(
unary_minus,
operator-,
659 accessor::detail::unary_minus);
662 GKO_ENABLE_UNARY_RANGE_OPERATION(
logical_not,
operator!,
663 accessor::detail::logical_not);
666 GKO_ENABLE_UNARY_RANGE_OPERATION(
bitwise_not,
operator~,
667 accessor::detail::bitwise_not);
671 accessor::detail::zero_operation);
673 accessor::detail::one_operation);
675 accessor::detail::abs_operation);
677 accessor::detail::real_operation);
679 accessor::detail::imag_operation);
681 accessor::detail::conj_operation);
683 accessor::detail::squared_norm_operation);
688 template <
typename Accessor>
690 using accessor = Accessor;
691 static constexpr
size_type dimensionality = accessor::dimensionality;
694 const Accessor &operand)
698 template <
typename FirstDimensionType,
typename SecondDimensionType,
699 typename... DimensionTypes>
700 GKO_ATTRIBUTES constexpr
auto operator()(
701 const FirstDimensionType &first_dim,
702 const SecondDimensionType &second_dim,
703 const DimensionTypes &... dims)
const 704 -> decltype(std::declval<accessor>()(second_dim, first_dim, dims...))
706 return operand(second_dim, first_dim, dims...);
711 return dimension < 2 ? operand.length(dimension ^ 1)
712 : operand.length(dimension);
715 template <
typename OtherAccessor>
716 GKO_ATTRIBUTES
void copy_from(
const OtherAccessor &other)
const =
delete;
718 const accessor operand;
728 #undef GKO_DEFINE_SIMPLE_UNARY_OPERATION 729 #undef GKO_ENABLE_UNARY_RANGE_OPERATION 732 #define GKO_ENABLE_BINARY_RANGE_OPERATION(_operation_name, _operator_name, \ 734 namespace accessor { \ 735 template <::gko::detail::operation_kind Kind, typename FirstOperand, \ 736 typename SecondOperand> \ 737 struct _operation_name \ 738 : ::gko::detail::implement_binary_operation< \ 739 Kind, FirstOperand, SecondOperand, ::gko::_operator> { \ 740 using ::gko::detail::implement_binary_operation< \ 741 Kind, FirstOperand, SecondOperand, \ 742 ::gko::_operator>::implement_binary_operation; \ 745 GKO_BIND_RANGE_OPERATION_TO_OPERATOR(_operation_name, _operator_name); \ 746 static_assert(true, \ 747 "This assert is used to counter the false positive extra " \ 748 "semi-colon warnings") 751 #define GKO_BIND_RANGE_OPERATION_TO_OPERATOR(_operation_name, _operator_name) \ 752 template <typename Accessor> \ 753 GKO_ATTRIBUTES constexpr GKO_INLINE range<accessor::_operation_name< \ 754 ::gko::detail::operation_kind::range_by_range, Accessor, Accessor>> \ 755 _operator_name(const range<Accessor> &first, \ 756 const range<Accessor> &second) \ 758 return range<accessor::_operation_name< \ 759 ::gko::detail::operation_kind::range_by_range, Accessor, \ 760 Accessor>>(first.get_accessor(), second.get_accessor()); \ 763 template <typename FirstAccessor, typename SecondAccessor> \ 764 GKO_ATTRIBUTES constexpr GKO_INLINE range<accessor::_operation_name< \ 765 ::gko::detail::operation_kind::range_by_range, FirstAccessor, \ 767 _operator_name(const range<FirstAccessor> &first, \ 768 const range<SecondAccessor> &second) \ 770 return range<accessor::_operation_name< \ 771 ::gko::detail::operation_kind::range_by_range, FirstAccessor, \ 772 SecondAccessor>>(first.get_accessor(), second.get_accessor()); \ 775 template <typename FirstAccessor, typename SecondOperand> \ 776 GKO_ATTRIBUTES constexpr GKO_INLINE range<accessor::_operation_name< \ 777 ::gko::detail::operation_kind::range_by_scalar, FirstAccessor, \ 779 _operator_name(const range<FirstAccessor> &first, \ 780 const SecondOperand &second) \ 782 return range<accessor::_operation_name< \ 783 ::gko::detail::operation_kind::range_by_scalar, FirstAccessor, \ 784 SecondOperand>>(first.get_accessor(), second); \ 787 template <typename FirstOperand, typename SecondAccessor> \ 788 GKO_ATTRIBUTES constexpr GKO_INLINE range<accessor::_operation_name< \ 789 ::gko::detail::operation_kind::scalar_by_range, FirstOperand, \ 791 _operator_name(const FirstOperand &first, \ 792 const range<SecondAccessor> &second) \ 794 return range<accessor::_operation_name< \ 795 ::gko::detail::operation_kind::scalar_by_range, FirstOperand, \ 796 SecondAccessor>>(first, second.get_accessor()); \ 798 static_assert(true, \ 799 "This assert is used to counter the false positive extra " \ 800 "semi-colon warnings") 803 #define GKO_DEFINE_SIMPLE_BINARY_OPERATION(_name, ...) \ 806 template <typename FirstOperand, typename SecondOperand> \ 807 GKO_ATTRIBUTES constexpr static auto simple_evaluate_impl( \ 808 const FirstOperand &first, const SecondOperand &second) \ 809 -> decltype(__VA_ARGS__) \ 811 return __VA_ARGS__; \ 815 template <typename FirstAccessor, typename SecondAccessor, \ 816 typename... DimensionTypes> \ 817 GKO_ATTRIBUTES static constexpr auto evaluate_range_by_range( \ 818 const FirstAccessor &first, const SecondAccessor &second, \ 819 const DimensionTypes &... dims) \ 820 -> decltype(simple_evaluate_impl(first(dims...), second(dims...))) \ 822 return simple_evaluate_impl(first(dims...), second(dims...)); \ 825 template <typename FirstOperand, typename SecondAccessor, \ 826 typename... DimensionTypes> \ 827 GKO_ATTRIBUTES static constexpr auto evaluate_scalar_by_range( \ 828 const FirstOperand &first, const SecondAccessor &second, \ 829 const DimensionTypes &... dims) \ 830 -> decltype(simple_evaluate_impl(first, second(dims...))) \ 832 return simple_evaluate_impl(first, second(dims...)); \ 835 template <typename FirstAccessor, typename SecondOperand, \ 836 typename... DimensionTypes> \ 837 GKO_ATTRIBUTES static constexpr auto evaluate_range_by_scalar( \ 838 const FirstAccessor &first, const SecondOperand &second, \ 839 const DimensionTypes &... dims) \ 840 -> decltype(simple_evaluate_impl(first(dims...), second)) \ 842 return simple_evaluate_impl(first(dims...), second); \ 852 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
add, first + second);
853 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
sub, first - second);
854 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
mul, first *second);
855 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
div, first / second);
856 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
mod, first % second);
859 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
less, first < second);
860 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
greater, first > second);
861 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
less_or_equal, first <= second);
863 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
equal, first == second);
864 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
not_equal, first != second);
867 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
logical_or, first || second);
868 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
logical_and, first &&second);
871 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
bitwise_or, first | second);
872 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
bitwise_and, first &second);
873 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
bitwise_xor, first ^ second);
874 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
left_shift, first << second);
875 GKO_DEFINE_SIMPLE_BINARY_OPERATION(
right_shift, first >> second);
878 GKO_DEFINE_SIMPLE_BINARY_OPERATION(max_operation,
max(first, second));
879 GKO_DEFINE_SIMPLE_BINARY_OPERATION(min_operation,
min(first, second));
886 GKO_ENABLE_BINARY_RANGE_OPERATION(
add,
operator+, accessor::detail::add);
887 GKO_ENABLE_BINARY_RANGE_OPERATION(
sub,
operator-, accessor::detail::sub);
888 GKO_ENABLE_BINARY_RANGE_OPERATION(
mul,
operator*, accessor::detail::mul);
889 GKO_ENABLE_BINARY_RANGE_OPERATION(
div,
operator/, accessor::detail::div);
890 GKO_ENABLE_BINARY_RANGE_OPERATION(
mod,
operator%, accessor::detail::mod);
893 GKO_ENABLE_BINARY_RANGE_OPERATION(
less,
operator<, accessor::detail::less);
894 GKO_ENABLE_BINARY_RANGE_OPERATION(
greater,
operator>,
895 accessor::detail::greater);
897 accessor::detail::less_or_equal);
899 accessor::detail::greater_or_equal);
900 GKO_ENABLE_BINARY_RANGE_OPERATION(
equal,
operator==, accessor::detail::equal);
901 GKO_ENABLE_BINARY_RANGE_OPERATION(
not_equal,
operator!=,
902 accessor::detail::not_equal);
905 GKO_ENABLE_BINARY_RANGE_OPERATION(
logical_or,
operator||,
906 accessor::detail::logical_or);
907 GKO_ENABLE_BINARY_RANGE_OPERATION(
logical_and,
operator&&,
908 accessor::detail::logical_and);
911 GKO_ENABLE_BINARY_RANGE_OPERATION(
bitwise_or,
operator|,
912 accessor::detail::bitwise_or);
913 GKO_ENABLE_BINARY_RANGE_OPERATION(
bitwise_and,
operator&,
914 accessor::detail::bitwise_and);
915 GKO_ENABLE_BINARY_RANGE_OPERATION(
bitwise_xor,
operator^,
916 accessor::detail::bitwise_xor);
917 GKO_ENABLE_BINARY_RANGE_OPERATION(
left_shift,
operator<<,
918 accessor::detail::left_shift);
919 GKO_ENABLE_BINARY_RANGE_OPERATION(
right_shift,
operator>>,
920 accessor::detail::right_shift);
924 accessor::detail::max_operation);
926 accessor::detail::min_operation);
933 template <gko::detail::operation_kind Kind,
typename FirstAccessor,
934 typename SecondAccessor>
936 static_assert(Kind == gko::detail::operation_kind::range_by_range,
937 "Matrix multiplication expects both operands to be ranges");
938 using first_accessor = FirstAccessor;
939 using second_accessor = SecondAccessor;
940 static_assert(first_accessor::dimensionality ==
941 second_accessor::dimensionality,
942 "Both ranges need to have the same number of dimensions");
943 static constexpr
size_type dimensionality = first_accessor::dimensionality;
945 GKO_ATTRIBUTES
explicit mmul_operation(
const FirstAccessor &first,
946 const SecondAccessor &second)
947 : first{first}, second{second}
949 GKO_ASSERT(first.length(1) == second.length(0));
950 GKO_ASSERT(gko::detail::equal_dimensions<2>(first, second));
953 template <
typename FirstDimension,
typename SecondDimension,
954 typename... DimensionTypes>
955 GKO_ATTRIBUTES
auto operator()(
const FirstDimension &row,
956 const SecondDimension &col,
957 const DimensionTypes &... rest)
const 958 -> decltype(std::declval<FirstAccessor>()(row, 0, rest...) *
959 std::declval<SecondAccessor>()(0, col, rest...) +
960 std::declval<FirstAccessor>()(row, 1, rest...) *
961 std::declval<SecondAccessor>()(1, col, rest...))
964 decltype(first(row, 0, rest...) * second(0, col, rest...) +
965 first(row, 1, rest...) * second(1, col, rest...));
966 GKO_ASSERT(first.length(1) == second.length(0));
967 auto result = zero<result_type>();
968 const auto size = first.length(1);
969 for (
auto i =
zero(size); i < size; ++i) {
970 result += first(row, i, rest...) * second(i, col, rest...);
977 return dimension == 1 ? second.length(1) : first.length(dimension);
980 template <
typename OtherAccessor>
981 GKO_ATTRIBUTES
void copy_from(
const OtherAccessor &other)
const =
delete;
983 const first_accessor first;
984 const second_accessor second;
994 #undef GKO_DEFINE_SIMPLE_BINARY_OPERATION 995 #undef GKO_ENABLE_BINARY_RANGE_OPERATION 1001 #endif // GKO_CORE_BASE_RANGE_HPP_ Definition: range.hpp:900
Definition: range.hpp:895
Definition: range.hpp:889
const size_type end
End of the span.
Definition: range.hpp:110
Definition: range.hpp:893
Definition: range.hpp:899
Definition: range.hpp:675
constexpr const accessor & get_accessor() const noexcept
`Returns a reference to the accessor.
Definition: range.hpp:409
Definition: range.hpp:886
constexpr bool is_valid() const
Checks if a span is valid.
Definition: range.hpp:100
Definition: range.hpp:679
constexpr T zero()
Returns the additive identity for T.
Definition: math.hpp:292
constexpr span(size_type begin, size_type end) noexcept
Creates a span.
Definition: range.hpp:91
constexpr bool operator!=(const dim< Dimensionality, DimensionType > &x, const dim< Dimensionality, DimensionType > &y)
Checks if two dim objects are different.
Definition: dim.hpp:216
constexpr auto operator()(DimensionTypes &&... dimensions) const -> decltype(std::declval< accessor >()(std::forward< DimensionTypes >(dimensions)...))
Returns a value (or a sub-range) with the specified indexes.
Definition: range.hpp:334
Definition: range.hpp:683
constexpr T abs(const T &x)
Returns the absolute value of the object.
Definition: math.hpp:350
Definition: range.hpp:906
constexpr T imag(const T &)
Returns the imaginary part of the object.
Definition: math.hpp:425
Definition: range.hpp:657
std::size_t size_type
Integral type used for allocation quantities.
Definition: types.hpp:94
constexpr size_type length(size_type dimension) const
Returns the length of the specified dimension of the range.
Definition: range.hpp:387
Definition: range.hpp:890
Definition: range.hpp:659
Definition: range.hpp:677
The Ginkgo namespace.
Definition: abstract_factory.hpp:45
const range & operator=(const range &other) const
Assigns another range to this range.
Definition: range.hpp:373
Definition: range.hpp:916
Definition: range.hpp:918
Definition: range.hpp:671
constexpr T real(const T &x)
Returns the real part of the object.
Definition: math.hpp:409
Definition: range.hpp:667
constexpr const accessor * operator->() const noexcept
Returns a pointer to the accessor.
Definition: range.hpp:399
Definition: range.hpp:914
Definition: range.hpp:663
constexpr T min(const T &x, const T &y)
Returns the smaller of the arguments.
Definition: math.hpp:393
constexpr auto squared_norm(const T &x) -> decltype(real(conj(x) *x))
Returns the squared norm of the object.
Definition: math.hpp:456
Definition: range.hpp:673
Definition: range.hpp:908
Definition: range.hpp:926
Operations can be used to define functionalities whose implementations differ among devices...
Definition: executor.hpp:173
Accessor accessor
The type of the underlying accessor.
Definition: range.hpp:301
const range & operator=(const range< OtherAccessor > &other) const
Definition: range.hpp:352
T conj(const T &x)
Returns the conjugate of an object.
Definition: math.hpp:439
constexpr range(AccessorParams &&... params)
Creates a new range.
Definition: range.hpp:317
constexpr span(size_type point) noexcept
Creates a span representing a point point.
Definition: range.hpp:81
Definition: range.hpp:681
Definition: range.hpp:887
Definition: range.hpp:912
Definition: range.hpp:924
Definition: range.hpp:935
Definition: range.hpp:902
const size_type begin
Beginning of the span.
Definition: range.hpp:105
Definition: range.hpp:689
constexpr T max(const T &x, const T &y)
Returns the larger of the arguments.
Definition: math.hpp:373
Definition: range.hpp:888
A span is a lightweight structure used to create sub-ranges from other ranges.
Definition: range.hpp:73
A range is a multidimensional view of the memory.
Definition: range.hpp:296
Definition: range.hpp:897
Definition: range.hpp:920
constexpr dim< 2, DimensionType > transpose(const dim< 2, DimensionType > &dimensions) noexcept
Returns a dim<2> object with its dimensions swapped.
Definition: dim.hpp:234
constexpr T one()
Returns the multiplicative identity for T.
Definition: math.hpp:319