9#include <dr/detail/index.hpp>
10#include <dr/detail/iterator_adaptor.hpp>
11#include <dr/detail/matrix_entry.hpp>
12#include <dr/sp/containers/sequential/dense_matrix.hpp>
13#include <dr/sp/views/dense_column_view.hpp>
14#include <dr/sp/views/dense_matrix_iterator.hpp>
15#include <dr/sp/views/dense_row_view.hpp>
19template <
typename T,
typename Iter = T *>
21 :
public rng::view_interface<dense_matrix_view<T, Iter>> {
23 using size_type = std::size_t;
24 using difference_type = std::ptrdiff_t;
26 using scalar_reference = std::iter_reference_t<Iter>;
35 : data_(data), shape_(shape), idx_offset_(
key_type{0, 0}), ld_(ld),
39 size_type ld, size_type rank)
40 : data_(data), shape_(shape), idx_offset_(idx_offset), ld_(ld),
43 template <
typename Allocator>
44 requires(std::is_same_v<typename std::allocator_traits<Allocator>::pointer,
47 : data_(m.data()), shape_(m.shape()), idx_offset_(
key_type{0, 0}),
48 ld_(m.ld()), rank_(0) {}
50 key_type shape()
const noexcept {
return shape_; }
52 size_type size()
const noexcept {
return shape()[0] * shape()[1]; }
54 scalar_reference operator[](
key_type idx)
const {
55 return data_[idx[0] * ld_ + idx[1]];
66 auto row(size_type row_index)
const {
69 auto row_elements = rng::views::iota(size_type(0), size_type(shape()[1]));
70 Iter data = data_ + row_index * ld_;
72 return row_elements | rng::views::transform([=](
auto column_index) {
78 auto column(size_type column_index)
const {
81 auto column_elements =
82 rng::views::iota(size_type(0), size_type(shape()[0]));
83 Iter data = data_ + column_index;
86 return column_elements | rng::views::transform([=](
auto row_index) {
88 data[row_index * ld]);
92 Iter data()
const {
return data_; }
94 std::size_t rank()
const {
return rank_; }
96 size_type ld()
const {
return ld_; }
99 auto local_data = __detail::local(data_);
101 local_data, shape_, idx_offset_, ld(), rank());
112template <std::random_access_iterator Iter>
116template <std::random_access_iterator Iter>
120template <
typename T,
typename Allocator>
Definition: iterator_adaptor.hpp:23
Definition: matrix_entry.hpp:115
Definition: dense_matrix_view.hpp:21
Definition: dense_matrix.hpp:19