diff --git a/examples/async.cpp b/examples/async.cpp index df679ea2..aed707eb 100644 --- a/examples/async.cpp +++ b/examples/async.cpp @@ -43,7 +43,7 @@ net::awaitable example1() resp::buffer buffer; for (;;) { - resp::response res; + resp::response_vector res; co_await resp::async_read(socket, buffer, res); print(res.result); } @@ -65,7 +65,7 @@ net::awaitable example2() co_await async_write(socket, buffer(p.payload)); resp::buffer buffer; for (;;) { - resp::response res; + resp::response_vector res; co_await resp::async_read(socket, buffer, res); print(res.result); } @@ -84,36 +84,65 @@ net::awaitable example3() resp::pipeline p; p.flushall(); p.rpush("key", {1, 2, 3}); - p.sadd("set", std::set{1, 2, 3}); + p.sadd("set", std::set{3, 4, 5}); p.lrange("key"); p.lrange("key"); p.lrange("key"); + p.smembers("set"); + p.scard("set"); + p.quit(); co_await async_write(socket, buffer(p.payload)); resp::buffer buffer; - resp::response res1; - co_await resp::async_read(socket, buffer, res1); - co_await resp::async_read(socket, buffer, res1); - co_await resp::async_read(socket, buffer, res1); + { // flushall + resp::response_string res; + co_await resp::async_read(socket, buffer, res); + std::cout << res.result << std::endl; + } - resp::response_list res2; - co_await resp::async_read(socket, buffer, res2); - print(res2.result); + { // rpush + resp::response_int res; + co_await resp::async_read(socket, buffer, res); + std::cout << res.result << std::endl; + } - resp::response_list res3; - co_await resp::async_read(socket, buffer, res3); - print(res3.result); + { // sadd + resp::response_int res; + co_await resp::async_read(socket, buffer, res); + std::cout << res.result << std::endl; + } - resp::response_list res5; - co_await resp::async_read(socket, buffer, res5); - print(res5.result); + { // lrange + resp::response_list res; + co_await resp::async_read(socket, buffer, res); + print(res.result); + } - std::cout << "aaa" << std::endl; - resp::response_set res6; - co_await resp::async_read(socket, buffer, res6); - print(res6.result); + { // lrange + resp::response_list res; + co_await resp::async_read(socket, buffer, res); + print(res.result); + } + + { // lrange + resp::response_list res; + co_await resp::async_read(socket, buffer, res); + print(res.result); + } + + { // smembers + resp::response_set res; + co_await resp::async_read(socket, buffer, res); + print(res.result); + } + + { // sdiff + //resp::response_array res; + //co_await resp::async_read(socket, buffer, res); + //std::cout << res.result << std::endl; + } } int main() diff --git a/examples/sync.cpp b/examples/sync.cpp index e9d7d3c8..d7663888 100644 --- a/examples/sync.cpp +++ b/examples/sync.cpp @@ -27,7 +27,7 @@ void sync_example1() net::write(socket, buffer(p.payload)); resp::buffer buffer; - resp::response res; + resp::response_vector res; resp::read(socket, buffer, res); print(res.result); } @@ -53,7 +53,7 @@ void sync_example2() resp::buffer buffer; for (;;) { boost::system::error_code ec; - resp::response res; + resp::response_vector res; resp::read(socket, buffer, res, ec); if (ec) { std::cerr << ec.message() << std::endl; diff --git a/include/aedis/aedis.hpp b/include/aedis/aedis.hpp index c4cd1d96..bf1d18c7 100644 --- a/include/aedis/aedis.hpp +++ b/include/aedis/aedis.hpp @@ -97,6 +97,25 @@ struct response_list : response_throw { } }; +template +struct response_int : response_throw { + T result; + void on_number(std::string_view s) override + { from_string_view(s, result); } +}; + +template< + class CharT, + class Traits = std::char_traits, + class Allocator = std::allocator> +struct response_basic_string : response_throw { + std::basic_string result; + void on_simple_string(std::string_view s) + { from_string_view(s, result); } +}; + +using response_string = response_basic_string; + template< class Key, class Compare = std::less, @@ -113,40 +132,41 @@ struct response_set : response_throw { } }; -// General purpose response. Copies the string reponses in the result -// vector. -struct response_vector { +template +struct response_vector : response_throw { private: void add(std::string_view s = {}) - { result.emplace_back(s.data(), std::size(s)); } + { + T r; + from_string_view(s, r); + result.emplace_back(std::move(r)); + } public: - std::vector result; + std::vector result; void clear() { result.clear(); } auto size() const noexcept { return std::size(result); } - void select_array(int n) { } - void select_push(int n) { } - void select_set(int n) { } - void select_map(int n) { } - void select_attribute(int n) { } + void select_array(int n) override { } + void select_push(int n) override { } + void select_set(int n) override { } + void select_map(int n) override { } + void select_attribute(int n) override { } - void on_simple_string(std::string_view s) { add(s); } - void on_simple_error(std::string_view s) { add(s); } - void on_number(std::string_view s) { add(s); } - void on_double(std::string_view s) { add(s); } - void on_bool(std::string_view s) { add(s); } - void on_big_number(std::string_view s) { add(s); } - void on_null() { add(); } - void on_blob_error(std::string_view s = {}) { add(s); } - void on_verbatim_string(std::string_view s = {}) { add(s); } - void on_blob_string(std::string_view s = {}) { add(s); } - void on_streamed_string_part(std::string_view s = {}) { add(s); } + void on_simple_string(std::string_view s) override { add(s); } + void on_simple_error(std::string_view s) override { add(s); } + void on_number(std::string_view s) override { add(s); } + void on_double(std::string_view s) override { add(s); } + void on_bool(std::string_view s) override { add(s); } + void on_big_number(std::string_view s) override { add(s); } + void on_null() override { add(); } + void on_blob_error(std::string_view s = {}) override { add(s); } + void on_verbatim_string(std::string_view s = {}) override { add(s); } + void on_blob_string(std::string_view s = {}) override { add(s); } + void on_streamed_string_part(std::string_view s = {}) override { add(s); } }; -using response = response_vector; - // Converts a decimal number in ascii format to an integer. inline std::size_t length(char const* p) @@ -668,7 +688,7 @@ public: auto psubscribe(std::initializer_list l) { - std::initializer_list dummy; + std::initializer_list dummy = {}; resp::assemble(payload, "PSUBSCRIBE", l, std::cbegin(dummy), std::cend(dummy)); } @@ -753,7 +773,7 @@ public: max_str = std::to_string(max); auto par = {std::to_string(min) , max_str}; - resp::assemble(payload, "zrangebyscore", {key}, std::cbegin(par), std::cend(par)); + resp::assemble(payload, "ZRANGEBYSCORE", {key}, std::cbegin(par), std::cend(par)); } auto zremrangebyscore(std::string const& key, int score) @@ -792,6 +812,15 @@ public: using std::cend; sadd(key, cbegin(r), cend(r)); } + + auto smembers(std::string const& key) + { resp::assemble(payload, "SMEMBERS", key); } + + auto scard(std::string const& key) + { resp::assemble(payload, "SCARD", key); } + + auto scard(std::string const& key, std::initializer_list l) + { resp::assemble(payload, "SDIFF", {key}, std::cbegin(l), std::cend(l)); } }; } diff --git a/tests/general.cpp b/tests/general.cpp index e7d79903..a0636781 100644 --- a/tests/general.cpp +++ b/tests/general.cpp @@ -92,7 +92,7 @@ net::awaitable test_list(int version) resp::buffer buffer; for (auto const& o : r) { - resp::response res; + resp::response_vector res; co_await resp::async_read(socket, buffer, res); check_equal(res.result, o.first, o.second); } @@ -157,7 +157,7 @@ net::awaitable test_set(int version) resp::buffer buffer; for (auto const& o : r) { - resp::response res; + resp::response_vector res; co_await resp::async_read(socket, buffer, res); check_equal(res.result, o.first, o.second); } @@ -216,7 +216,7 @@ net::awaitable offline() resp::buffer buffer; for (auto const& e : payloads) { test_tcp_socket ts {e.first}; - resp::response res; + resp::response_vector res; co_await resp::async_read(ts, buffer, res); if (e.second != res.result) { std::cout