60 using with_const =
typename std::add_const<U>::type;
61 return std::is_same<T, U>() ||
62 (std::is_const<T>() && std::is_same<T, with_const>());
77 constexpr span(std::nullptr_t) noexcept :
span() {}
80 template<typename U, typename = typename std::enable_if<safe_conversion<U>()>::type>
81 constexpr span(U*
const src_ptr,
const std::size_t count) noexcept
82 :
ptr(src_ptr),
len(count) {}
85 template<std::
size_t N>
86 constexpr span(
T (&src)[N]) noexcept :
span(src, N) {}
88 constexpr span(
const span&)
noexcept =
default;
95 amount = std::min(
len, amount);
125 return {src.data(), src.size()};
133 return {src.data(), src.size()};
140 static_assert(!std::is_empty<T>(),
"empty value types will not work -> sizeof == 1");
141 static_assert(std::is_standard_layout<T>(),
"type must have standard layout");
142 static_assert(std::is_trivially_copyable<T>(),
"type must be trivially copyable");
143 static_assert(
alignof(
T) == 1,
"type may have padding");
144 return {
reinterpret_cast<const std::uint8_t*
>(src.data()), src.size_bytes()};
151 using value_type =
typename T::value_type;
152 static_assert(!std::is_empty<value_type>(),
"empty value types will not work -> sizeof == 1");
153 static_assert(std::is_standard_layout<value_type>(),
"value type must have standard layout");
154 static_assert(std::is_trivially_copyable<value_type>(),
"value type must be trivially copyable");
155 static_assert(
alignof(value_type) == 1,
"value type may have padding");
156 return {
reinterpret_cast<std::uint8_t*
>(src.data()), src.size() *
sizeof(value_type)};
163 static_assert(!std::is_empty<T>(),
"empty types will not work -> sizeof == 1");
164 static_assert(std::is_standard_layout<T>(),
"type must have standard layout");
165 static_assert(std::is_trivially_copyable<T>(),
"type must be trivially copyable");
166 static_assert(
alignof(
T) == 1,
"type may have padding");
167 return {
reinterpret_cast<const std::uint8_t*
>(std::addressof(src)),
sizeof(
T)};
174 static_assert(!std::is_empty<T>(),
"empty types will not work -> sizeof == 1");
175 static_assert(std::is_standard_layout<T>(),
"type must have standard layout");
176 static_assert(std::is_trivially_copyable<T>(),
"type must be trivially copyable");
177 static_assert(
alignof(
T) == 1,
"type may have padding");
178 return {
reinterpret_cast<std::uint8_t*
>(std::addressof(src)),
sizeof(
T)};
182 template<
typename T,
typename U>
185 static_assert(std::is_same<typename U::value_type, char>(),
"unexpected source type");
186 static_assert(std::is_same<T, char>() || std::is_same<T, unsigned char>() || std::is_same<T, int8_t>() || std::is_same<T, uint8_t>(),
"Unexpected destination type");
187 return {
reinterpret_cast<const T*
>(
s.data()),
s.size()};
#define s(x, c)
Definition aesb.c:47
Non-owning sequence of data. Does not deep copy.
Definition span.h:55
std::size_t remove_prefix(std::size_t amount) noexcept
Definition span.h:93
T & operator[](size_t idx) noexcept
Definition span.h:112
const T & const_reference
Definition span.h:72
constexpr const_iterator cend() const noexcept
Definition span.h:105
constexpr span(T(&src)[N]) noexcept
Conversion from C-array. Prevents common bugs with sizeof + arrays.
Definition span.h:86
static constexpr bool safe_conversion() noexcept
Definition span.h:57
constexpr span(U *const src_ptr, const std::size_t count) noexcept
Prevent derived-to-base conversions; invalid in this context.
Definition span.h:81
constexpr std::size_t size_bytes() const noexcept
Definition span.h:110
constexpr iterator end() const noexcept
Definition span.h:104
constexpr std::size_t size() const noexcept
Definition span.h:109
const T * const_pointer
Definition span.h:70
std::ptrdiff_t difference_type
Definition span.h:68
pointer iterator
Definition span.h:73
T value_type
Definition span.h:66
constexpr const_iterator cbegin() const noexcept
Definition span.h:102
const T & operator[](size_t idx) const noexcept
Definition span.h:113
span & operator=(const span &) noexcept=default
std::size_t len
Definition span.h:117
constexpr span(std::nullptr_t) noexcept
Definition span.h:77
constexpr span(const span &) noexcept=default
const_pointer const_iterator
Definition span.h:74
T * ptr
Definition span.h:116
T * pointer
Definition span.h:69
constexpr span() noexcept
Definition span.h:76
constexpr bool empty() const noexcept
Definition span.h:107
constexpr iterator begin() const noexcept
Definition span.h:101
constexpr pointer data() const noexcept
Definition span.h:108
T & reference
Definition span.h:71
std::size_t size_type
Definition span.h:67
#define const
Definition ipfrdr.c:80
TODO: (mj-xmr) This will be reduced in an another PR.
Definition byte_slice.h:40
span< std::uint8_t > as_mut_byte_span(T &src) noexcept
Definition span.h:172
span< const std::uint8_t > to_byte_span(const span< const T > src) noexcept
Definition span.h:138
span< const T > strspan(const U &s) noexcept
make a span from a std::string
Definition span.h:183
constexpr span< const typename T::value_type > to_span(const T &src)
Definition span.h:122
constexpr span< std::uint8_t > to_mut_byte_span(T &src)
Definition span.h:149
span< const std::uint8_t > as_byte_span(const T &src) noexcept
Definition span.h:161
constexpr span< typename T::value_type > to_mut_span(T &src)
Definition span.h:130