24 using const_pointer =
void const *;
26 static constexpr std::size_t extent = std::dynamic_extent;
36 hi_axiom(
pointer !=
nullptr or size == 0);
39 template<
typename T, std::
size_t N>
44 template<
typename T, std::
size_t N>
49 [[nodiscard]]
constexpr pointer data()
const noexcept
54 [[nodiscard]]
constexpr size_type size()
const noexcept
59 [[nodiscard]]
constexpr size_type size_bytes()
const noexcept
64 [[nodiscard]]
constexpr bool empty()
const noexcept
69 template<std::
size_t N>
70 [[nodiscard]]
constexpr void_span first()
const noexcept
82 template<std::
size_t N>
83 [[nodiscard]]
constexpr void_span last()
const noexcept
95 template<std::
size_t Offset, std::
size_t Count = std::dynamic_extent>
96 [[nodiscard]]
constexpr void_span subspan()
const noexcept
98 if constexpr (Count == std::dynamic_extent) {
99 hi_axiom(Offset <= _size);
102 hi_axiom((Offset + Count) <= _size);
109 hi_axiom(offset <= _size);
110 if (count == std::dynamic_extent) {
111 count = _size - offset;
114 hi_axiom(offset + count <= _size);
118 template<
typename T,
size_t E = std::dynamic_extent>
119 [[nodiscard]]
constexpr friend std::span<T, E> as_span(
void_span const& rhs)
noexcept
121 if constexpr (E == std::dynamic_extent) {
122 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<T> == 0);
123 hi_axiom((rhs._size /
sizeof(T)) *
sizeof(T) == rhs._size);
124 return {
static_cast<T *
>(rhs._pointer), rhs._size /
sizeof(T)};
127 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<T> == 0);
128 hi_axiom(E *
sizeof(T) <= rhs._size);
129 return {
static_cast<T *
>(rhs._pointer), E};
133 template<
typename CharT,
typename Traits = std::
char_traits<CharT>>
134 [[nodiscard]]
constexpr friend std::basic_string_view<CharT, Traits> as_basic_string_view(
void_span const& rhs)
noexcept
136 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<CharT> == 0);
137 hi_axiom((rhs._size /
sizeof(CharT)) *
sizeof(CharT) == rhs._size);
138 return {
static_cast<CharT
const *
>(rhs._pointer), rhs._size /
sizeof(CharT)};
143 return as_basic_string_view<char>(rhs);
146 [[nodiscard]]
constexpr friend bstring_view as_bstring_view(
void_span const& rhs)
noexcept
148 return as_basic_string_view<std::byte, byte_char_traits>(rhs);
161 using const_pointer =
void const *;
163 static constexpr std::size_t extent = std::dynamic_extent;
173 hi_axiom(
pointer !=
nullptr or size == 0);
178 template<
typename T, std::
size_t N>
183 template<
typename T, std::
size_t N>
188 [[nodiscard]]
constexpr pointer data()
const noexcept
193 [[nodiscard]]
constexpr size_type size()
const noexcept
198 [[nodiscard]]
constexpr size_type size_bytes()
const noexcept
203 [[nodiscard]]
constexpr bool empty()
const noexcept
208 template<std::
size_t N>
211 hi_axiom(N <= _size);
212 return {_pointer, N};
217 hi_axiom(
n <= _size);
218 return {_pointer,
n};
221 template<std::
size_t N>
224 hi_axiom(N <= _size);
230 hi_axiom(
n <= _size);
234 template<std::
size_t Offset, std::
size_t Count = std::dynamic_extent>
237 if constexpr (Count == std::dynamic_extent) {
238 hi_axiom(Offset <= _size);
241 hi_axiom((Offset + Count) <= _size);
248 hi_axiom(offset <= _size);
249 if (count == std::dynamic_extent) {
250 count = _size - offset;
253 hi_axiom(offset + count <= _size);
257 template<
typename T,
size_t E = std::dynamic_extent>
258 [[nodiscard]]
constexpr friend std::span<T, E> as_span(
const_void_span const& rhs)
noexcept requires(std::is_const_v<T>)
260 if constexpr (E == std::dynamic_extent) {
261 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<T> == 0);
262 hi_axiom((rhs._size /
sizeof(T)) *
sizeof(T) == rhs._size);
263 return {
static_cast<T *
>(rhs._pointer), rhs._size /
sizeof(T)};
266 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<T> == 0);
267 hi_axiom(E *
sizeof(T) <= rhs._size);
268 return {
static_cast<T *
>(rhs._pointer), E};
272 template<
typename CharT,
typename Traits = std::
char_traits<CharT>>
273 [[nodiscard]]
constexpr friend std::basic_string_view<CharT, Traits> as_basic_string_view(
const_void_span const& rhs)
noexcept
275 hi_axiom(std::bit_cast<std::uintptr_t>(rhs._pointer) % std::alignment_of_v<CharT> == 0);
276 hi_axiom((rhs._size /
sizeof(CharT)) *
sizeof(CharT) == rhs._size);
277 return {
static_cast<CharT
const *
>(rhs._pointer), rhs._size /
sizeof(CharT)};
282 return as_basic_string_view<char>(rhs);
285 [[nodiscard]]
constexpr friend bstring_view as_bstring_view(
const_void_span const& rhs)
noexcept
287 return as_basic_string_view<std::byte, byte_char_traits>(rhs);
void * advance_bytes(void *ptr, std::ptrdiff_t distance) noexcept
Advance a pointer by a number of bytes.
Definition memory.hpp:210
std::string_view as_string_view(resource_view const &rhs) noexcept
Get a span to the memory mapping.
Definition resource_view.hpp:48