19class vector_span_iterator {
22 using difference_type = ssize_t;
28 vector_span_iterator() noexcept : ptr(
nullptr) {}
29 vector_span_iterator(vector_span_iterator
const &other)
noexcept =
default;
30 vector_span_iterator(vector_span_iterator &&other)
noexcept =
default;
31 vector_span_iterator &operator=(vector_span_iterator
const &other)
noexcept =
default;
32 vector_span_iterator &operator=(vector_span_iterator &&other)
noexcept =
default;
33 ~vector_span_iterator() =
default;
35 vector_span_iterator(value_type *ptr) noexcept : ptr(ptr)
37 hi_assert_not_null(ptr);
40 vector_span_iterator &operator=(value_type *ptr)
noexcept
42 hi_assert_not_null(ptr);
47 [[nodiscard]] value_type &operator*()
noexcept
49 return *std::launder(ptr);
51 [[nodiscard]] value_type
const &operator*()
const noexcept
53 return *std::launder(ptr);
55 [[nodiscard]] value_type *operator->()
noexcept
57 return std::launder(ptr);
59 [[nodiscard]] value_type
const *operator->()
const noexcept
61 return std::launder(ptr);
63 [[nodiscard]] value_type &operator[](
std::size_t i)
noexcept
65 return *std::launder(ptr + i);
67 [[nodiscard]] value_type
const &operator[](
std::size_t i)
const noexcept
69 return *std::launder(ptr + i);
72 vector_span_iterator &operator++()
noexcept
77 vector_span_iterator operator++(
int)
noexcept
83 vector_span_iterator &operator--()
noexcept
88 vector_span_iterator operator--(
int)
noexcept
95 vector_span_iterator &operator+=(ssize_t rhs)
noexcept
100 vector_span_iterator &operator-=(ssize_t rhs)
noexcept
106 [[nodiscard]]
friend bool operator==(vector_span_iterator
const &lhs, vector_span_iterator
const &rhs)
noexcept
108 return lhs.ptr == rhs.ptr;
111 [[nodiscard]]
friend auto operator<=>(vector_span_iterator
const &lhs, vector_span_iterator
const &rhs)
noexcept
113 return lhs.ptr <=> rhs.ptr;
116 [[nodiscard]]
friend vector_span_iterator operator+(vector_span_iterator
const &lhs, ssize_t rhs)
noexcept
118 return vector_span_iterator{lhs.ptr + rhs};
120 [[nodiscard]]
friend vector_span_iterator operator-(vector_span_iterator
const &lhs, ssize_t rhs)
noexcept
122 return vector_span_iterator{lhs.ptr - rhs};
124 [[nodiscard]]
friend vector_span_iterator operator+(ssize_t lhs, vector_span_iterator
const &rhs)
noexcept
126 return vector_span_iterator{lhs + rhs.ptr};
129 [[nodiscard]]
friend difference_type operator-(vector_span_iterator
const &lhs, vector_span_iterator
const &rhs)
noexcept
131 return lhs.ptr - rhs.ptr;
138 using value_type = T;
148 vector_span() noexcept : _begin(
nullptr), _end(
nullptr), _max(
nullptr) {}
150 vector_span(value_type *buffer, ssize_t nr_elements) noexcept : _begin(buffer), _end(buffer), _max(buffer + nr_elements)
152 hi_axiom(nr_elements >= 0);
155 vector_span(std::span<value_type> span) noexcept : _begin(span.data()), _end(span.data()), _max(span.data() + span.size()) {}
157 vector_span(vector_span
const &other) =
default;
158 vector_span(vector_span &&other) =
default;
159 vector_span &operator=(vector_span
const &other) =
default;
160 vector_span &operator=(vector_span &&other) =
default;
161 ~vector_span() =
default;
163 [[nodiscard]] iterator begin()
noexcept
167 [[nodiscard]] const_iterator begin()
const noexcept
171 [[nodiscard]] const_iterator cbegin()
const noexcept
176 [[nodiscard]] iterator end()
noexcept
180 [[nodiscard]] const_iterator end()
const noexcept
184 [[nodiscard]] const_iterator cend()
const noexcept
194 [[nodiscard]] value_type &operator[](
std::size_t i)
noexcept
196 hi_assert_bounds(i, *
this);
197 return *std::launder(_begin + i);
199 [[nodiscard]] value_type
const &operator[](
std::size_t i)
const noexcept
201 hi_assert_bounds(i, *
this);
202 return *std::launder(_begin + i);
205 value_type &front()
noexcept
207 hi_axiom(_end != _begin);
208 return *std::launder(_begin);
210 value_type
const &front()
const noexcept
212 hi_axiom(_end != _begin);
213 return *std::launder(_begin);
215 value_type &back()
noexcept
217 hi_axiom(_end != _begin);
218 return *std::launder(_end - 1);
220 value_type
const &back()
const noexcept
222 hi_axiom(_end != _begin);
223 return *std::launder(_end - 1);
226 [[nodiscard]]
bool empty()
const noexcept
228 return _begin == _end;
231 [[nodiscard]]
bool full()
const noexcept
236 void clear()
noexcept
238 for (
auto i = _begin; i != _end; ++i) {
239 std::destroy_at(std::launder(i));
244 void push_back(value_type
const &rhs)
noexcept
246 hi_axiom(_end != _max);
248 [[maybe_unused]] value_type *ptr =
new (_end) value_type(rhs);
252 void push_back(value_type &&rhs)
noexcept
254 hi_axiom(_end != _max);
256 [[maybe_unused]] value_type *ptr =
new (_end) value_type(
std::move(rhs));
260 template<
typename... Args>
261 void emplace_back(Args &&...args)
noexcept
263 hi_axiom(_end != _max);
267 void pop_back()
noexcept
269 hi_axiom(_end != _begin);
271 std::destroy_at(std::launder(_end));