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