135 using value_type = T;
145 vector_span() noexcept : _begin(
nullptr), _end(
nullptr), _max(
nullptr) {}
147 vector_span(value_type *buffer, ssize_t nr_elements) noexcept : _begin(buffer), _end(buffer), _max(buffer + nr_elements)
152 vector_span(std::span<value_type> span) noexcept : _begin(span.data()), _end(span.data()), _max(span.data() + span.size()) {}
160 [[nodiscard]]
iterator begin()
noexcept
173 [[nodiscard]]
iterator end()
noexcept
191 [[nodiscard]] value_type &operator[](
std::size_t i)
noexcept
194 return *std::launder(_begin + i);
196 [[nodiscard]] value_type
const &operator[](
std::size_t i)
const noexcept
199 return *std::launder(_begin + i);
202 value_type &front()
noexcept
205 return *std::launder(_begin);
207 value_type
const &front()
const noexcept
210 return *std::launder(_begin);
212 value_type &back()
noexcept
215 return *std::launder(_end - 1);
217 value_type
const &back()
const noexcept
220 return *std::launder(_end - 1);
223 [[nodiscard]]
bool empty()
const noexcept
225 return _begin == _end;
228 [[nodiscard]]
bool full()
const noexcept
233 void clear()
noexcept
235 for (
auto i = _begin; i != _end; ++i) {
236 std::destroy_at(std::launder(i));
241 void push_back(value_type
const &rhs)
noexcept
245 [[maybe_unused]] value_type *ptr =
new (_end) value_type(rhs);
249 void push_back(value_type &&rhs)
noexcept
253 [[maybe_unused]] value_type *ptr =
new (_end) value_type(
std::move(rhs));
257 template<
typename... Args>
258 void emplace_back(Args &&...args)
noexcept
261 std::construct_at(_end++, std::forward<Args>(args)...);
264 void pop_back()
noexcept
268 std::destroy_at(std::launder(_end));
#define hi_assert_bounds(x,...)
Assert if a value is within bounds.
Definition assert.hpp:225
#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