Ginkgo  Generated from pipelines/1556235455 branch based on develop. Ginkgo version 1.9.0
A numerical linear algebra library targeting many-core architectures
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 #include <ginkgo/core/base/range.hpp>
12 #include <ginkgo/core/base/types.hpp>
13 
14 
15 namespace gko {
21 namespace accessor {
22 
23 
39 template <typename ValueType, size_type Dimensionality>
40 class row_major {
41 public:
42  friend class range<row_major>;
43 
44  static_assert(Dimensionality == 2,
45  "This accessor is only implemented for matrices");
46 
50  using value_type = ValueType;
51 
56 
60  static constexpr size_type dimensionality = 2;
61 
62 protected:
73  constexpr GKO_ATTRIBUTES explicit row_major(data_type data,
74  size_type num_rows,
75  size_type num_cols,
77  : data{data}, lengths{num_rows, num_cols}, stride{stride}
78  {}
79 
80 public:
89  constexpr GKO_ATTRIBUTES value_type& operator()(size_type row,
90  size_type col) const
91  {
92  return GKO_ASSERT(row < lengths[0]), GKO_ASSERT(col < lengths[1]),
93  data[row * stride + col];
94  }
95 
104  constexpr GKO_ATTRIBUTES range<row_major> operator()(const span& rows,
105  const span& cols) const
106  {
107  return GKO_ASSERT(rows.is_valid()), GKO_ASSERT(cols.is_valid()),
108  GKO_ASSERT(rows <= span{lengths[0]}),
109  GKO_ASSERT(cols <= span{lengths[1]}),
110  range<row_major>(data + rows.begin * stride + cols.begin,
111  rows.end - rows.begin, cols.end - cols.begin,
112  stride);
113  }
114 
122  constexpr GKO_ATTRIBUTES size_type length(size_type dimension) const
123  {
124  return dimension < 2 ? lengths[dimension] : 1;
125  }
126 
139  template <typename OtherAccessor>
140  GKO_ATTRIBUTES void copy_from(const OtherAccessor& other) const
141  {
142  for (size_type i = 0; i < lengths[0]; ++i) {
143  for (size_type j = 0; j < lengths[1]; ++j) {
144  (*this)(i, j) = other(i, j);
145  }
146  }
147  }
148 
153 
157  const std::array<const size_type, dimensionality> lengths;
158 
163 };
164 
165 
166 } // namespace accessor
167 } // namespace gko
168 
169 
170 #endif // GKO_PUBLIC_CORE_BASE_RANGE_ACCESSORS_HPP_
gko::accessor::row_major::operator()
constexpr value_type & operator()(size_type row, size_type col) const
Returns the data element at position (row, col)
Definition: range_accessors.hpp:89
gko::span::end
const size_type end
End of the span.
Definition: range.hpp:90
gko::size_type
std::size_t size_type
Integral type used for allocation quantities.
Definition: types.hpp:86
gko::accessor::row_major::operator()
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:104
gko::accessor::row_major
A row_major accessor is a bridge between a range and the row-major memory layout.
Definition: range_accessors.hpp:40
gko::span::is_valid
constexpr bool is_valid() const
Checks if a span is valid.
Definition: range.hpp:73
gko::span::begin
const size_type begin
Beginning of the span.
Definition: range.hpp:85
gko::accessor::row_major::data
const data_type data
Reference to the underlying data.
Definition: range_accessors.hpp:152
gko::accessor::row_major::lengths
const std::array< const size_type, dimensionality > lengths
An array of dimension sizes.
Definition: range_accessors.hpp:157
gko::range
A range is a multidimensional view of the memory.
Definition: range.hpp:297
gko
The Ginkgo namespace.
Definition: abstract_factory.hpp:20
gko::span
A span is a lightweight structure used to create sub-ranges from other ranges.
Definition: range.hpp:46
gko::accessor::row_major::stride
const size_type stride
Distance between consecutive rows.
Definition: range_accessors.hpp:162
gko::accessor::row_major::value_type
ValueType value_type
Type of values returned by the accessor.
Definition: range_accessors.hpp:50
gko::accessor::row_major::copy_from
void copy_from(const OtherAccessor &other) const
Copies data from another accessor.
Definition: range_accessors.hpp:140
gko::accessor::row_major::dimensionality
static constexpr size_type dimensionality
Number of dimensions of the accessor.
Definition: range_accessors.hpp:60
gko::accessor::row_major::length
constexpr size_type length(size_type dimension) const
Returns the length in dimension dimension.
Definition: range_accessors.hpp:122
gko::accessor::row_major::data_type
value_type * data_type
Type of underlying data storage.
Definition: range_accessors.hpp:55