Fixed bugs for take_slice and byte_stream->byte_slice

This commit is contained in:
Lee Clagett 2020-05-12 01:26:37 -04:00 committed by wowario
parent febb8df4bb
commit 4c757a7a2a
No known key found for this signature in database
GPG key ID: 24DCBE762DE9C111
2 changed files with 48 additions and 9 deletions

View file

@ -173,9 +173,14 @@ namespace epee
byte_slice::byte_slice(byte_stream&& stream) noexcept byte_slice::byte_slice(byte_stream&& stream) noexcept
: storage_(nullptr), portion_(stream.data(), stream.size()) : storage_(nullptr), portion_(stream.data(), stream.size())
{ {
std::uint8_t* const data = stream.take_buffer().release() - sizeof(raw_byte_slice); if (stream.size())
new (data) raw_byte_slice{}; {
storage_.reset(reinterpret_cast<raw_byte_slice*>(data)); std::uint8_t* const data = stream.take_buffer().release() - sizeof(raw_byte_slice);
new (data) raw_byte_slice{};
storage_.reset(reinterpret_cast<raw_byte_slice*>(data));
}
else
portion_ = nullptr;
} }
byte_slice::byte_slice(byte_slice&& source) noexcept byte_slice::byte_slice(byte_slice&& source) noexcept
@ -205,14 +210,17 @@ namespace epee
byte_slice byte_slice::take_slice(const std::size_t max_bytes) noexcept byte_slice byte_slice::take_slice(const std::size_t max_bytes) noexcept
{ {
byte_slice out{}; byte_slice out{};
std::uint8_t const* const ptr = data();
out.portion_ = {ptr, portion_.remove_prefix(max_bytes)};
if (portion_.empty()) if (max_bytes)
out.storage_ = std::move(storage_); // no atomic inc/dec {
else std::uint8_t const* const ptr = data();
out = {storage_.get(), out.portion_}; out.portion_ = {ptr, portion_.remove_prefix(max_bytes)};
if (portion_.empty())
out.storage_ = std::move(storage_); // no atomic inc/dec
else
out = {storage_.get(), out.portion_};
}
return out; return out;
} }

View file

@ -667,6 +667,23 @@ TEST(ByteSlice, TakeSlice)
EXPECT_TRUE(boost::range::equal(base_string, slice)); EXPECT_TRUE(boost::range::equal(base_string, slice));
const epee::span<const std::uint8_t> original = epee::to_span(slice); const epee::span<const std::uint8_t> original = epee::to_span(slice);
const epee::byte_slice empty_slice = slice.take_slice(0);
EXPECT_EQ(original.begin(), slice.begin());
EXPECT_EQ(slice.begin(), slice.cbegin());
EXPECT_EQ(original.end(), slice.end());
EXPECT_EQ(slice.end(), slice.cend());
EXPECT_EQ(nullptr, empty_slice.begin());
EXPECT_EQ(nullptr, empty_slice.cbegin());
EXPECT_EQ(nullptr, empty_slice.end());
EXPECT_EQ(nullptr, empty_slice.cend());
EXPECT_EQ(nullptr, empty_slice.data());
EXPECT_TRUE(empty_slice.empty());
EXPECT_EQ(0u, empty_slice.size());
EXPECT_FALSE(slice.empty());
EXPECT_EQ(slice.cbegin(), slice.data());
const epee::byte_slice slice2 = slice.take_slice(remove_size); const epee::byte_slice slice2 = slice.take_slice(remove_size);
EXPECT_EQ(original.begin() + remove_size, slice.begin()); EXPECT_EQ(original.begin() + remove_size, slice.begin());
@ -1061,6 +1078,20 @@ TEST(ByteStream, ToByteSlice)
EXPECT_EQ(nullptr, stream.data()); EXPECT_EQ(nullptr, stream.data());
EXPECT_EQ(nullptr, stream.tellp()); EXPECT_EQ(nullptr, stream.tellp());
EXPECT_TRUE(equal(source, slice)); EXPECT_TRUE(equal(source, slice));
stream = epee::byte_stream{};
stream.reserve(1);
EXPECT_NE(nullptr, stream.data());
EXPECT_NE(nullptr, stream.tellp());
const epee::byte_slice empty_slice{std::move(stream)};
EXPECT_TRUE(empty_slice.empty());
EXPECT_EQ(0u, empty_slice.size());
EXPECT_EQ(nullptr, empty_slice.begin());
EXPECT_EQ(nullptr, empty_slice.cbegin());
EXPECT_EQ(nullptr, empty_slice.end());
EXPECT_EQ(nullptr, empty_slice.cend());
EXPECT_EQ(nullptr, empty_slice.data());
} }
TEST(ToHex, String) TEST(ToHex, String)