mirror of
https://github.com/monero-project/monero.git
synced 2024-12-23 03:59:33 +00:00
Fixed bugs for take_slice and byte_stream->byte_slice
This commit is contained in:
parent
77a008f714
commit
cc40ce1b3f
2 changed files with 48 additions and 9 deletions
|
@ -172,11 +172,16 @@ 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())
|
||||||
|
{
|
||||||
|
if (stream.size())
|
||||||
{
|
{
|
||||||
std::uint8_t* const data = stream.take_buffer().release() - sizeof(raw_byte_slice);
|
std::uint8_t* const data = stream.take_buffer().release() - sizeof(raw_byte_slice);
|
||||||
new (data) raw_byte_slice{};
|
new (data) raw_byte_slice{};
|
||||||
storage_.reset(reinterpret_cast<raw_byte_slice*>(data));
|
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
|
||||||
: storage_(std::move(source.storage_)), portion_(source.portion_)
|
: storage_(std::move(source.storage_)), portion_(source.portion_)
|
||||||
|
@ -205,6 +210,9 @@ 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{};
|
||||||
|
|
||||||
|
if (max_bytes)
|
||||||
|
{
|
||||||
std::uint8_t const* const ptr = data();
|
std::uint8_t const* const ptr = data();
|
||||||
out.portion_ = {ptr, portion_.remove_prefix(max_bytes)};
|
out.portion_ = {ptr, portion_.remove_prefix(max_bytes)};
|
||||||
|
|
||||||
|
@ -212,7 +220,7 @@ namespace epee
|
||||||
out.storage_ = std::move(storage_); // no atomic inc/dec
|
out.storage_ = std::move(storage_); // no atomic inc/dec
|
||||||
else
|
else
|
||||||
out = {storage_.get(), out.portion_};
|
out = {storage_.get(), out.portion_};
|
||||||
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue