Skip to content

Commit

Permalink
Improve STVector256 deserialization
Browse files Browse the repository at this point in the history
  • Loading branch information
nbougalis committed Jul 18, 2022
1 parent 47ccd0b commit 9eb303f
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 16 deletions.
7 changes: 4 additions & 3 deletions src/ripple/basics/Slice.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ class Slice
std::size_t size_ = 0;

public:
using const_iterator = std::uint8_t const*;
using value_type = std::uint8_t;
using const_iterator = value_type const*;

/** Default constructed Slice has length 0. */
Slice() noexcept = default;
Expand All @@ -75,13 +76,13 @@ class Slice
This may be zero for an empty range.
*/
/** @{ */
std::size_t
[[nodiscard]] std::size_t
size() const noexcept
{
return size_;
}

std::size_t
[[nodiscard]] std::size_t
length() const noexcept
{
return size_;
Expand Down
6 changes: 6 additions & 0 deletions src/ripple/basics/base_uint.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#define RIPPLE_BASICS_BASE_UINT_H_INCLUDED

#include <ripple/basics/Expected.h>
#include <ripple/basics/Slice.h>
#include <ripple/basics/contract.h>
#include <ripple/basics/hardened_hash.h>
#include <ripple/basics/strHex.h>
Expand Down Expand Up @@ -56,6 +57,11 @@ struct is_contiguous_container<
{
};

template <>
struct is_contiguous_container<Slice> : std::true_type
{
};

} // namespace detail

/** Integers of any length that is a multiple of 32-bits
Expand Down
26 changes: 13 additions & 13 deletions src/ripple/protocol/impl/STVector256.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,19 @@ namespace ripple {

STVector256::STVector256(SerialIter& sit, SField const& name) : STBase(name)
{
Blob data = sit.getVL();
auto const count = data.size() / (256 / 8);
mValue.reserve(count);
Blob::iterator begin = data.begin();
unsigned int uStart = 0;
for (unsigned int i = 0; i != count; i++)
{
unsigned int uEnd = uStart + (256 / 8);
// This next line could be optimized to construct a default
// uint256 in the vector and then copy into it
mValue.push_back(uint256(Blob(begin + uStart, begin + uEnd)));
uStart = uEnd;
}
auto const slice = sit.getSlice(sit.getVLDataLength());

if (slice.size() % uint256::size() != 0)
Throw<std::runtime_error>(
"Bad serialization for STVector256: " +
std::to_string(slice.size()));

auto const cnt = slice.size() / uint256::size();

mValue.reserve(cnt);

for (std::size_t i = 0; i != cnt; ++i)
mValue.emplace_back(slice.substr(i * uint256::size(), uint256::size()));
}

STBase*
Expand Down

0 comments on commit 9eb303f

Please sign in to comment.