diff --git a/include/boost/redis/adapter/detail/adapters.hpp b/include/boost/redis/adapter/detail/adapters.hpp index 5113c41e..554a5a23 100644 --- a/include/boost/redis/adapter/detail/adapters.hpp +++ b/include/boost/redis/adapter/detail/adapters.hpp @@ -218,7 +218,22 @@ public: std::string{std::cbegin(nd.value), std::cend(nd.value)} }; break; - default: result_->value().push_back(nd); + default: + auto& data = result_->value().data_; + + resp3::offset_string offset_string; + offset_string.offset = data.size(); + offset_string.size = nd.value.size(); + + data.append(nd.value.data(), nd.value.size()); + + resp3::offset_node new_node; + new_node.data_type = nd.data_type; + new_node.aggregate_size = nd.aggregate_size; + new_node.depth = nd.depth; + new_node.value = std::move(offset_string); + + result_->value().view_.push_back(std::move(new_node)); } } }; diff --git a/include/boost/redis/response.hpp b/include/boost/redis/response.hpp index f236faf3..cd664e71 100644 --- a/include/boost/redis/response.hpp +++ b/include/boost/redis/response.hpp @@ -31,6 +31,15 @@ using response = std::tuple...>; */ using generic_response = adapter::result>; +/** + * Forward declaration to allow friendship with the template class + * that manages filling of flat_response_value. + */ +namespace adapter::detail { +template +class general_aggregate; +} + struct flat_response_value { public: /// Reserve capacity for nodes and data storage. @@ -43,24 +52,6 @@ public: std::vector const& view() const { return view_; } std::vector& view() { return view_; } - template - void push_back(const resp3::basic_node& nd) - { - resp3::offset_string offset_string; - offset_string.offset = data_.size(); - offset_string.size = nd.value.size(); - - data_.append(nd.value.data(), nd.value.size()); - - resp3::offset_node new_node; - new_node.data_type = nd.data_type; - new_node.aggregate_size = nd.aggregate_size; - new_node.depth = nd.depth; - new_node.value = std::move(offset_string); - - view_.push_back(std::move(new_node)); - } - void set_view() { for (auto& node : view_) { @@ -72,6 +63,9 @@ public: } private: + template + friend class adapter::detail::general_aggregate; + std::string data_; std::vector view_; };