2
0
mirror of https://github.com/boostorg/redis.git synced 2026-01-19 04:42:09 +00:00

Moved implementation of push_back to general_aggregate

This commit is contained in:
Nikolai Vladimirov
2025-07-05 20:18:28 +00:00
committed by Marcelo Zimbres
parent 5444e077f9
commit 1d9f9ab0e3
2 changed files with 28 additions and 19 deletions

View File

@@ -218,7 +218,22 @@ public:
std::string{std::cbegin(nd.value), std::cend(nd.value)} std::string{std::cbegin(nd.value), std::cend(nd.value)}
}; };
break; 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));
} }
} }
}; };

View File

@@ -31,6 +31,15 @@ using response = std::tuple<adapter::result<Ts>...>;
*/ */
using generic_response = adapter::result<std::vector<resp3::node>>; using generic_response = adapter::result<std::vector<resp3::node>>;
/**
* Forward declaration to allow friendship with the template class
* that manages filling of flat_response_value.
*/
namespace adapter::detail {
template <typename Result>
class general_aggregate;
}
struct flat_response_value { struct flat_response_value {
public: public:
/// Reserve capacity for nodes and data storage. /// Reserve capacity for nodes and data storage.
@@ -43,24 +52,6 @@ public:
std::vector<resp3::offset_node> const& view() const { return view_; } std::vector<resp3::offset_node> const& view() const { return view_; }
std::vector<resp3::offset_node>& view() { return view_; } std::vector<resp3::offset_node>& view() { return view_; }
template <typename String>
void push_back(const resp3::basic_node<String>& 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() void set_view()
{ {
for (auto& node : view_) { for (auto& node : view_) {
@@ -72,6 +63,9 @@ public:
} }
private: private:
template <typename T>
friend class adapter::detail::general_aggregate;
std::string data_; std::string data_;
std::vector<resp3::offset_node> view_; std::vector<resp3::offset_node> view_;
}; };