ATLAS Offline Software
Loading...
Searching...
No Matches
span.h
Go to the documentation of this file.
1// This file's extension implies that it's C, but it's really -*- C++ -*-.
2/*
3 * Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration.
4 */
11
12
13#ifndef CXXUTILS_SPAN_H
14#define CXXUTILS_SPAN_H
15
16
17#include "CxxUtils/concepts.h"
18#include <cstdlib>
19#include <type_traits>
20#include <iterator>
21#include <cassert>
22#include <ranges>
23
24
25namespace CxxUtils {
26
27
29inline constexpr size_t dynamic_extent = static_cast<size_t>(-1);
30
31
35template <class T, class U>
36inline constexpr bool valid_span_type_v = std::is_convertible_v<U(*)[], T(*)[]>;
37
38
58template <class T>
59class span
60 : public std::ranges::view_base
61{
62public:
64 using element_type = T;
65 using value_type = std::remove_cv_t<T>;
66 using size_type = std::size_t;
67 using difference_type = std::ptrdiff_t;
68 using pointer = T*;
69 using const_pointer = const T*;
74 using reverse_iterator = std::reverse_iterator<iterator>;
75 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
76
77
78 /*
79 * @brief Default constructor.
80 * Makes an empty span.
81 */
83
84
90 template <class U>
92 span (U* ptr, size_type sz);
93
94
100 template <class U>
101 requires (valid_span_type_v<T, U>)
102 span (U* beg, U* end);
103
104
105 // Default copy / assignment.
106 span (const span&) = default;
107 span& operator= (const span&) = default;
108
109
114 template <class U>
115 requires (valid_span_type_v<T, U>)
116 span (const span<U>& other);
117
118
122 constexpr size_type size() const noexcept;
123
124
128 constexpr size_type size_bytes() const noexcept;
129
130
134 [[nodiscard]] constexpr bool empty() const noexcept;
135
136
140 constexpr reference front() noexcept;
141
142
146 constexpr const_reference front() const noexcept;
147
148
152 constexpr reference back() noexcept;
153
154
158 constexpr const_reference back() const noexcept;
159
160
165 constexpr reference operator[] (size_type i) noexcept;
166
167
172 constexpr const_reference operator[] (size_type i) const noexcept;
173
174
179 constexpr reference at (size_type i);
180
181
187
188
192 constexpr pointer data() noexcept;
193
194
198 constexpr const_pointer data() const noexcept;
199
200
204 constexpr iterator begin() noexcept;
205
206
210 constexpr const_iterator begin() const noexcept;
211
212
216 constexpr iterator end() noexcept;
217
218
222 constexpr const_iterator end() const noexcept;
223
224
228 constexpr reverse_iterator rbegin() noexcept;
229
230
234 constexpr const_reverse_iterator rbegin() const noexcept;
235
236
240 constexpr reverse_iterator rend() noexcept;
241
242
246 constexpr const_reverse_iterator rend() const noexcept;
247
248
253 constexpr span first (size_type n) noexcept;
254
255
260 constexpr span<const T> first (size_type n) const noexcept;
261
262
267 constexpr span last (size_type n) noexcept;
268
269
274 constexpr span<const T> last (size_type n) const noexcept;
275
276
283 constexpr span
285
286
293 constexpr span<const T>
295
296
297private:
300
302 size_t m_size;
303};
304
305
307template <class T>
308span (T* ptr, std::size_t sz) -> span<T>;
309template <class T>
310span (T* beg, T* end) -> span<T>;
311
312
318template <detail::IsContiguousContainer CONTAINER>
319auto make_span (CONTAINER& c)
320{
321 return CxxUtils::span (c.data(), c.size());
322}
323
324
325// Stand-alone begin/end functions, findable by ADL.
326// Needed to work around issues seen when root 6.30.04 is used with gcc14.
327template <class T>
328auto begin (span<T>& s) { return s.begin(); }
329template <class T>
330auto begin (const span<T>& s) { return s.begin(); }
331template <class T>
332auto end (span<T>& s) { return s.end(); }
333template <class T>
334auto end (const span<T>& s) { return s.end(); }
335
336
337} // namespace CxxUtils
338
339
340#include "CxxUtils/span.icc"
341
342
343#endif // not CXXUTILS_SPAN_H
static Double_t sz
Simplified version of the C++20 std::span.
Definition span.h:61
span(const span &)=default
const container_value_type * const_pointer
Definition span.h:69
std::reverse_iterator< iterator > reverse_iterator
Definition span.h:74
container_value_type * pointer
Definition span.h:68
constexpr reverse_iterator rend() noexcept
constexpr size_type size() const noexcept
Return the size of the span.
constexpr reference back() noexcept
constexpr reverse_iterator rbegin() noexcept
container_value_type * m_ptr
Definition span.h:299
const element_type & const_reference
Definition span.h:71
constexpr size_type size_bytes() const noexcept
constexpr reference at(size_type i)
constexpr span first(size_type n) noexcept
container_value_type element_type
Definition span.h:64
constexpr iterator begin() noexcept
constexpr pointer data() noexcept
span & operator=(const span &)=default
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition span.h:75
constexpr span last(size_type n) noexcept
constexpr iterator end() noexcept
constexpr span subspan(size_type offs, size_type n=dynamic_extent) noexcept
constexpr reference front() noexcept
std::remove_cv_t< container_value_type > value_type
Definition span.h:65
constexpr bool empty() const noexcept
A couple standard-library related concepts.
auto end(range_with_at< T > &s)
span(T *ptr, std::size_t sz) -> span< T >
A couple needed deduction guides.
auto make_span(CONTAINER &c)
Helper to make a span from a container.
Definition span.h:319
constexpr size_t dynamic_extent
Used to specify a subrange of indefinite size in subspan().
Definition span.h:29
constexpr bool valid_span_type_v
Is U* a valid type to use to initialize a span<T>?
Definition span.h:36
STL namespace.
#define private