|
|
|
@ -36,19 +36,18 @@ struct [[deprecated("this type is stupid, use something else")]] llarp_buffer_t
|
|
|
|
|
/// max size of buffer
|
|
|
|
|
size_t sz{0};
|
|
|
|
|
|
|
|
|
|
byte_t
|
|
|
|
|
operator[](size_t x)
|
|
|
|
|
byte_t operator[](size_t x)
|
|
|
|
|
{
|
|
|
|
|
return *(this->base + x);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
llarp_buffer_t() = default;
|
|
|
|
|
|
|
|
|
|
llarp_buffer_t(byte_t* b, byte_t* c, size_t s) : base(b), cur(c), sz(s)
|
|
|
|
|
llarp_buffer_t(byte_t * b, byte_t * c, size_t s) : base(b), cur(c), sz(s)
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
llarp_buffer_t(const ManagedBuffer&) = delete;
|
|
|
|
|
llarp_buffer_t(ManagedBuffer&&) = delete;
|
|
|
|
|
llarp_buffer_t(ManagedBuffer &&) = delete;
|
|
|
|
|
|
|
|
|
|
template <typename Byte>
|
|
|
|
|
static constexpr bool is_basic_byte = sizeof(Byte) == 1 and std::is_trivially_copyable_v<Byte>;
|
|
|
|
@ -58,21 +57,21 @@ struct [[deprecated("this type is stupid, use something else")]] llarp_buffer_t
|
|
|
|
|
template <
|
|
|
|
|
typename Byte,
|
|
|
|
|
typename = std::enable_if_t<not std::is_const_v<Byte> && is_basic_byte<Byte>>>
|
|
|
|
|
llarp_buffer_t(Byte* buf, size_t sz) : base{reinterpret_cast<byte_t*>(buf)}, cur{base}, sz{sz}
|
|
|
|
|
llarp_buffer_t(Byte * buf, size_t sz) : base{reinterpret_cast<byte_t*>(buf)}, cur{base}, sz{sz}
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
/// initialize llarp_buffer_t from vector or array of byte-like values
|
|
|
|
|
template <
|
|
|
|
|
typename Byte,
|
|
|
|
|
typename = std::enable_if_t<not std::is_const_v<Byte> && is_basic_byte<Byte>>>
|
|
|
|
|
llarp_buffer_t(std::vector<Byte>& b) : llarp_buffer_t{b.data(), b.size()}
|
|
|
|
|
llarp_buffer_t(std::vector<Byte> & b) : llarp_buffer_t{b.data(), b.size()}
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
template <
|
|
|
|
|
typename Byte,
|
|
|
|
|
size_t N,
|
|
|
|
|
typename = std::enable_if_t<not std::is_const_v<Byte> && is_basic_byte<Byte>>>
|
|
|
|
|
llarp_buffer_t(std::array<Byte, N>& b) : llarp_buffer_t{b.data(), b.size()}
|
|
|
|
|
llarp_buffer_t(std::array<Byte, N> & b) : llarp_buffer_t{b.data(), b.size()}
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
// These overloads, const_casting away the const, are not just gross but downright dangerous:
|
|
|
|
@ -98,32 +97,27 @@ struct [[deprecated("this type is stupid, use something else")]] llarp_buffer_t
|
|
|
|
|
template <
|
|
|
|
|
typename T,
|
|
|
|
|
typename = std::void_t<decltype(std::declval<T>().data() + std::declval<T>().size())>>
|
|
|
|
|
explicit llarp_buffer_t(T&& t) : llarp_buffer_t{t.data(), t.size()}
|
|
|
|
|
explicit llarp_buffer_t(T && t) : llarp_buffer_t{t.data(), t.size()}
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
byte_t*
|
|
|
|
|
begin()
|
|
|
|
|
byte_t* begin()
|
|
|
|
|
{
|
|
|
|
|
return base;
|
|
|
|
|
}
|
|
|
|
|
const byte_t*
|
|
|
|
|
begin() const
|
|
|
|
|
const byte_t* begin() const
|
|
|
|
|
{
|
|
|
|
|
return base;
|
|
|
|
|
}
|
|
|
|
|
byte_t*
|
|
|
|
|
end()
|
|
|
|
|
byte_t* end()
|
|
|
|
|
{
|
|
|
|
|
return base + sz;
|
|
|
|
|
}
|
|
|
|
|
const byte_t*
|
|
|
|
|
end() const
|
|
|
|
|
const byte_t* end() const
|
|
|
|
|
{
|
|
|
|
|
return base + sz;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
size_t
|
|
|
|
|
size_left() const
|
|
|
|
|
size_t size_left() const
|
|
|
|
|
{
|
|
|
|
|
size_t diff = cur - base;
|
|
|
|
|
assert(diff <= sz);
|
|
|
|
@ -133,66 +127,50 @@ struct [[deprecated("this type is stupid, use something else")]] llarp_buffer_t
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <typename OutputIt>
|
|
|
|
|
bool
|
|
|
|
|
read_into(OutputIt begin, OutputIt end);
|
|
|
|
|
bool read_into(OutputIt begin, OutputIt end);
|
|
|
|
|
|
|
|
|
|
template <typename InputIt>
|
|
|
|
|
bool
|
|
|
|
|
write(InputIt begin, InputIt end);
|
|
|
|
|
bool write(InputIt begin, InputIt end);
|
|
|
|
|
|
|
|
|
|
#ifndef _WIN32
|
|
|
|
|
bool
|
|
|
|
|
writef(const char* fmt, ...) __attribute__((format(printf, 2, 3)));
|
|
|
|
|
bool writef(const char* fmt, ...) __attribute__((format(printf, 2, 3)));
|
|
|
|
|
|
|
|
|
|
#elif defined(__MINGW64__) || defined(__MINGW32__)
|
|
|
|
|
bool
|
|
|
|
|
writef(const char* fmt, ...) __attribute__((__format__(__MINGW_PRINTF_FORMAT, 2, 3)));
|
|
|
|
|
bool writef(const char* fmt, ...) __attribute__((__format__(__MINGW_PRINTF_FORMAT, 2, 3)));
|
|
|
|
|
#else
|
|
|
|
|
bool
|
|
|
|
|
writef(const char* fmt, ...);
|
|
|
|
|
bool writef(const char* fmt, ...);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
put_uint16(uint16_t i);
|
|
|
|
|
bool
|
|
|
|
|
put_uint32(uint32_t i);
|
|
|
|
|
bool put_uint16(uint16_t i);
|
|
|
|
|
bool put_uint32(uint32_t i);
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
put_uint64(uint64_t i);
|
|
|
|
|
bool put_uint64(uint64_t i);
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
read_uint16(uint16_t& i);
|
|
|
|
|
bool
|
|
|
|
|
read_uint32(uint32_t& i);
|
|
|
|
|
bool read_uint16(uint16_t & i);
|
|
|
|
|
bool read_uint32(uint32_t & i);
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
read_uint64(uint64_t& i);
|
|
|
|
|
bool read_uint64(uint64_t & i);
|
|
|
|
|
|
|
|
|
|
size_t
|
|
|
|
|
read_until(char delim, byte_t* result, size_t resultlen);
|
|
|
|
|
size_t read_until(char delim, byte_t* result, size_t resultlen);
|
|
|
|
|
|
|
|
|
|
/// make a copy of this buffer
|
|
|
|
|
std::vector<byte_t>
|
|
|
|
|
copy() const;
|
|
|
|
|
std::vector<byte_t> copy() const;
|
|
|
|
|
|
|
|
|
|
/// get a read-only view over the entire region
|
|
|
|
|
llarp::byte_view_t
|
|
|
|
|
view_all() const
|
|
|
|
|
llarp::byte_view_t view_all() const
|
|
|
|
|
{
|
|
|
|
|
return {base, sz};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// get a read-only view over the remaining/unused region
|
|
|
|
|
llarp::byte_view_t
|
|
|
|
|
view_remaining() const
|
|
|
|
|
llarp::byte_view_t view_remaining() const
|
|
|
|
|
{
|
|
|
|
|
return {cur, size_left()};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Part of the curse. Returns true if the remaining buffer space starts with the given string
|
|
|
|
|
/// view.
|
|
|
|
|
bool
|
|
|
|
|
startswith(std::string_view prefix_str) const
|
|
|
|
|
bool startswith(std::string_view prefix_str) const
|
|
|
|
|
{
|
|
|
|
|
llarp::byte_view_t prefix{
|
|
|
|
|
reinterpret_cast<const byte_t*>(prefix_str.data()), prefix_str.size()};
|
|
|
|
@ -202,7 +180,7 @@ struct [[deprecated("this type is stupid, use something else")]] llarp_buffer_t
|
|
|
|
|
private:
|
|
|
|
|
friend struct ManagedBuffer;
|
|
|
|
|
llarp_buffer_t(const llarp_buffer_t&) = default;
|
|
|
|
|
llarp_buffer_t(llarp_buffer_t&&) = default;
|
|
|
|
|
llarp_buffer_t(llarp_buffer_t &&) = default;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template <typename OutputIt>
|
|
|
|
@ -244,7 +222,7 @@ struct [[deprecated("deprecated along with llarp_buffer_t")]] ManagedBuffer
|
|
|
|
|
explicit ManagedBuffer(const llarp_buffer_t& b) : underlying(b)
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
ManagedBuffer(ManagedBuffer&&) = default;
|
|
|
|
|
ManagedBuffer(ManagedBuffer &&) = default;
|
|
|
|
|
ManagedBuffer(const ManagedBuffer&) = default;
|
|
|
|
|
|
|
|
|
|
operator const llarp_buffer_t&() const
|
|
|
|
|