From 60c0d7dac7702e17b49d82a9ec9302d455e4d95c Mon Sep 17 00:00:00 2001 From: Marcelo Zimbres Date: Sun, 24 Oct 2021 20:30:35 +0200 Subject: [PATCH] Adds variadics to compose commands without range. --- include/aedis/resp3/detail/composer.hpp | 6 ++++ include/aedis/resp3/request.hpp | 47 +++++++++---------------- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/include/aedis/resp3/detail/composer.hpp b/include/aedis/resp3/detail/composer.hpp index 10077762..bba3fad4 100644 --- a/include/aedis/resp3/detail/composer.hpp +++ b/include/aedis/resp3/detail/composer.hpp @@ -95,6 +95,12 @@ void assemble(std::string& to, std::string_view cmd, Range1 const& range1, Range detail::assemble(to, cmd, cbegin(range1), cend(range1), cbegin(range2), cend(range2)); } +template +constexpr decltype(auto) front(Tp&& t, Us&&...) noexcept +{ + return std::forward(t); +} + } // detail } // resp3 } // aedis diff --git a/include/aedis/resp3/request.hpp b/include/aedis/resp3/request.hpp index de8fd0dc..c500ec8d 100644 --- a/include/aedis/resp3/request.hpp +++ b/include/aedis/resp3/request.hpp @@ -54,41 +54,26 @@ public: elements = {}; } - void push(command c) + template + void push(command cmd, Ts const&... args) { - detail::add_header(payload, 1); - detail::add_bulk(payload, as_string(c)); - elements.emplace(c, std::string{}); - } + // TODO: Calculate the size of any pair or tuple like type to + // use in the header size. - template - void push(command c, T const& p1) - { - detail::add_header(payload, 2); - detail::add_bulk(payload, as_string(c)); - detail::add_bulk(payload, p1); - elements.emplace(c, std::string{p1}); - } + auto constexpr pack_size = sizeof...(Ts); + detail::add_header(payload, 1 + pack_size); - template - void push(command c, T1 const& p1, T2 const& p2) - { - detail::add_header(payload, 3); - detail::add_bulk(payload, as_string(c)); - detail::add_bulk(payload, p1); - detail::add_bulk(payload, p2); - elements.emplace(c, std::string{p1}); - } + // TODO: as_string is not a good idea, better to_string. + detail::add_bulk(payload, as_string(cmd)); + (detail::add_bulk(payload, args), ...); - template - void push(command c, T1 const& p1, T2 const& p2, T3 const& p3) - { - detail::add_header(payload, 4); - detail::add_bulk(payload, as_string(c)); - detail::add_bulk(payload, p1); - detail::add_bulk(payload, p2); - detail::add_bulk(payload, p3); - elements.emplace(c, std::string{p1}); + // TODO: Do not assume the front is convertible to a string. + // TODO: Is it correct to use the front as the key. + std::string_view key; + if constexpr (pack_size != 0) + key = detail::front(args...); + + elements.emplace(cmd, std::string{key}); } template