Distributed Ranges
Loading...
Searching...
No Matches
dense_column_view.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <dr/detail/index.hpp>
8#include <dr/detail/matrix_entry.hpp>
9#include <iterator>
10
11namespace dr::sp {
12template <typename T, typename Iter> class dense_matrix_column_accessor {
13public:
14 using size_type = std::size_t;
15 using difference_type = std::ptrdiff_t;
16
17 using scalar_value_type = std::iter_value_t<Iter>;
18 using scalar_reference = std::iter_reference_t<Iter>;
19
21
23
24 using iterator_category = std::random_access_iterator_tag;
25
29
30 using key_type = dr::index<>;
31
32 constexpr dense_matrix_column_accessor() noexcept = default;
33 constexpr ~dense_matrix_column_accessor() noexcept = default;
35 const dense_matrix_column_accessor &) noexcept = default;
37 operator=(const dense_matrix_column_accessor &) noexcept = default;
38
39 constexpr dense_matrix_column_accessor(Iter data, std::size_t i,
40 std::size_t j, std::size_t ld) noexcept
41 : data_(data), i_(i), j_(j), ld_(ld) {}
42
44 operator+=(difference_type offset) noexcept {
45 i_ += offset;
46 return *this;
47 }
48
49 constexpr bool operator==(const iterator_accessor &other) const noexcept {
50 return i_ == other.i_;
51 }
52
53 constexpr difference_type
54 operator-(const iterator_accessor &other) const noexcept {
55 return difference_type(i_) - difference_type(other.i_);
56 }
57
58 constexpr bool operator<(const iterator_accessor &other) const noexcept {
59 return i_ < other.i_;
60 }
61
62 constexpr reference operator*() const noexcept {
63 return reference(key_type({i_, j_}), data_[i_ * ld_]);
64 }
65
66private:
67 size_type i_, j_;
68 size_type ld_;
69
70 Iter data_;
71};
72
73template <typename T, typename Iter>
76
77template <typename T, typename Iter> class dense_matrix_column_view {
78public:
79 using size_type = std::size_t;
80 using difference_type = std::ptrdiff_t;
81
82 using scalar_reference = std::iter_reference_t<Iter>;
83
84 using key_type = dr::index<>;
85 using map_type = T;
86
88
89 dense_matrix_column_view(Iter data, size_type column_idx, size_type size,
90 size_type ld)
91 : data_(data), column_idx_(column_idx), size_(size), ld_(ld) {}
92
93 scalar_reference operator[](size_type idx) { return data_[idx * ld_]; }
94
95 iterator begin() const { return iterator(data_, 0, column_idx_, ld_); }
96
97 iterator end() const { return iterator(data_, size_, column_idx_, ld_); }
98
99 size_type size() const noexcept { return size_; }
100
101 Iter data_;
102 size_type column_idx_;
103 size_type size_;
104 size_type ld_;
105};
106
107template <std::random_access_iterator Iter>
108dense_matrix_column_view(Iter, std::size_t, std::size_t, std::size_t)
110
111} // namespace dr::sp
Definition: index.hpp:34
Definition: iterator_adaptor.hpp:23
Definition: matrix_entry.hpp:20
Definition: matrix_entry.hpp:115
Definition: dense_column_view.hpp:12
Definition: dense_column_view.hpp:77