Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F12944889
D8743.id26530.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
2 KB
Subscribers
None
D8743.id26530.diff
View Options
diff --git a/src/serialize.h b/src/serialize.h
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -703,6 +703,54 @@
return BigEndian<I>(n);
}
+/**
+ * Formatter to serialize/deserialize vector elements using another formatter
+ *
+ * Example:
+ * struct X {
+ * std::vector<uint64_t> v;
+ * SERIALIZE_METHODS(X, obj) {
+ * READWRITE(Using<VectorFormatter<VarInt>>(obj.v));
+ * }
+ * };
+ * will define a struct that contains a vector of uint64_t, which is serialized
+ * 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.
+ */
+template <class Formatter> struct VectorFormatter {
+ template <typename Stream, typename V> void Ser(Stream &s, const V &v) {
+ WriteCompactSize(s, v.size());
+ for (const typename V::value_type &elem : v) {
+ s << Using<Formatter>(elem);
+ }
+ }
+
+ template <typename Stream, typename V> void Unser(Stream &s, V &v) {
+ v.clear();
+ size_t size = ReadCompactSize(s);
+ size_t allocated = 0;
+ while (allocated < size) {
+ // For DoS prevention, do not blindly allocate as much as the stream
+ // claims to contain. Instead, allocate in 5MiB batches, so that an
+ // attacker actually needs to provide X MiB of data to make us
+ // allocate X+5 Mib.
+ static_assert(sizeof(typename V::value_type) <= MAX_VECTOR_ALLOCATE,
+ "Vector element size too large");
+ 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));
+ }
+ }
+ };
+};
+
/**
* Forward declarations
*/
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Feb 6, 15:54 (16 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5082347
Default Alt Text
D8743.id26530.diff (2 KB)
Attached To
D8743: Add custom vector-element formatter
Event Timeline
Log In to Comment