diff --git a/serialization_visitors.hh b/serialization_visitors.hh index e2857cda9b..4c59aa4186 100644 --- a/serialization_visitors.hh +++ b/serialization_visitors.hh @@ -115,4 +115,42 @@ inline frame start_frame(seastar::measuring_ou return { }; } +template<> +class place_holder { + seastar::simple_output_stream _substream; +public: + place_holder(seastar::simple_output_stream substream) + : _substream(substream) { } + + void set(seastar::simple_output_stream& out, size_type v) { + serialize(_substream, v); + } +}; + +template<> +class frame : public place_holder { + char* _start; +public: + frame(seastar::simple_output_stream ph, char* start) + : place_holder(ph), _start(start) { } + + void end(seastar::simple_output_stream& out) { + set(out, out.begin() - _start); + } +}; + +inline place_holder start_place_holder(seastar::simple_output_stream& out) { + return { out.write_substream(sizeof(size_type)) }; +} + +inline frame start_frame(seastar::simple_output_stream& out) { + auto start = out.begin(); + auto substream = out.write_substream(sizeof(size_type)); + { + auto sstr = substream; + serialize(sstr, size_type(0)); + } + return frame(substream, start); +} + }