diff --git a/examples/async_basic.cpp b/examples/async_basic.cpp index 67005c82..b663d4ae 100644 --- a/examples/async_basic.cpp +++ b/examples/async_basic.cpp @@ -32,7 +32,7 @@ example(net::ip::tcp::socket& socket, for (;;) { auto const t = co_await cs.async_consume(socket, requests, resp, net::use_awaitable); - if (t == resp3::type::flat_push) { + if (t == resp3::type::push) { std::cout << "Event: " << "(" << t << ")" << std::endl; continue; } diff --git a/include/aedis/resp3/detail/array_adapter.hpp b/include/aedis/resp3/detail/array_adapter.hpp index b0a7aa54..ea2c1b73 100644 --- a/include/aedis/resp3/detail/array_adapter.hpp +++ b/include/aedis/resp3/detail/array_adapter.hpp @@ -37,7 +37,7 @@ public: { } void select_array(int n) override {add_aggregate(n, type::flat_array);} - void select_push(int n) override {add_aggregate(n, type::flat_push);} + void select_push(int n) override {add_aggregate(n, type::push);} void select_set(int n) override {add_aggregate(n, type::set);} void select_map(int n) override {add_aggregate(n, type::map);} void select_attribute(int n) override {add_aggregate(n, type::flat_attribute);} diff --git a/include/aedis/resp3/detail/doublean_adapter.hpp b/include/aedis/resp3/detail/doublean_adapter.hpp deleted file mode 100644 index 9ad84dfc..00000000 --- a/include/aedis/resp3/detail/doublean_adapter.hpp +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2019 - 2021 Marcelo Zimbres Silva (mzimbres at gmail dot com) - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ - -#pragma once - -#include -#include - -namespace aedis { namespace resp3 { namespace detail { - -struct doublean_adapter : public response_adapter_base { - doublean_type* result = nullptr; - - doublean_adapter(doublean_type* p) : result(p) {} - - void on_double(std::string_view s) override - { *result = s; } -}; - -} // detail -} // resp3 -} // aedis diff --git a/include/aedis/resp3/impl/response.ipp b/include/aedis/resp3/impl/response.ipp index 8748f30e..3810afc5 100644 --- a/include/aedis/resp3/impl/response.ipp +++ b/include/aedis/resp3/impl/response.ipp @@ -13,9 +13,6 @@ namespace aedis { namespace resp3 { response_adapter_base* response::select_adapter(type type, command cmd, std::string const&) { - if (type == type::flat_push) - return &flat_push_adapter_; - if (cmd == command::exec) { array_.resize(0); array_adapter_.clear(); @@ -23,8 +20,7 @@ response::select_adapter(type type, command cmd, std::string const&) } switch (type) { - case type::set: - case type::map: + case type::doublean: case type::simple_string: case type::blob_string: case type::simple_error: @@ -32,6 +28,9 @@ response::select_adapter(type type, command cmd, std::string const&) case type::big_number: case type::verbatim_string: case type::streamed_string_part: + case type::set: + case type::map: + case type::push: { array_.resize(0); array_adapter_.clear(); @@ -40,7 +39,6 @@ response::select_adapter(type type, command cmd, std::string const&) case type::flat_attribute: return &flat_attribute_adapter_; case type::flat_array: return &flat_array_adapter_; case type::number: return &number_adapter_; - case type::doublean: return &doublean_adapter_; case type::boolean: return &boolean_adapter_; case type::null: return &ignore_adapter_; default: { diff --git a/include/aedis/resp3/impl/type.ipp b/include/aedis/resp3/impl/type.ipp index d3b59990..84dd4540 100644 --- a/include/aedis/resp3/impl/type.ipp +++ b/include/aedis/resp3/impl/type.ipp @@ -26,7 +26,7 @@ std::string to_string(type t) switch (t) { EXPAND_TYPE_CASE(array); EXPAND_TYPE_CASE(flat_array); - EXPAND_TYPE_CASE(flat_push); + EXPAND_TYPE_CASE(push); EXPAND_TYPE_CASE(set); EXPAND_TYPE_CASE(map); EXPAND_TYPE_CASE(flat_attribute); @@ -60,7 +60,7 @@ type to_type(char c) case '(': return type::big_number; case '+': return type::simple_string; case '_': return type::null; - case '>': return type::flat_push; + case '>': return type::push; case '~': return type::set; case '*': return type::flat_array; case '|': return type::flat_attribute; diff --git a/include/aedis/resp3/read.hpp b/include/aedis/resp3/read.hpp index b9dac1d4..fc590164 100644 --- a/include/aedis/resp3/read.hpp +++ b/include/aedis/resp3/read.hpp @@ -260,7 +260,7 @@ struct consumer_op { yield { - if (m_type == type::flat_push) { + if (m_type == type::push) { auto* adapter = resp.select_adapter(m_type, command::unknown, {}); async_read_one(socket, buffer, *adapter, std::move(self)); } else { @@ -277,7 +277,7 @@ struct consumer_op { yield self.complete(ec, m_type); - if (m_type != type::flat_push) + if (m_type != type::push) requests.front().ids.pop(); } while (!std::empty(requests.front().ids)); diff --git a/include/aedis/resp3/response.hpp b/include/aedis/resp3/response.hpp index f5ac97c1..cb13d310 100644 --- a/include/aedis/resp3/response.hpp +++ b/include/aedis/resp3/response.hpp @@ -14,7 +14,6 @@ #include #include #include -#include #include namespace aedis { namespace resp3 { @@ -30,30 +29,27 @@ private: flat_array_type flat_attribute_; detail::basic_flat_array_adapter flat_attribute_adapter_{&flat_attribute_}; - flat_array_type flat_push_; - detail::basic_flat_array_adapter flat_push_adapter_{&flat_push_}; - boolean_type boolean_; detail::boolean_adapter boolean_adapter_{&boolean_}; - doublean_type doublean_; - detail::doublean_adapter doublean_adapter_{&doublean_}; - number_type number_; detail::number_adapter number_adapter_{&number_}; detail::ignore_adapter ignore_adapter_; public: + virtual ~response() = default; + + virtual response_adapter_base* - select_adapter(resp3::type type, command cmd, std::string const& key); + select_adapter( + resp3::type type, + command cmd = command::unknown, + std::string const& key = ""); auto const& array() const noexcept {return array_;} auto& array() noexcept {return array_;} - auto const& flat_push() const noexcept {return flat_push_;} - auto& flat_push() noexcept {return flat_push_;} - auto const& flat_array() const noexcept {return flat_array_;} auto& flat_array() noexcept {return flat_array_;} diff --git a/include/aedis/resp3/type.hpp b/include/aedis/resp3/type.hpp index 8185ccde..6e376ac5 100644 --- a/include/aedis/resp3/type.hpp +++ b/include/aedis/resp3/type.hpp @@ -16,7 +16,7 @@ namespace aedis { namespace resp3 { enum class type { array , flat_array -, flat_push +, push , set , map , flat_attribute @@ -43,11 +43,8 @@ using basic_flat_array = std::vector; using flat_array_type = basic_flat_array; using flat_array_int_type = basic_flat_array; -using flat_push_type = std::vector; - using number_type = long long int; using boolean_type = bool; -using doublean_type = std::string; struct node { /// The number of children node is parent of. diff --git a/tests/general.cpp b/tests/general.cpp index d52404e6..9a41a242 100644 --- a/tests/general.cpp +++ b/tests/general.cpp @@ -23,7 +23,6 @@ namespace aedis { namespace resp3 { using flat_array_adapter = detail::basic_flat_array_adapter; using flat_array_int_adapter = detail::basic_flat_array_adapter; -using flat_push_adapter = detail::basic_flat_array_adapter; } // resp3 } // aedis @@ -131,10 +130,30 @@ test_general(net::ip::tcp::resolver::results_type const& res) auto const t = co_await cs.async_consume(socket, requests, resp, net::use_awaitable); - if (t == resp3::type::flat_push) { + if (t == resp3::type::push) { switch (push_counter) { - case 0: check_equal(resp.flat_push(), {"subscribe", "channel", "1"}, "push (value1)"); break; - case 1: check_equal(resp.flat_push(), {"message", "channel", "message"}, "push (value2)"); break; + case 0: + { + resp3::array_type expected + { {3UL, 0UL, resp3::type::push, {}} + , {1UL, 1UL, resp3::type::blob_string, {"subscribe"}} + , {1UL, 1UL, resp3::type::blob_string, {"channel"}} + , {1UL, 1UL, resp3::type::number, {"1"}} + }; + + check_equal(resp.array(), expected, "push (value1)"); break; + } break; + case 1: + { + resp3::array_type expected + { {3UL, 0UL, resp3::type::push, {}} + , {1UL, 1UL, resp3::type::blob_string, {"message"}} + , {1UL, 1UL, resp3::type::blob_string, {"channel"}} + , {1UL, 1UL, resp3::type::blob_string, {"message"}} + }; + + check_equal(resp.array(), expected, "push (value2)"); break; + } break; default: std::cout << "ERROR: unexpected push event." << std::endl; } ++push_counter; @@ -296,7 +315,6 @@ test_general(net::ip::tcp::resolver::results_type const& res) default: { std::cout << "Error: " << t << " " << id.first << std::endl; } } - resp.flat_push().clear(); resp.array().clear(); } } @@ -667,28 +685,34 @@ net::awaitable test_floating_point() { std::string cmd {",1.23\r\n"}; test_tcp_socket ts {cmd}; - resp3::doublean_type buffer; - resp3::detail::doublean_adapter res{&buffer}; - co_await async_read_one(ts, buf, res); - check_equal(buffer, {"1.23"}, "double"); + resp3::response resp; + auto* adapter = resp.select_adapter(resp3::type::doublean); + co_await async_read_one(ts, buf, *adapter); + resp3::array_type expected + { {1UL, 0UL, resp3::type::doublean, {"1.23"}} }; + check_equal(resp.array(), expected, "double"); } { std::string cmd {",inf\r\n"}; test_tcp_socket ts {cmd}; - resp3::doublean_type buffer; - resp3::detail::doublean_adapter res{&buffer}; - co_await async_read_one(ts, buf, res); - check_equal(buffer, {"inf"}, "double (inf)"); + resp3::response resp; + auto* adapter = resp.select_adapter(resp3::type::doublean); + co_await async_read_one(ts, buf, *adapter); + resp3::array_type expected + { {1UL, 0UL, resp3::type::doublean, {"inf"}} }; + check_equal(resp.array(), expected, "double (inf)"); } { std::string cmd {",-inf\r\n"}; test_tcp_socket ts {cmd}; - resp3::doublean_type buffer; - resp3::detail::doublean_adapter res{&buffer}; - co_await async_read_one(ts, buf, res); - check_equal(buffer, {"-inf"}, "double (-inf)"); + resp3::response resp; + auto* adapter = resp.select_adapter(resp3::type::doublean); + co_await async_read_one(ts, buf, *adapter); + resp3::array_type expected + { {1UL, 0UL, resp3::type::doublean, {"-inf"}} }; + check_equal(resp.array(), expected, "double (-inf)"); } }