77 size_t size = span.size();
78 T& back = span.back();
79 span = span.first(size - 1);
86 return std::as_bytes(std::span{v});
91 return std::as_writable_bytes(std::span{std::forward<V>(v)});
95inline unsigned char*
UCharCast(
char* c) {
return reinterpret_cast<unsigned char*
>(c); }
96inline unsigned char*
UCharCast(
unsigned char* c) {
return c; }
97inline unsigned char*
UCharCast(
signed char* c) {
return reinterpret_cast<unsigned char*
>(c); }
98inline unsigned char*
UCharCast(std::byte* c) {
return reinterpret_cast<unsigned char*
>(c); }
99inline const unsigned char*
UCharCast(
const char* c) {
return reinterpret_cast<const unsigned char*
>(c); }
100inline const unsigned char*
UCharCast(
const unsigned char* c) {
return c; }
101inline const unsigned char*
UCharCast(
const signed char* c) {
return reinterpret_cast<const unsigned char*
>(c); }
102inline const unsigned char*
UCharCast(
const std::byte* c) {
return reinterpret_cast<const unsigned char*
>(c); }
108template <
typename T,
size_t N>
constexpr auto UCharSpanCast(std::span<T, N>
s) {
return std::span<std::remove_pointer_t<
decltype(
UCharCast(
s.data()))>, N>{
UCharCast(
s.data()),
s.size()}; }
#define T(expected, seed, data)
constexpr auto MakeWritableUCharSpan(V &&v) -> decltype(UCharSpanCast(std::span{std::forward< V >(v)}))
auto MakeByteSpan(const V &v) noexcept
constexpr auto MakeUCharSpan(const V &v) -> decltype(UCharSpanCast(std::span{v}))
Like the std::span constructor, but for (const) unsigned char member types only.
T & SpanPopBack(std::span< T > &span)
A span is an object that can refer to a contiguous sequence of objects.
auto MakeWritableByteSpan(V &&v) noexcept
constexpr auto UCharSpanCast(std::span< T, N > s)
unsigned char * UCharCast(char *c)