Ginkgo Generated from branch based on master. Ginkgo version 1.8.0
A numerical linear algebra library targeting many-core architectures
Loading...
Searching...
No Matches
range_accessors.hpp
1// SPDX-FileCopyrightText: 2017 - 2024 The Ginkgo authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#ifndef GKO_PUBLIC_CORE_BASE_RANGE_ACCESSORS_HPP_
6#define GKO_PUBLIC_CORE_BASE_RANGE_ACCESSORS_HPP_
7
8
9#include <array>
10
11
12#include <ginkgo/core/base/range.hpp>
13#include <ginkgo/core/base/types.hpp>
14
15
16namespace gko {
22namespace accessor {
23
24
40template <typename ValueType, size_type Dimensionality>
41class row_major {
42public:
43 friend class range<row_major>;
44
45 static_assert(Dimensionality == 2,
46 "This accessor is only implemented for matrices");
47
51 using value_type = ValueType;
52
57
61 static constexpr size_type dimensionality = 2;
62
63protected:
74 constexpr GKO_ATTRIBUTES explicit row_major(data_type data,
75 size_type num_rows,
76 size_type num_cols,
78 : data{data}, lengths{num_rows, num_cols}, stride{stride}
79 {}
80
81public:
90 constexpr GKO_ATTRIBUTES value_type& operator()(size_type row,
91 size_type col) const
92 {
93 return GKO_ASSERT(row < lengths[0]), GKO_ASSERT(col < lengths[1]),
94 data[row * stride + col];
95 }
96
105 constexpr GKO_ATTRIBUTES range<row_major> operator()(const span& rows,
106 const span& cols) const
107 {
108 return GKO_ASSERT(rows.is_valid()), GKO_ASSERT(cols.is_valid()),
109 GKO_ASSERT(rows <= span{lengths[0]}),
110 GKO_ASSERT(cols <= span{lengths[1]}),
111 range<row_major>(data + rows.begin * stride + cols.begin,
112 rows.end - rows.begin, cols.end - cols.begin,
113 stride);
114 }
115
123 constexpr GKO_ATTRIBUTES size_type length(size_type dimension) const
124 {
125 return dimension < 2 ? lengths[dimension] : 1;
126 }
127
140 template <typename OtherAccessor>
141 GKO_ATTRIBUTES void copy_from(const OtherAccessor& other) const
142 {
143 for (size_type i = 0; i < lengths[0]; ++i) {
144 for (size_type j = 0; j < lengths[1]; ++j) {
145 (*this)(i, j) = other(i, j);
146 }
147 }
148 }
149
154
158 const std::array<const size_type, dimensionality> lengths;
159
164};
165
166
167} // namespace accessor
168} // namespace gko
169
170
171#endif // GKO_PUBLIC_CORE_BASE_RANGE_ACCESSORS_HPP_
A row_major accessor is a bridge between a range and the row-major memory layout.
Definition range_accessors.hpp:41
constexpr range< row_major > operator()(const span &rows, const span &cols) const
Returns the sub-range spanning the range (rows, cols)
Definition range_accessors.hpp:105
constexpr size_type length(size_type dimension) const
Returns the length in dimension dimension.
Definition range_accessors.hpp:123
const std::array< const size_type, dimensionality > lengths
An array of dimension sizes.
Definition range_accessors.hpp:158
const size_type stride
Distance between consecutive rows.
Definition range_accessors.hpp:163
ValueType value_type
Type of values returned by the accessor.
Definition range_accessors.hpp:51
void copy_from(const OtherAccessor &other) const
Copies data from another accessor.
Definition range_accessors.hpp:141
const data_type data
Reference to the underlying data.
Definition range_accessors.hpp:153
static constexpr size_type dimensionality
Number of dimensions of the accessor.
Definition range_accessors.hpp:61
constexpr value_type & operator()(size_type row, size_type col) const
Returns the data element at position (row, col)
Definition range_accessors.hpp:90
value_type * data_type
Type of underlying data storage.
Definition range_accessors.hpp:56
A range is a multidimensional view of the memory.
Definition range.hpp:298
The Ginkgo namespace.
Definition abstract_factory.hpp:20
std::size_t size_type
Integral type used for allocation quantities.
Definition types.hpp:86
A span is a lightweight structure used to create sub-ranges from other ranges.
Definition range.hpp:47
constexpr bool is_valid() const
Checks if a span is valid.
Definition range.hpp:74
const size_type begin
Beginning of the span.
Definition range.hpp:86
const size_type end
End of the span.
Definition range.hpp:91