16class vector_span_iterator {
19 using difference_type = ssize_t;
25 vector_span_iterator() noexcept : ptr(
nullptr) {}
26 vector_span_iterator(vector_span_iterator
const &other)
noexcept =
default;
27 vector_span_iterator(vector_span_iterator &&other)
noexcept =
default;
28 vector_span_iterator &operator=(vector_span_iterator
const &other)
noexcept =
default;
29 vector_span_iterator &operator=(vector_span_iterator &&other)
noexcept =
default;
30 ~vector_span_iterator() =
default;
32 vector_span_iterator(value_type *ptr) noexcept : ptr(ptr)
37 vector_span_iterator &operator=(value_type *ptr)
noexcept
44 [[nodiscard]] value_type &operator*()
noexcept
46 return *std::launder(ptr);
48 [[nodiscard]] value_type
const &operator*()
const noexcept
50 return *std::launder(ptr);
52 [[nodiscard]] value_type *operator->()
noexcept
54 return std::launder(ptr);
56 [[nodiscard]] value_type
const *operator->()
const noexcept
58 return std::launder(ptr);
60 [[nodiscard]] value_type &operator[](
std::size_t i)
noexcept
62 return *std::launder(ptr + i);
64 [[nodiscard]] value_type
const &operator[](
std::size_t i)
const noexcept
66 return *std::launder(ptr + i);
69 vector_span_iterator &operator++()
noexcept
74 vector_span_iterator operator++(
int)
noexcept
80 vector_span_iterator &operator--()
noexcept
85 vector_span_iterator operator--(
int)
noexcept
92 vector_span_iterator &operator+=(ssize_t rhs)
noexcept
97 vector_span_iterator &operator-=(ssize_t rhs)
noexcept
103 [[nodiscard]]
friend bool operator==(vector_span_iterator
const &lhs, vector_span_iterator
const &rhs)
noexcept
105 return lhs.ptr == rhs.ptr;
108 [[nodiscard]]
friend auto operator<=>(vector_span_iterator
const &lhs, vector_span_iterator
const &rhs)
noexcept
110 return lhs.ptr <=> rhs.ptr;
113 [[nodiscard]]
friend vector_span_iterator operator+(vector_span_iterator
const &lhs, ssize_t rhs)
noexcept
115 return vector_span_iterator{lhs.ptr + rhs};
117 [[nodiscard]]
friend vector_span_iterator operator-(vector_span_iterator
const &lhs, ssize_t rhs)
noexcept
119 return vector_span_iterator{lhs.ptr - rhs};
121 [[nodiscard]]
friend vector_span_iterator operator+(ssize_t lhs, vector_span_iterator
const &rhs)
noexcept
123 return vector_span_iterator{lhs + rhs.ptr};
126 [[nodiscard]]
friend difference_type operator-(vector_span_iterator
const &lhs, vector_span_iterator
const &rhs)
noexcept
128 return lhs.ptr - rhs.ptr;
135 using value_type = T;
145 constexpr vector_span() noexcept : _begin(
nullptr), _end(
nullptr), _max(
nullptr) {}
147 constexpr vector_span(value_type *buffer, ssize_t nr_elements) noexcept :
148 _begin(buffer), _end(buffer), _max(buffer + nr_elements)
153 constexpr vector_span(std::span<value_type> span) noexcept :
154 _begin(span.data()), _end(span.data()), _max(span.data() + span.size())
158 constexpr vector_span(vector_span
const& other) =
default;
159 constexpr vector_span(vector_span&& other) =
default;
160 constexpr vector_span& operator=(vector_span
const& other) =
default;
161 constexpr vector_span& operator=(vector_span&& other) =
default;
162 ~vector_span() =
default;
164 [[nodiscard]]
constexpr iterator begin()
noexcept
169 [[nodiscard]]
constexpr const_iterator begin()
const noexcept
174 [[nodiscard]]
constexpr const_iterator cbegin()
const noexcept
179 [[nodiscard]]
constexpr iterator end()
noexcept
184 [[nodiscard]]
constexpr const_iterator end()
const noexcept
189 [[nodiscard]]
constexpr const_iterator cend()
const noexcept
194 [[nodiscard]]
constexpr std::size_t size()
const noexcept
199 [[nodiscard]]
constexpr value_type& operator[](
std::size_t i)
noexcept
204 [[nodiscard]]
constexpr value_type
const& operator[](
std::size_t i)
const noexcept
210 constexpr value_type& front()
noexcept
216 constexpr value_type
const& front()
const noexcept
222 constexpr value_type& back()
noexcept
228 constexpr value_type
const& back()
const noexcept
234 [[nodiscard]]
constexpr bool empty()
const noexcept
236 return _begin == _end;
239 [[nodiscard]]
constexpr bool full()
const noexcept
244 constexpr void clear()
noexcept
246 for (
auto ptr = _begin; ptr != _end; ++ptr) {
247 std::destroy_at(ptr);
252 constexpr void push_back(value_type
const& rhs)
noexcept
255 std::construct_at(_end++, rhs);
258 constexpr void push_back(value_type&& rhs)
noexcept
261 std::construct_at(_end++,
std::move(rhs));
264 template<
typename... Args>
265 constexpr void emplace_back(Args&&...args)
noexcept
271 constexpr void pop_back()
noexcept
274 std::destroy_at(--_end);
#define hi_axiom_bounds(x,...)
Specify an axiom that the value is within bounds.
Definition assert.hpp:264
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:253
#define hi_assert_not_null(x,...)
Assert if an expression is not nullptr.
Definition assert.hpp:238