|
|
|
@ -36,6 +36,11 @@
|
|
|
|
|
#include "byte_slice.h"
|
|
|
|
|
#include "byte_stream.h"
|
|
|
|
|
|
|
|
|
|
namespace
|
|
|
|
|
{
|
|
|
|
|
const std::size_t page_size = 4096;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace epee
|
|
|
|
|
{
|
|
|
|
|
struct byte_slice_data
|
|
|
|
@ -173,16 +178,27 @@ namespace epee
|
|
|
|
|
: byte_slice(adapt_buffer{}, std::move(buffer))
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
byte_slice::byte_slice(byte_stream&& stream) noexcept
|
|
|
|
|
byte_slice::byte_slice(byte_stream&& stream, const bool shrink)
|
|
|
|
|
: storage_(nullptr), portion_(stream.data(), stream.size())
|
|
|
|
|
{
|
|
|
|
|
if (stream.size())
|
|
|
|
|
if (portion_.size())
|
|
|
|
|
{
|
|
|
|
|
std::uint8_t* const data = stream.take_buffer().release() - sizeof(raw_byte_slice);
|
|
|
|
|
byte_buffer buf;
|
|
|
|
|
if (shrink && page_size <= stream.available())
|
|
|
|
|
{
|
|
|
|
|
buf = byte_buffer_resize(stream.take_buffer(), portion_.size());
|
|
|
|
|
if (!buf)
|
|
|
|
|
throw std::bad_alloc{};
|
|
|
|
|
portion_ = {buf.get(), portion_.size()};
|
|
|
|
|
}
|
|
|
|
|
else // no need to shrink buffer
|
|
|
|
|
buf = stream.take_buffer();
|
|
|
|
|
|
|
|
|
|
std::uint8_t* const data = buf.release() - sizeof(raw_byte_slice);
|
|
|
|
|
new (data) raw_byte_slice{};
|
|
|
|
|
storage_.reset(reinterpret_cast<raw_byte_slice*>(data));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
else // empty stream
|
|
|
|
|
portion_ = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|