From e865740abea72bfcbb694f77af05f03e7e7b01a4 Mon Sep 17 00:00:00 2001 From: Tomasz Grabiec Date: Tue, 7 Jul 2015 14:05:53 +0200 Subject: [PATCH] messaging_service: Extract integral reading logic --- message/messaging_service.hh | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/message/messaging_service.hh b/message/messaging_service.hh index b032a49a47..40ca36c2bc 100644 --- a/message/messaging_service.hh +++ b/message/messaging_service.hh @@ -102,6 +102,18 @@ future<> des_frozen_mutation(input_stream& in, frozen_mutation& v); // NOTE: operator(input_stream&, T&) takes a reference to uninitialized // T object and should use placement new in case T is non POD struct serializer { + template + inline future read_integral(input_stream& in) { + static_assert(std::is_integral::value, "T should be integral"); + + return in.read_exactly(sizeof(T)).then([] (temporary_buffer buf) { + if (buf.size() != sizeof(T)) { + throw rpc::closed_error(); + } + return make_ready_future(net::ntoh(*unaligned_cast(buf.get()))); + }); + } + // For integer type template inline auto operator()(output_stream& out, T&& v, std::enable_if_t>::value, void*> = nullptr) { @@ -130,11 +142,7 @@ struct serializer { template inline auto operator()(input_stream& in, std::vector& v) { using size_type = typename std::vector::size_type; - return in.read_exactly(sizeof(size_type)).then([&v, &in, this] (temporary_buffer buf) { - if (buf.size() != sizeof(size_type)) { - throw rpc::closed_error(); - } - size_type c = net::ntoh(*reinterpret_cast*>(buf.get())); + return read_integral(in).then([&v, &in, this] (size_type c) { new (&v) std::vector; v.reserve(c); union U {