22 using const_pointer =
void const *;
24 static constexpr std::size_t extent = std::dynamic_extent;
37 template<
typename T, std::
size_t N>
42 template<
typename T, std::
size_t N>
47 [[nodiscard]]
constexpr pointer data()
const noexcept
52 [[nodiscard]]
constexpr size_type size()
const noexcept
57 [[nodiscard]]
constexpr size_type size_bytes()
const noexcept
62 [[nodiscard]]
constexpr bool empty()
const noexcept
67 template<std::
size_t N>
68 [[nodiscard]]
constexpr void_span first()
const noexcept
80 template<std::
size_t N>
81 [[nodiscard]]
constexpr void_span last()
const noexcept
93 template<std::
size_t Offset, std::
size_t Count = std::dynamic_extent>
94 [[nodiscard]]
constexpr void_span subspan()
const noexcept
96 if constexpr (Count == std::dynamic_extent) {
100 hi_axiom((Offset + Count) <= _size);
108 if (count == std::dynamic_extent) {
109 count = _size - offset;
116 template<
typename T,
size_t E = std::dynamic_extent>
117 [[nodiscard]]
constexpr friend std::span<T, E> as_span(
void_span const& rhs)
noexcept
119 if constexpr (E == std::dynamic_extent) {
120 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<T> == 0);
121 hi_axiom((rhs._size /
sizeof(T)) *
sizeof(T) == rhs._size);
122 return {
static_cast<T *
>(rhs._pointer), rhs._size /
sizeof(T)};
125 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<T> == 0);
126 hi_axiom(E *
sizeof(T) <= rhs._size);
127 return {
static_cast<T *
>(rhs._pointer), E};
131 template<
typename CharT,
typename Traits = std::
char_traits<CharT>>
132 [[nodiscard]]
constexpr friend std::basic_string_view<CharT, Traits> as_basic_string_view(
void_span const& rhs)
noexcept
134 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<CharT> == 0);
135 hi_axiom((rhs._size /
sizeof(CharT)) *
sizeof(CharT) == rhs._size);
136 return {
static_cast<CharT
const *
>(rhs._pointer), rhs._size /
sizeof(CharT)};
139 [[nodiscard]]
constexpr friend std::string_view as_string_view(
void_span const& rhs)
noexcept
141 return as_basic_string_view<char>(rhs);
144 [[nodiscard]]
constexpr friend bstring_view as_bstring_view(
void_span const& rhs)
noexcept
146 return as_basic_string_view<std::byte, byte_char_traits>(rhs);
159 using const_pointer =
void const *;
161 static constexpr std::size_t extent = std::dynamic_extent;
176 template<
typename T, std::
size_t N>
181 template<
typename T, std::
size_t N>
186 [[nodiscard]]
constexpr pointer data()
const noexcept
191 [[nodiscard]]
constexpr size_type size()
const noexcept
196 [[nodiscard]]
constexpr size_type size_bytes()
const noexcept
201 [[nodiscard]]
constexpr bool empty()
const noexcept
206 template<std::
size_t N>
210 return {_pointer, N};
216 return {_pointer, n};
219 template<std::
size_t N>
232 template<std::
size_t Offset, std::
size_t Count = std::dynamic_extent>
235 if constexpr (Count == std::dynamic_extent) {
239 hi_axiom((Offset + Count) <= _size);
247 if (count == std::dynamic_extent) {
248 count = _size - offset;
255 template<
typename T,
size_t E = std::dynamic_extent>
256 [[nodiscard]]
constexpr friend std::span<T, E> as_span(
const_void_span const& rhs)
noexcept requires(std::is_const_v<T>)
258 if constexpr (E == std::dynamic_extent) {
259 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<T> == 0);
260 hi_axiom((rhs._size /
sizeof(T)) *
sizeof(T) == rhs._size);
261 return {
static_cast<T *
>(rhs._pointer), rhs._size /
sizeof(T)};
264 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<T> == 0);
265 hi_axiom(E *
sizeof(T) <= rhs._size);
266 return {
static_cast<T *
>(rhs._pointer), E};
270 template<
typename CharT,
typename Traits = std::
char_traits<CharT>>
271 [[nodiscard]]
constexpr friend std::basic_string_view<CharT, Traits> as_basic_string_view(
const_void_span const& rhs)
noexcept
273 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<CharT> == 0);
274 hi_axiom((rhs._size /
sizeof(CharT)) *
sizeof(CharT) == rhs._size);
275 return {
static_cast<CharT
const *
>(rhs._pointer), rhs._size /
sizeof(CharT)};
278 [[nodiscard]]
constexpr friend std::string_view as_string_view(
const_void_span const& rhs)
noexcept
280 return as_basic_string_view<char>(rhs);
283 [[nodiscard]]
constexpr friend bstring_view as_bstring_view(
const_void_span const& rhs)
noexcept
285 return as_basic_string_view<std::byte, byte_char_traits>(rhs);
#define hi_assert(expression,...)
Assert if expression is true.
Definition assert.hpp:199
#define hi_axiom(expression,...)
Specify an axiom; an expression that is true.
Definition assert.hpp:253
void * advance_bytes(void *ptr, std::ptrdiff_t distance) noexcept
Advance a pointer by a number of bytes.
Definition memory.hpp:191