Distributed Ranges
Loading...
Searching...
No Matches
dense_matrix_iterator.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <iterator>
8
9#include <dr/detail/index.hpp>
10#include <dr/detail/iterator_adaptor.hpp>
11#include <dr/detail/matrix_entry.hpp>
12#include <dr/sp/views/dense_column_view.hpp>
13#include <dr/sp/views/dense_row_view.hpp>
14
15namespace dr::sp {
16
17template <typename T, typename Iter> class dense_matrix_accessor {
18public:
19 using size_type = std::size_t;
20 using difference_type = std::ptrdiff_t;
21
22 using scalar_type = std::iter_value_t<Iter>;
23 using scalar_reference = std::iter_reference_t<Iter>;
24
26
28
29 using iterator_category = std::random_access_iterator_tag;
30
34
35 using key_type = dr::index<>;
36
37 constexpr dense_matrix_accessor() noexcept = default;
38 constexpr ~dense_matrix_accessor() noexcept = default;
39 constexpr dense_matrix_accessor(const dense_matrix_accessor &) noexcept =
40 default;
41 constexpr dense_matrix_accessor &
42 operator=(const dense_matrix_accessor &) noexcept = default;
43
44 constexpr dense_matrix_accessor(Iter data, key_type idx,
45 key_type matrix_shape, size_type ld) noexcept
46 : data_(data), idx_(idx), matrix_shape_(matrix_shape), ld_(ld),
47 idx_offset_({0, 0}) {}
48
49 constexpr dense_matrix_accessor(Iter data, key_type idx, key_type idx_offset,
50 key_type matrix_shape, size_type ld) noexcept
51 : data_(data), idx_(idx), matrix_shape_(matrix_shape), ld_(ld),
52 idx_offset_(idx_offset) {}
53
54 constexpr dense_matrix_accessor &operator+=(difference_type offset) noexcept {
55 size_type new_idx = get_global_idx() + offset;
56 idx_ = {new_idx / matrix_shape_[1], new_idx % matrix_shape_[1]};
57
58 return *this;
59 }
60
61 constexpr bool operator==(const iterator_accessor &other) const noexcept {
62 return idx_ == other.idx_;
63 }
64
65 constexpr difference_type
66 operator-(const iterator_accessor &other) const noexcept {
67 return difference_type(get_global_idx()) - other.get_global_idx();
68 }
69
70 constexpr bool operator<(const iterator_accessor &other) const noexcept {
71 if (idx_[0] < other.idx_[0]) {
72 return true;
73 } else if (idx_[0] == other.idx_[0]) {
74 return idx_[1] < other.idx_[1];
75 } else {
76 return false;
77 }
78 }
79
80 constexpr reference operator*() const noexcept {
81 return reference(
82 key_type(idx_[0] + idx_offset_[0], idx_[1] + idx_offset_[1]),
83 data_[idx_[0] * ld_ + idx_[1]]);
84 }
85
86 Iter data() const noexcept { return data_; }
87
88private:
89 size_type get_global_idx() const noexcept {
90 return idx_[0] * matrix_shape_[1] + idx_[1];
91 }
92
93private:
94 Iter data_;
95 key_type idx_;
96 key_type matrix_shape_;
97 size_type ld_;
98
99 key_type idx_offset_;
100};
101
102template <typename T, typename Iter>
105
106template <typename T, typename Iter>
108
109} // namespace dr::sp
Definition: index.hpp:34
Definition: iterator_adaptor.hpp:23
Definition: matrix_entry.hpp:20
Definition: matrix_entry.hpp:115
Definition: dense_matrix_iterator.hpp:17