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>
19 using size_type = std::size_t;
20 using difference_type = std::ptrdiff_t;
22 using scalar_type = std::iter_value_t<Iter>;
23 using scalar_reference = std::iter_reference_t<Iter>;
29 using iterator_category = std::random_access_iterator_tag;
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}) {}
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) {}
55 size_type new_idx = get_global_idx() + offset;
56 idx_ = {new_idx / matrix_shape_[1], new_idx % matrix_shape_[1]};
62 return idx_ == other.idx_;
65 constexpr difference_type
67 return difference_type(get_global_idx()) - other.get_global_idx();
71 if (idx_[0] < other.idx_[0]) {
73 }
else if (idx_[0] == other.idx_[0]) {
74 return idx_[1] < other.idx_[1];
80 constexpr reference operator*()
const noexcept {
82 key_type(idx_[0] + idx_offset_[0], idx_[1] + idx_offset_[1]),
83 data_[idx_[0] * ld_ + idx_[1]]);
86 Iter data()
const noexcept {
return data_; }
89 size_type get_global_idx()
const noexcept {
90 return idx_[0] * matrix_shape_[1] + idx_[1];
102template <
typename T,
typename Iter>
106template <
typename T,
typename Iter>
Definition: iterator_adaptor.hpp:23
Definition: matrix_entry.hpp:20
Definition: matrix_entry.hpp:115
Definition: dense_matrix_iterator.hpp:17