iterative-solver 0.0
Span.h
1#ifndef LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_SPAN_H
2#define LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_SPAN_H
3#include <stddef.h>
4#include <type_traits>
5#include <utility>
6
7namespace molpro::linalg::array {
8
9#if __cplusplus >= 202002L
10#include <span>
11
13using Span = std::span;
14
15#endif
16
17#if __cplusplus < 202002L
18inline
19#endif
20 namespace span {
21
27template <typename T = double>
28class Span {
29public:
30 using element_type = T;
31 using value_type = std::remove_cv_t<T>;
32 using reference = T&;
33 using const_reference = T&;
34 using size_type = size_t;
35 using difference_type = std::ptrdiff_t;
36 using iterator = T*;
37 using const_iterator = T const*;
38
39 Span() = default;
40 ~Span() = default;
42 Span(const Span& source) = default;
43 Span(Span<T>&& source) noexcept : m_buffer{source.m_buffer}, m_size{source.m_size} {
44 Span<T> t{};
45 swap(source, t);
46 }
47 Span& operator=(const Span& source) = default;
48 Span& operator=(Span&& source) noexcept {
49 Span<T> t{std::move(source)};
50 swap(*this, t);
51 return *this;
52 }
53 reference operator[](size_type i) { return *(m_buffer + i); }
54 const_reference operator[](size_type i) const { return *(m_buffer + i); }
55
57 friend void swap(Span<T>& x, Span<T>& y) {
58 using std::swap;
60 swap(x.m_size, y.m_size);
61 }
62
63 iterator data() { return m_buffer; }
64 const_iterator data() const { return m_buffer; }
65
66 iterator begin() { return m_buffer; }
67 const_iterator begin() const { return m_buffer; }
68 const_iterator cbegin() const { return m_buffer; }
69
70 iterator end() { return m_buffer + m_size; }
71 const_iterator end() const { return m_buffer + m_size; }
72 const_iterator cend() const { return m_buffer + m_size; }
73
74 size_type size() const { return m_size; }
75
76 bool empty() const { return m_size == 0; }
77
78protected:
79 iterator m_buffer = nullptr;
81};
82
83template <typename T>
84auto begin(Span<T>& x) {
85 return x.begin();
86}
87
88template <typename T>
89auto begin(const Span<T>& x) {
90 return x.begin();
91}
92
93template <typename T>
94auto end(Span<T>& x) {
95 return x.end();
96}
97
98template <typename T>
99auto end(const Span<T>& x) {
100 return x.end();
101}
102} // namespace span
103} // namespace molpro::linalg::array
104
105#endif // LINEARALGEBRA_SRC_MOLPRO_LINALG_ARRAY_SPAN_H
Non-owning container taking a pointer to the data buffer and its size and exposing routines for itera...
Definition: Span.h:28
std::remove_cv_t< T > value_type
Definition: Span.h:31
iterator m_buffer
Definition: Span.h:79
Span(T *data, size_type size)
Definition: Span.h:41
T const * const_iterator
Definition: Span.h:37
Span(Span< T > &&source) noexcept
Definition: Span.h:43
T & reference
Definition: Span.h:32
const_iterator cbegin() const
Definition: Span.h:68
const_reference operator[](size_type i) const
Definition: Span.h:54
reference operator[](size_type i)
Definition: Span.h:53
friend void swap(Span< T > &x, Span< T > &y)
Swap content of two Spans.
Definition: Span.h:57
size_type m_size
Definition: Span.h:80
const_iterator end() const
Definition: Span.h:71
const_iterator cend() const
Definition: Span.h:72
T element_type
Definition: Span.h:30
T & const_reference
Definition: Span.h:33
Span & operator=(Span &&source) noexcept
Definition: Span.h:48
size_t size_type
Definition: Span.h:34
const_iterator begin() const
Definition: Span.h:67
const_iterator data() const
Definition: Span.h:64
bool empty() const
Definition: Span.h:76
iterator begin()
Definition: Span.h:66
size_type size() const
Definition: Span.h:74
iterator end()
Definition: Span.h:70
Span(const Span &source)=default
Span & operator=(const Span &source)=default
iterator data()
Definition: Span.h:63
T * iterator
Definition: Span.h:36
std::ptrdiff_t difference_type
Definition: Span.h:35
auto begin(Span< T > &x)
Definition: Span.h:84
auto end(Span< T > &x)
Definition: Span.h:94
Definition: ArrayHandler.h:22