33 tt_assume(ptr !=
nullptr);
37 tt_assume(ptr !=
nullptr);
42 [[nodiscard]] value_type &operator*()
noexcept {
return *std::launder(ptr); }
43 [[nodiscard]] value_type
const &operator*()
const noexcept {
return *std::launder(ptr); }
44 [[nodiscard]] value_type *operator->()
noexcept {
return std::launder(ptr); }
45 [[nodiscard]] value_type
const *operator->()
const noexcept {
return std::launder(ptr); }
46 [[nodiscard]] value_type &operator[](
size_t i)
noexcept {
return *std::launder(ptr + i); }
47 [[nodiscard]] value_type
const &operator[](
size_t i)
const noexcept {
return *std::launder(ptr + i); }
50 vspan_iterator operator++(
int)
noexcept {
auto tmp = *
this; ++ptr;
return tmp; }
52 vspan_iterator operator--(
int)
noexcept {
auto tmp = *
this; --ptr;
return tmp; }
85 _begin(
nullptr), _end(
nullptr), _max(
nullptr) {}
87 vspan(value_type *buffer,
ssize_t nr_elements) noexcept :
88 _begin(buffer), _end(buffer), _max(buffer + nr_elements)
90 tt_assume(nr_elements >= 0);
93 vspan(nonstd::span<value_type> span) noexcept :
94 _begin(span.data()), _end(span.data()), _max(span.data() + span.size()) {}
98 vspan &operator=(
vspan const &other) =
default;
102 [[nodiscard]]
iterator begin()
noexcept {
return _begin; }
103 [[nodiscard]]
const_iterator begin()
const noexcept {
return _begin; }
104 [[nodiscard]]
const_iterator cbegin()
const noexcept {
return _begin; }
106 [[nodiscard]]
iterator end()
noexcept {
return _end; }
107 [[nodiscard]]
const_iterator end()
const noexcept {
return _end; }
108 [[nodiscard]]
const_iterator cend()
const noexcept {
return _end; }
110 [[nodiscard]]
size_t size()
const noexcept {
return std::distance(_begin, _end); }
112 [[nodiscard]] value_type &operator[](
size_t i)
noexcept { tt_assume(i < size());
return *std::launder(_begin + i); }
113 [[nodiscard]] value_type
const &operator[](
size_t i)
const noexcept { tt_assume(i < size());
return *std::launder(_begin + i); }
115 value_type &front()
noexcept { tt_assume(_end != _begin);
return *std::launder(_begin); }
116 value_type
const &front()
const noexcept { tt_assume(_end != _begin);
return *std::launder(_begin); }
117 value_type &back()
noexcept { tt_assume(_end != _begin);
return *std::launder(_end - 1); }
118 value_type
const &back()
const noexcept { tt_assume(_end != _begin);
return *std::launder(_end - 1); }
120 vspan &clear()
noexcept {
121 for (
auto i = _begin; i != _end; ++i) {
122 std::destroy_at(std::launder(i));
128 void push_back(value_type
const &rhs)
noexcept {
129 tt_assume(_end != _max);
131 [[maybe_unused]] value_type *ptr =
new (_end) value_type(rhs);
135 void push_back(value_type &&rhs)
noexcept {
136 tt_assume(_end != _max);
138 [[maybe_unused]] value_type *ptr =
new (_end) value_type(
std::move(rhs));
142 template<
typename... Args>
143 void emplace_back(Args &&... args)
noexcept {
144 tt_assume(_end != _max);
146 [[maybe_unused]] value_type *ptr =
new (_end) value_type(std::forward<Args>(args)...);
150 void pop_back()
noexcept {
151 tt_assume(_end != _begin);
153 std::destroy_at(std::launder(_end));