136 using value_type = T;
146 vector_span() noexcept : _begin(
nullptr), _end(
nullptr), _max(
nullptr) {}
148 vector_span(value_type *buffer, ssize_t nr_elements) noexcept : _begin(buffer), _end(buffer), _max(buffer + nr_elements)
153 vector_span(std::span<value_type> span) noexcept : _begin(span.data()), _end(span.data()), _max(span.data() + span.size()) {}
161 [[nodiscard]]
iterator begin()
noexcept
174 [[nodiscard]]
iterator end()
noexcept
192 [[nodiscard]] value_type &operator[](
std::size_t i)
noexcept
194 hi_assert_bounds(i, *
this);
195 return *std::launder(_begin + i);
197 [[nodiscard]] value_type
const &operator[](
std::size_t i)
const noexcept
199 hi_assert_bounds(i, *
this);
200 return *std::launder(_begin + i);
203 value_type &front()
noexcept
206 return *std::launder(_begin);
208 value_type
const &front()
const noexcept
211 return *std::launder(_begin);
213 value_type &back()
noexcept
216 return *std::launder(_end - 1);
218 value_type
const &back()
const noexcept
221 return *std::launder(_end - 1);
224 [[nodiscard]]
bool empty()
const noexcept
226 return _begin == _end;
229 [[nodiscard]]
bool full()
const noexcept
234 void clear()
noexcept
236 for (
auto i = _begin; i != _end; ++i) {
237 std::destroy_at(std::launder(i));
242 void push_back(value_type
const &rhs)
noexcept
246 [[maybe_unused]] value_type *ptr =
new (_end) value_type(rhs);
250 void push_back(value_type &&rhs)
noexcept
254 [[maybe_unused]] value_type *ptr =
new (_end) value_type(
std::move(rhs));
258 template<
typename... Args>
259 void emplace_back(Args &&...args)
noexcept
263 [[maybe_unused]] value_type *ptr =
new (_end) value_type(std::forward<Args>(args)...);
267 void pop_back()
noexcept
271 std::destroy_at(std::launder(_end));
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:133
#define hi_assert_not_null(x,...)
Assert if an expression is not nullptr.
Definition assert.hpp:118