34 tt_axiom(ptr !=
nullptr);
38 tt_axiom(ptr !=
nullptr);
43 [[nodiscard]] value_type &operator*()
noexcept {
return *std::launder(ptr); }
44 [[nodiscard]] value_type
const &operator*()
const noexcept {
return *std::launder(ptr); }
45 [[nodiscard]] value_type *operator->()
noexcept {
return std::launder(ptr); }
46 [[nodiscard]] value_type
const *operator->()
const noexcept {
return std::launder(ptr); }
47 [[nodiscard]] value_type &operator[](
size_t i)
noexcept {
return *std::launder(ptr + i); }
48 [[nodiscard]] value_type
const &operator[](
size_t i)
const noexcept {
return *std::launder(ptr + i); }
51 vspan_iterator operator++(
int)
noexcept {
auto tmp = *
this; ++ptr;
return tmp; }
53 vspan_iterator operator--(
int)
noexcept {
auto tmp = *
this; --ptr;
return tmp; }
86 _begin(
nullptr), _end(
nullptr), _max(
nullptr) {}
88 vspan(value_type *buffer,
ssize_t nr_elements) noexcept :
89 _begin(buffer), _end(buffer), _max(buffer + nr_elements)
91 tt_axiom(nr_elements >= 0);
94 vspan(std::span<value_type> span) noexcept :
95 _begin(span.data()), _end(span.data()), _max(span.data() + span.size()) {}
99 vspan &operator=(
vspan const &other) =
default;
103 [[nodiscard]]
iterator begin()
noexcept {
return _begin; }
104 [[nodiscard]]
const_iterator begin()
const noexcept {
return _begin; }
105 [[nodiscard]]
const_iterator cbegin()
const noexcept {
return _begin; }
107 [[nodiscard]]
iterator end()
noexcept {
return _end; }
108 [[nodiscard]]
const_iterator end()
const noexcept {
return _end; }
109 [[nodiscard]]
const_iterator cend()
const noexcept {
return _end; }
111 [[nodiscard]]
size_t size()
const noexcept {
return std::distance(_begin, _end); }
113 [[nodiscard]] value_type &operator[](
size_t i)
noexcept { tt_axiom(i < size());
return *std::launder(_begin + i); }
114 [[nodiscard]] value_type
const &operator[](
size_t i)
const noexcept { tt_axiom(i < size());
return *std::launder(_begin + i); }
116 value_type &front()
noexcept { tt_axiom(_end != _begin);
return *std::launder(_begin); }
117 value_type
const &front()
const noexcept { tt_axiom(_end != _begin);
return *std::launder(_begin); }
118 value_type &back()
noexcept { tt_axiom(_end != _begin);
return *std::launder(_end - 1); }
119 value_type
const &back()
const noexcept { tt_axiom(_end != _begin);
return *std::launder(_end - 1); }
121 vspan &clear()
noexcept {
122 for (
auto i = _begin; i != _end; ++i) {
123 std::destroy_at(std::launder(i));
129 void push_back(value_type
const &rhs)
noexcept {
130 tt_axiom(_end != _max);
132 [[maybe_unused]] value_type *ptr =
new (_end) value_type(rhs);
136 void push_back(value_type &&rhs)
noexcept {
137 tt_axiom(_end != _max);
139 [[maybe_unused]] value_type *ptr =
new (_end) value_type(
std::move(rhs));
143 template<
typename... Args>
144 void emplace_back(Args &&... args)
noexcept {
145 tt_axiom(_end != _max);
147 [[maybe_unused]] value_type *ptr =
new (_end) value_type(std::forward<Args>(args)...);
151 void pop_back()
noexcept {
152 tt_axiom(_end != _begin);
154 std::destroy_at(std::launder(_end));