From 8b6b9be3f0106f2e7ec6596f93384ef6ba86e407 Mon Sep 17 00:00:00 2001 From: Aleksey Loginov Date: Thu, 25 Jan 2024 21:36:21 +0300 Subject: [PATCH 1/2] fix --- src/rpp/rpp/observables/observable.hpp | 12 ++++++------ src/rpp/rpp/observers/fwd.hpp | 10 ++++++---- src/rpp/rpp/operators/subscribe.hpp | 2 +- src/tests/utils/mock_observer.hpp | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/rpp/rpp/observables/observable.hpp b/src/rpp/rpp/observables/observable.hpp index 2a01affcc..5f702221f 100644 --- a/src/rpp/rpp/observables/observable.hpp +++ b/src/rpp/rpp/observables/observable.hpp @@ -80,7 +80,7 @@ class observable if constexpr (details::observers::has_disposable_strategy) subscribe(rpp::observer>{std::forward(observer_strategy)}); else - subscribe(rpp::observer, typename expected_disposable_strategy::disposable_strategy>>{std::forward(observer_strategy)}); + subscribe(rpp::observer_with_disposable, typename expected_disposable_strategy::disposable_strategy>{std::forward(observer_strategy)}); } /** @@ -109,7 +109,7 @@ class observable composite_disposable_wrapper subscribe(const composite_disposable_wrapper& d, observer&& obs) const { if (!d.is_disposed()) - m_strategy.subscribe(observer>>{d, std::move(obs)}); + m_strategy.subscribe(observer_with_disposable>{d, std::move(obs)}); return d; } @@ -125,7 +125,7 @@ class observable requires (!constraint::observer) composite_disposable_wrapper subscribe(const composite_disposable_wrapper& d, ObserverStrategy&& observer_strategy) const { - subscribe(rpp::observer>>{d, std::forward(observer_strategy)}); + subscribe(observer_with_disposable>{d, std::forward(observer_strategy)}); return d; } @@ -186,9 +186,9 @@ class observable { using strategy = rpp::details::observers::lambda_strategy, std::decay_t, std::decay_t>; - subscribe(rpp::observer>{std::forward(on_next), - std::forward(on_error), - std::forward(on_completed)}); + subscribe(observer_with_disposable{std::forward(on_next), + std::forward(on_error), + std::forward(on_completed)}); } /** diff --git a/src/rpp/rpp/observers/fwd.hpp b/src/rpp/rpp/observers/fwd.hpp index 80e6701b9..5da5cd2da 100644 --- a/src/rpp/rpp/observers/fwd.hpp +++ b/src/rpp/rpp/observers/fwd.hpp @@ -80,9 +80,6 @@ struct with_disposable_strategy static void set_upstream(const disposable_wrapper&) noexcept; static bool is_disposed() noexcept; }; - -template -using with_external_disposable = with_disposable_strategy; } namespace rpp @@ -90,6 +87,11 @@ namespace rpp template Strategy> class observer; +template Strategy, + rpp::details::observers::constraint::disposable_strategy DisposableStrategy = rpp::details::observers::external_disposable_strategy> +using observer_with_disposable = observer>; + template class dynamic_observer; @@ -107,7 +109,7 @@ template OnNext, std::invoca using lambda_observer = observer>; template OnNext, std::invocable OnError, std::invocable<> OnCompleted> -using lambda_observer_with_disposable = observer>>; +using lambda_observer_with_disposable = observer_with_disposable>; /** * @brief Constructs observer specialized with passed callbacks. Most easiesest way to construct observer "on the fly" via lambdas and etc. diff --git a/src/rpp/rpp/operators/subscribe.hpp b/src/rpp/rpp/operators/subscribe.hpp index 4396b7bca..a3709e289 100644 --- a/src/rpp/rpp/operators/subscribe.hpp +++ b/src/rpp/rpp/operators/subscribe.hpp @@ -90,7 +90,7 @@ class subscribe_t Strategy> rpp::composite_disposable_wrapper operator()(const rpp::observable& observable) && { - observable.subscribe(observer>>{m_disposable, std::move(m_observer)}); + observable.subscribe(observer_with_disposable>{m_disposable, std::move(m_observer)}); return m_disposable; } diff --git a/src/tests/utils/mock_observer.hpp b/src/tests/utils/mock_observer.hpp index a26c1f08b..7bc7af059 100644 --- a/src/tests/utils/mock_observer.hpp +++ b/src/tests/utils/mock_observer.hpp @@ -50,7 +50,7 @@ class mock_observer_strategy final std::vector get_received_values() const {return m_state->vals; } auto get_observer() const {return rpp::observer>{*this}; } - auto get_observer(rpp::composite_disposable_wrapper d) const {return rpp::observer>>{std::move(d), *this}; } + auto get_observer(rpp::composite_disposable_wrapper d) const {return rpp::observer_with_disposable>{std::move(d), *this}; } private: struct State From 997c06bcb15978bc398964e52f1e65c560b03ca6 Mon Sep 17 00:00:00 2001 From: Aleksey Loginov Date: Thu, 25 Jan 2024 21:59:21 +0300 Subject: [PATCH 2/2] simplify --- src/rpp/rpp/observers/observer.hpp | 35 +++++++++++++++++++----------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/rpp/rpp/observers/observer.hpp b/src/rpp/rpp/observers/observer.hpp index 831abccf3..56225ea22 100644 --- a/src/rpp/rpp/observers/observer.hpp +++ b/src/rpp/rpp/observers/observer.hpp @@ -36,14 +36,6 @@ class observer_impl { } - template - requires (constraint::is_constructible_from && !rpp::constraint::variadic_decayed_same_as, Args...>) - explicit observer_impl(Args&&... args) - : m_strategy{std::forward(args)...} - , m_disposable{} - { - } - observer_impl(const observer_impl&) = default; observer_impl(observer_impl&&) noexcept = default; @@ -180,10 +172,19 @@ template Stra class observer final : public details::observer_impl> { public: + using DisposableStrategy = details::observers::deduce_disposable_strategy_t; + using Base = details::observer_impl>; + template - requires (!constraint::variadic_decayed_same_as, Args...> && constraint::is_constructible_from) + requires constraint::is_constructible_from + explicit observer(DisposableStrategy strategy, Args&&... args) + : Base{std::move(strategy), std::forward(args)...} + {} + + template + requires (constraint::is_constructible_from && !rpp::constraint::variadic_decayed_same_as) explicit observer(Args&&... args) - : details::observer_impl>{std::forward(args)...} + : Base{DisposableStrategy{}, std::forward(args)...} { } @@ -204,10 +205,18 @@ class observer { public: + using Base = details::observer_impl; + + template + requires constraint::is_constructible_from + explicit observer(DisposableStrategy strategy, Args&&... args) + : Base{std::move(strategy), std::forward(args)...} + {} + template - requires (!rpp::constraint::variadic_decayed_same_as> , Args...>) + requires (constraint::is_constructible_from && !rpp::constraint::variadic_decayed_same_as) explicit observer(Args&&... args) - : details::observer_impl{std::forward(args)...} + : Base{DisposableStrategy{}, std::forward(args)...} { } @@ -231,7 +240,7 @@ class observer> template TStrategy> requires (!std::same_as>) explicit observer(observer&& other) - : details::observer_impl, details::observers::none_disposable_strategy>{std::move(other)} + : details::observer_impl, details::observers::none_disposable_strategy>{details::observers::none_disposable_strategy{}, std::move(other)} { }