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
7#if defined(USE_STD_SPAN) && __cplusplus >= 202002L
8#include <span>
9#endif
10
11namespace molpro::linalg::array {
12
13#if defined(USE_STD_SPAN) && __cplusplus >= 202002L
15using Span = std::span;
16
17#endif
18
19#if !defined(USE_STD_SPAN) || __cplusplus < 202002L
20inline
21#endif
22 namespace span {
23
29template <typename T = double>
30class Span {
31public:
32 using element_type = T;
33 using value_type = std::remove_cv_t<T>;
34 using reference = T&;
35 using const_reference = T&;
36 using size_type = size_t;
37 using difference_type = std::ptrdiff_t;
38 using iterator = T*;
39 using const_iterator = T const*;
40
41 Span() = default;
42 ~Span() = default;
44 Span(const Span& source) = default;
45 Span(Span<T>&& source) noexcept : m_buffer{source.m_buffer}, m_size{source.m_size} {
46 Span<T> t{};
47 swap(source, t);
48 }
49 Span& operator=(const Span& source) = default;
50 Span& operator=(Span&& source) noexcept {
51 Span<T> t{std::move(source)};
52 swap(*this, t);
53 return *this;
54 }
55 reference operator[](size_type i) { return *(m_buffer + i); }
56 const_reference operator[](size_type i) const { return *(m_buffer + i); }
57
59 friend void swap(Span<T>& x, Span<T>& y) {
60 using std::swap;
62 swap(x.m_size, y.m_size);
63 }
64
65 iterator data() { return m_buffer; }
66 const_iterator data() const { return m_buffer; }
67
68 iterator begin() { return m_buffer; }
69 const_iterator begin() const { return m_buffer; }
70 const_iterator cbegin() const { return m_buffer; }
71
72 iterator end() { return m_buffer + m_size; }
73 const_iterator end() const { return m_buffer + m_size; }
74 const_iterator cend() const { return m_buffer + m_size; }
75
76 size_type size() const { return m_size; }
77
78 bool empty() const { return m_size == 0; }
79
80protected:
81 iterator m_buffer = nullptr;
83};
84
85template <typename T>
86auto begin(Span<T>& x) {
87 return x.begin();
88}
89
90template <typename T>
91auto begin(const Span<T>& x) {
92 return x.begin();
93}
94
95template <typename T>
96auto end(Span<T>& x) {
97 return x.end();
98}
99
100template <typename T>
101auto end(const Span<T>& x) {
102 return x.end();
103}
104} // namespace span
105} // namespace molpro::linalg::array
106
107#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:30
std::remove_cv_t< T > value_type
Definition: Span.h:33
iterator m_buffer
Definition: Span.h:81
Span(T *data, size_type size)
Definition: Span.h:43
T const * const_iterator
Definition: Span.h:39
Span(Span< T > &&source) noexcept
Definition: Span.h:45
T & reference
Definition: Span.h:34
const_iterator cbegin() const
Definition: Span.h:70
const_reference operator[](size_type i) const
Definition: Span.h:56
reference operator[](size_type i)
Definition: Span.h:55
friend void swap(Span< T > &x, Span< T > &y)
Swap content of two Spans.
Definition: Span.h:59
size_type m_size
Definition: Span.h:82
const_iterator end() const
Definition: Span.h:73
const_iterator cend() const
Definition: Span.h:74
T element_type
Definition: Span.h:32
T & const_reference
Definition: Span.h:35
Span & operator=(Span &&source) noexcept
Definition: Span.h:50
size_t size_type
Definition: Span.h:36
const_iterator begin() const
Definition: Span.h:69
const_iterator data() const
Definition: Span.h:66
bool empty() const
Definition: Span.h:78
iterator begin()
Definition: Span.h:68
size_type size() const
Definition: Span.h:76
iterator end()
Definition: Span.h:72
Span(const Span &source)=default
Span & operator=(const Span &source)=default
iterator data()
Definition: Span.h:65
T * iterator
Definition: Span.h:38
std::ptrdiff_t difference_type
Definition: Span.h:37
auto begin(Span< T > &x)
Definition: Span.h:86
auto end(Span< T > &x)
Definition: Span.h:96
Definition: ArrayHandler.h:22