From 02dfe93ff02fae551422a6352adeb988cf784419 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Sun, 6 Dec 2020 11:46:40 +0100 Subject: [PATCH] Allow deserialization into an existing object We're going to need this for VST3 because we're going to have to explicitly instantiate our interface implementations since they need to be able to perform complicated callbacks. --- src/common/communication/common.h | 35 +++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/common/communication/common.h b/src/common/communication/common.h index 4439d72b..b6409b0e 100644 --- a/src/common/communication/common.h +++ b/src/common/communication/common.h @@ -92,6 +92,8 @@ inline void write_object(Socket& socket, const T& object) { * @param socket The Boost.Asio socket to read from. * @param buffer The buffer to read into. This is useful for sending audio and * chunk data since that can vary in size by a lot. + * @param object The object to serialize into. There are also overrides that + * create a new default initialized `T` * * @return The deserialized object. * @@ -102,7 +104,7 @@ inline void write_object(Socket& socket, const T& object) { * @relates write_object */ template -inline T read_object(Socket& socket, std::vector& buffer) { +inline T read_object(Socket& socket, std::vector& buffer, T& object) { // See the note above on the use of `uint64_t` instead of `size_t` std::array message_length; boost::asio::read(socket, boost::asio::buffer(message_length)); @@ -118,7 +120,6 @@ inline T read_object(Socket& socket, std::vector& buffer) { boost::asio::read(socket, boost::asio::buffer(buffer)); assert(size == actual_size); - T object; auto [_, success] = bitsery::quickDeserialization>>( {buffer.begin(), size}, object); @@ -132,14 +133,40 @@ inline T read_object(Socket& socket, std::vector& buffer) { } /** - * `read_object()` with a small default buffer for convenience. + * `read_object()` into a new default initialized object with an existing + * buffer. + * + * @overload + */ +template +inline T read_object(Socket& socket, std::vector& buffer) { + T object; + return read_object(socket, buffer, object); +} + +/** + * `read_object()` into an existing object a small default + * buffer for convenience. + * + * @overload + */ +template +inline T read_object(Socket& socket, T& object) { + std::vector buffer(64); + return read_object(socket, buffer, object); +} + +/** + * `read_object()` into a new default initialized object with a small default + * buffer for convenience. * * @overload */ template inline T read_object(Socket& socket) { + T object; std::vector buffer(64); - return read_object(socket, buffer); + return read_object(socket, buffer, object); } /**