36 #include <type_traits> 59 static constexpr
bool safe_conversion() noexcept
62 using with_const =
typename std::add_const<U>::type;
63 return std::is_same<T, U>() ||
64 (std::is_const<T>() && std::is_same<T, with_const>());
78 constexpr
span() noexcept : ptr(
nullptr), len(0) {}
79 constexpr
span(std::nullptr_t) noexcept :
span() {}
82 template<
typename U,
typename =
typename std::enable_if<safe_conversion<U>()>::type>
83 constexpr
span(U*
const src_ptr,
const std::size_t
count) noexcept
84 : ptr(src_ptr), len(
count) {}
87 template<std::
size_t N>
88 constexpr
span(
T (&src)[N]) noexcept :
span(src, N) {}
90 constexpr
span(
const span&) noexcept =
default;
97 amount = std::min(len, amount);
109 constexpr
bool empty() const noexcept {
return size() == 0; }
111 constexpr std::size_t
size() const noexcept {
return len; }
126 return {src.data(), src.size()};
134 return {src.data(), src.size()};
140 return !std::is_standard_layout<T>() ||
alignof(
T) != 1;
147 static_assert(!has_padding<T>(),
"source type may have padding");
148 return {
reinterpret_cast<const std::uint8_t*
>(src.data()), src.size_bytes()};
155 static_assert(!std::is_empty<T>(),
"empty types will not work -> sizeof == 1");
156 static_assert(!has_padding<T>(),
"source type may have padding");
157 return {
reinterpret_cast<const std::uint8_t*
>(std::addressof(src)),
sizeof(
T)};
164 static_assert(!std::is_empty<T>(),
"empty types will not work -> sizeof == 1");
165 static_assert(!has_padding<T>(),
"source type may have padding");
166 return {
reinterpret_cast<std::uint8_t*
>(std::addressof(src)),
sizeof(
T)};
173 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 type");
174 return {
reinterpret_cast<const T*
>(s.data()), s.size()};
span< const std::uint8_t > as_byte_span(const T &src) noexcept
span & operator=(const span &) noexcept=default
constexpr const_iterator cbegin() const noexcept
span< const T > strspan(const std::string &s) noexcept
make a span from a std::string
const const std::uint8_t * const_pointer
span< std::uint8_t > as_mut_byte_span(T &src) noexcept
Non-owning sequence of data. Does not deep copy.
const std::uint8_t value_type
constexpr bool has_padding() noexcept
constexpr std::size_t size() const noexcept
constexpr span< typename T::value_type > to_mut_span(T &src)
mdb_size_t count(MDB_cursor *cur)
constexpr const_iterator cend() const noexcept
const_pointer const_iterator
const T & operator[](size_t idx) const
constexpr iterator end() const noexcept
constexpr span(std::nullptr_t) noexcept
std::size_t remove_prefix(std::size_t amount) noexcept
constexpr span(U *const src_ptr, const std::size_t count) noexcept
Prevent derived-to-base conversions; invalid in this context.
constexpr span< const typename T::value_type > to_span(const T &src)
const const std::uint8_t & const_reference
constexpr iterator begin() const noexcept
constexpr std::size_t size_bytes() const noexcept
constexpr span() noexcept
constexpr bool empty() const noexcept
const std::uint8_t * pointer
constexpr span(T(&src)[N]) noexcept
Conversion from C-array. Prevents common bugs with sizeof + arrays.
std::ptrdiff_t difference_type
span< const std::uint8_t > to_byte_span(const span< const T > src) noexcept
constexpr pointer data() const noexcept