mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-05-31 00:05:13 +02:00
Make VectorFormatter support stateful formatters
This commit is contained in:
committed by
Pieter Wuille
parent
3ca574cef0
commit
56dd9f04c7
@@ -613,7 +613,7 @@ BigEndian<I> WrapBigEndian(I& n) { return BigEndian<I>(n); }
|
||||
* as a vector of VarInt-encoded integers.
|
||||
*
|
||||
* V is not required to be an std::vector type. It works for any class that
|
||||
* exposes a value_type, size, reserve, push_back, and const iterators.
|
||||
* exposes a value_type, size, reserve, emplace_back, back, and const iterators.
|
||||
*/
|
||||
template<class Formatter>
|
||||
struct VectorFormatter
|
||||
@@ -621,15 +621,17 @@ struct VectorFormatter
|
||||
template<typename Stream, typename V>
|
||||
void Ser(Stream& s, const V& v)
|
||||
{
|
||||
Formatter formatter;
|
||||
WriteCompactSize(s, v.size());
|
||||
for (const typename V::value_type& elem : v) {
|
||||
s << Using<Formatter>(elem);
|
||||
formatter.Ser(s, elem);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Stream, typename V>
|
||||
void Unser(Stream& s, V& v)
|
||||
{
|
||||
Formatter formatter;
|
||||
v.clear();
|
||||
size_t size = ReadCompactSize(s);
|
||||
size_t allocated = 0;
|
||||
@@ -641,9 +643,8 @@ struct VectorFormatter
|
||||
allocated = std::min(size, allocated + MAX_VECTOR_ALLOCATE / sizeof(typename V::value_type));
|
||||
v.reserve(allocated);
|
||||
while (v.size() < allocated) {
|
||||
typename V::value_type val;
|
||||
s >> Using<Formatter>(val);
|
||||
v.push_back(std::move(val));
|
||||
v.emplace_back();
|
||||
formatter.Unser(s, v.back());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user