mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 20:12:57 +01:00
Merge #13719: Avoid creating a temporary vector for size-prefixed elements
84547fa6d408bdda1685f6d5972232bb19d97a7d Avoid creating a temporary vector for size-prefixed elements (Pieter Wuille) Pull request description: This is a simple improvement to the PSBT serialization code, avoiding the need for temporary vectors everywhere. Tree-SHA512: 9f7243b7169ec8ba00ffad31af03c016ab84e4f76ebac810167f91f5e8008f3827ad59fbcee0cb2bd2334fc26466eb222404af24e7fb6ec040fd78229ebe0fd1
This commit is contained in:
parent
3285e21cfd
commit
089cabbd2d
@ -133,26 +133,24 @@ struct SignatureData {
|
||||
void MergeSignatureData(SignatureData sigdata);
|
||||
};
|
||||
|
||||
// Takes a stream and multiple arguments and serializes them into a vector and then into the stream
|
||||
// Takes a stream and multiple arguments and serializes them as if first serialized into a vector and then into the stream
|
||||
// The resulting output into the stream has the total serialized length of all of the objects followed by all objects concatenated with each other.
|
||||
template<typename Stream, typename... X>
|
||||
void SerializeToVector(Stream& s, const X&... args)
|
||||
{
|
||||
std::vector<unsigned char> ret;
|
||||
CVectorWriter ss(SER_NETWORK, PROTOCOL_VERSION, ret, 0);
|
||||
SerializeMany(ss, args...);
|
||||
s << ret;
|
||||
WriteCompactSize(s, GetSerializeSizeMany(s, args...));
|
||||
SerializeMany(s, args...);
|
||||
}
|
||||
|
||||
// Takes a stream and multiple arguments and unserializes them first as a vector then each object individually in the order provided in the arguments
|
||||
template<typename Stream, typename... X>
|
||||
void UnserializeFromVector(Stream& s, X&... args)
|
||||
{
|
||||
std::vector<unsigned char> data;
|
||||
s >> data;
|
||||
CDataStream ss(data, SER_NETWORK, PROTOCOL_VERSION);
|
||||
UnserializeMany(ss, args...);
|
||||
if (!ss.eof()) {
|
||||
size_t expected_size = ReadCompactSize(s);
|
||||
size_t remaining_before = s.size();
|
||||
UnserializeMany(s, args...);
|
||||
size_t remaining_after = s.size();
|
||||
if (remaining_after + expected_size != remaining_before) {
|
||||
throw std::ios_base::failure("Size of value was not the stated size");
|
||||
}
|
||||
}
|
||||
|
@ -1502,4 +1502,12 @@ size_t GetSerializeSize(const S& s, const T& t)
|
||||
return (CSizeComputer(s.GetType(), s.GetVersion()) << t).size();
|
||||
}
|
||||
|
||||
template <typename S, typename... T>
|
||||
size_t GetSerializeSizeMany(const S& s, const T&... t)
|
||||
{
|
||||
CSizeComputer sc(s.GetType(), s.GetVersion());
|
||||
SerializeMany(sc, t...);
|
||||
return sc.size();
|
||||
}
|
||||
|
||||
#endif // BITCOIN_SERIALIZE_H
|
||||
|
Loading…
Reference in New Issue
Block a user