From 31b54bbe227eb7d25897e59a06be05fc9a632752 Mon Sep 17 00:00:00 2001 From: Aleksey Loginov Date: Tue, 9 Jan 2024 22:51:18 +0300 Subject: [PATCH 1/4] fix dynamic --- .../rpp/observables/dynamic_observable.hpp | 13 ++++++-- src/rpp/rpp/observers/dynamic_observer.hpp | 31 ++++++++++++++++++- src/rpp/rpp/observers/fwd.hpp | 10 +----- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/rpp/rpp/observables/dynamic_observable.hpp b/src/rpp/rpp/observables/dynamic_observable.hpp index 614c39814..0bfa478cf 100644 --- a/src/rpp/rpp/observables/dynamic_observable.hpp +++ b/src/rpp/rpp/observables/dynamic_observable.hpp @@ -10,7 +10,7 @@ #pragma once #include - +#include #include #include @@ -87,7 +87,16 @@ namespace rpp */ template class dynamic_observable : public observable> { + using base = observable>; public: - using observable>::observable; + using base::base; + + explicit dynamic_observable(base&& b) + : base{std::move(b)} + {} + + explicit dynamic_observable(const base& b) + : base{b} + {} }; } \ No newline at end of file diff --git a/src/rpp/rpp/observers/dynamic_observer.hpp b/src/rpp/rpp/observers/dynamic_observer.hpp index b72190547..3e41c4cd9 100644 --- a/src/rpp/rpp/observers/dynamic_observer.hpp +++ b/src/rpp/rpp/observers/dynamic_observer.hpp @@ -9,8 +9,9 @@ #pragma once -#include #include +#include +#include #include #include @@ -94,3 +95,31 @@ class dynamic_strategy final const vtable* m_vtable; }; } + + +namespace rpp +{ +/** + * @brief Type-erased version of the `rpp::observer`. Any observer can be converted to dynamic_observer via `rpp::observer::as_dynamic` member function. + * @details To provide type-erasure it uses `std::shared_ptr`. As a result it has worse performance, but it is **ONLY** way to copy observer. + * + * @tparam Type of value this observer can handle + * + * @ingroup observers + */ +template +class dynamic_observer final : public observer> +{ + using base = observer>; +public: + using base::base; + + explicit dynamic_observer(base&& b) + : base{std::move(b)} + {} + + explicit dynamic_observer(const base& b) + : base{b} + {} +}; +} \ No newline at end of file diff --git a/src/rpp/rpp/observers/fwd.hpp b/src/rpp/rpp/observers/fwd.hpp index 020875566..fff111af4 100644 --- a/src/rpp/rpp/observers/fwd.hpp +++ b/src/rpp/rpp/observers/fwd.hpp @@ -90,16 +90,8 @@ namespace rpp template Strategy> class observer; -/** - * @brief Type-erased version of the `rpp::observer`. Any observer can be converted to dynamic_observer via `rpp::observer::as_dynamic` member function. - * @details To provide type-erasure it uses `std::shared_ptr`. As a result it has worse performance, but it is **ONLY** way to copy observer. - * - * @tparam Type of value this observer can handle - * - * @ingroup observers - */ template -using dynamic_observer = observer>; +class dynamic_observer; /** * @brief Observer specialized with passed callbacks. Most easiesest way to construct observer "on the fly" via lambdas and etc. From c686da3e7fe4b2129cb59c716ce68f3dc8d0b406 Mon Sep 17 00:00:00 2001 From: Aleksey Loginov Date: Tue, 9 Jan 2024 23:07:45 +0300 Subject: [PATCH 2/4] fix --- src/rpp/rpp/observers/observer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpp/rpp/observers/observer.hpp b/src/rpp/rpp/observers/observer.hpp index 7ab80c0a2..387196dfd 100644 --- a/src/rpp/rpp/observers/observer.hpp +++ b/src/rpp/rpp/observers/observer.hpp @@ -178,7 +178,7 @@ template Stra class observer; template Strategy> -class observer final : public details::observer_impl> +class observer : public details::observer_impl> { public: template From c2587061a8c67b64da2a90b234394312957f4e2b Mon Sep 17 00:00:00 2001 From: Aleksey Loginov Date: Wed, 10 Jan 2024 00:01:57 +0300 Subject: [PATCH 3/4] fix --- src/rpp/rpp/observables/dynamic_observable.hpp | 4 ++-- src/rpp/rpp/observables/fwd.hpp | 18 +++++++++++++----- src/rpp/rpp/observables/observable.hpp | 2 -- src/rpp/rpp/observers/dynamic_observer.hpp | 4 ++-- src/rpp/rpp/observers/fwd.hpp | 2 +- src/rpp/rpp/observers/observer.hpp | 11 +++++------ src/rpp/rpp/sources/fwd.hpp | 2 +- src/rpp/rpp/subjects/fwd.hpp | 2 +- src/tests/rpp/test_buffer.cpp | 1 + src/tests/rpp/test_concat.cpp | 1 + src/tests/rpp/test_flat_map.cpp | 1 + src/tests/rpp/test_group_by.cpp | 1 + src/tests/rpp/test_merge.cpp | 1 + src/tests/rpp/test_scheduler.cpp | 2 ++ src/tests/rpp/test_subscribe.cpp | 2 ++ src/tests/rpp/test_switch_on_next.cpp | 1 + src/tests/rppqt/test_main_thread_scheduler.cpp | 1 + 17 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/rpp/rpp/observables/dynamic_observable.hpp b/src/rpp/rpp/observables/dynamic_observable.hpp index 0bfa478cf..5e0b3f83f 100644 --- a/src/rpp/rpp/observables/dynamic_observable.hpp +++ b/src/rpp/rpp/observables/dynamic_observable.hpp @@ -91,11 +91,11 @@ class dynamic_observable : public observable -concept observable_strategy = requires(const S& strategy, details::fake_observer&& observer) +concept observable_strategy = requires(const S& strategy, rpp::details::observers::fake_observer&& observer) { {strategy.subscribe(std::move(observer))} -> std::same_as; typename S::value_type; @@ -33,6 +33,14 @@ class dynamic_strategy; template Strategy> class blocking_strategy; + +template +struct fake_strategy +{ + using value_type = Type; + + static void subscribe(const auto&) {} +}; } namespace rpp @@ -85,23 +93,23 @@ concept operator_observable_transform = requires(const Op& op, TObs obs) template concept operator_base = requires(const Op& op) { typename std::decay_t::template result_value; - requires details::observables::constraint::disposable_strategy, typename observable_chain_strategy>::expected_disposable_strategy>>; + requires details::observables::constraint::disposable_strategy, typename observable_chain_strategy>::expected_disposable_strategy>>; }; template -concept operator_subscribe = operator_base && requires(const Op& op, dynamic_observer::template result_value>&& observer, const observable_chain_strategy>& chain) +concept operator_subscribe = operator_base && requires(const Op& op, rpp::details::observers::fake_observer::template result_value>&& observer, const observable_chain_strategy>& chain) { {op.subscribe(std::move(observer), chain)}; }; template -concept operator_lift = operator_base && requires(const Op& op, dynamic_observer::template result_value>&& observer) +concept operator_lift = operator_base && requires(const Op& op, rpp::details::observers::fake_observer::template result_value>&& observer) { {op.template lift(std::move(observer))} -> rpp::constraint::observer_of_type; }; template -concept operator_lift_with_disposable_strategy = operator_base && requires(const Op& op, dynamic_observer::template result_value>&& observer) +concept operator_lift_with_disposable_strategy = operator_base && requires(const Op& op, rpp::details::observers::fake_observer::template result_value>&& observer) { {op.template lift_with_disposable_strategy(std::move(observer))} -> rpp::constraint::observer_of_type; }; diff --git a/src/rpp/rpp/observables/observable.hpp b/src/rpp/rpp/observables/observable.hpp index 4024f0426..085de06d3 100644 --- a/src/rpp/rpp/observables/observable.hpp +++ b/src/rpp/rpp/observables/observable.hpp @@ -15,8 +15,6 @@ #include #include #include -#include -#include #include #include diff --git a/src/rpp/rpp/observers/dynamic_observer.hpp b/src/rpp/rpp/observers/dynamic_observer.hpp index 3e41c4cd9..646a57ec3 100644 --- a/src/rpp/rpp/observers/dynamic_observer.hpp +++ b/src/rpp/rpp/observers/dynamic_observer.hpp @@ -114,11 +114,11 @@ class dynamic_observer final : public observer #include #include -#include #include #include #include @@ -178,7 +177,7 @@ template Stra class observer; template Strategy> -class observer : public details::observer_impl> +class observer final : public details::observer_impl> { public: template @@ -225,13 +224,13 @@ class observer -class observer> final +class observer> : public details::observer_impl, details::observers::none_disposable_strategy> { public: template TStrategy> requires (!std::same_as>) - explicit observer(observer&& other) + observer(observer&& other) : details::observer_impl, details::observers::none_disposable_strategy>{std::move(other)} { } @@ -241,12 +240,12 @@ class observer> final dynamic_observer as_dynamic() && { - return std::move(*this); + return dynamic_observer{std::move(*this)}; } const dynamic_observer& as_dynamic() & { - return *this; + return dynamic_observer{*this}; } }; diff --git a/src/rpp/rpp/sources/fwd.hpp b/src/rpp/rpp/sources/fwd.hpp index 3f91116ea..1242025ef 100644 --- a/src/rpp/rpp/sources/fwd.hpp +++ b/src/rpp/rpp/sources/fwd.hpp @@ -24,7 +24,7 @@ namespace rpp::constraint { template -concept on_subscribe = requires(const S& strategy, rpp::details::fake_observer&& observer) +concept on_subscribe = requires(const S& strategy, rpp::details::observers::fake_observer&& observer) { {strategy(std::move(observer))} -> std::same_as; }; diff --git a/src/rpp/rpp/subjects/fwd.hpp b/src/rpp/rpp/subjects/fwd.hpp index 8ecbf4c7c..7cb50c0bd 100644 --- a/src/rpp/rpp/subjects/fwd.hpp +++ b/src/rpp/rpp/subjects/fwd.hpp @@ -21,7 +21,7 @@ namespace rpp::subjects::details namespace constraint { template -concept subject_strategy = requires(Strategy t, rpp::details::fake_observer&& obs) +concept subject_strategy = requires(Strategy t, rpp::details::observers::fake_observer&& obs) { {t.get_observer()} -> rpp::constraint::observer; t.on_subscribe(std::move(obs)); diff --git a/src/tests/rpp/test_buffer.cpp b/src/tests/rpp/test_buffer.cpp index ca0cf5ed6..2ebcb243b 100644 --- a/src/tests/rpp/test_buffer.cpp +++ b/src/tests/rpp/test_buffer.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include "mock_observer.hpp" #include "disposable_observable.hpp" diff --git a/src/tests/rpp/test_concat.cpp b/src/tests/rpp/test_concat.cpp index a0817fd80..8a289cfa9 100644 --- a/src/tests/rpp/test_concat.cpp +++ b/src/tests/rpp/test_concat.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include diff --git a/src/tests/rpp/test_flat_map.cpp b/src/tests/rpp/test_flat_map.cpp index 82bc69e7c..0fe351316 100644 --- a/src/tests/rpp/test_flat_map.cpp +++ b/src/tests/rpp/test_flat_map.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "copy_count_tracker.hpp" #include "mock_observer.hpp" diff --git a/src/tests/rpp/test_group_by.cpp b/src/tests/rpp/test_group_by.cpp index 9388ddab3..9064730e0 100644 --- a/src/tests/rpp/test_group_by.cpp +++ b/src/tests/rpp/test_group_by.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include "mock_observer.hpp" #include "disposable_observable.hpp" diff --git a/src/tests/rpp/test_merge.cpp b/src/tests/rpp/test_merge.cpp index 766ae8e08..3a8fcda14 100644 --- a/src/tests/rpp/test_merge.cpp +++ b/src/tests/rpp/test_merge.cpp @@ -10,6 +10,7 @@ #include +#include #include #include #include diff --git a/src/tests/rpp/test_scheduler.cpp b/src/tests/rpp/test_scheduler.cpp index d6ead1b01..6f7906245 100644 --- a/src/tests/rpp/test_scheduler.cpp +++ b/src/tests/rpp/test_scheduler.cpp @@ -15,6 +15,8 @@ #include #include #include +#include + #include #include #include diff --git a/src/tests/rpp/test_subscribe.cpp b/src/tests/rpp/test_subscribe.cpp index 1d5d5a939..e6a141d49 100644 --- a/src/tests/rpp/test_subscribe.cpp +++ b/src/tests/rpp/test_subscribe.cpp @@ -10,6 +10,8 @@ #include #include +#include + #include #include "mock_observer.hpp" diff --git a/src/tests/rpp/test_switch_on_next.cpp b/src/tests/rpp/test_switch_on_next.cpp index 3b937e4c2..9484e88f8 100644 --- a/src/tests/rpp/test_switch_on_next.cpp +++ b/src/tests/rpp/test_switch_on_next.cpp @@ -15,6 +15,7 @@ #include #include +#include #include #include diff --git a/src/tests/rppqt/test_main_thread_scheduler.cpp b/src/tests/rppqt/test_main_thread_scheduler.cpp index 1c81f8a3a..9096c1c9b 100644 --- a/src/tests/rppqt/test_main_thread_scheduler.cpp +++ b/src/tests/rppqt/test_main_thread_scheduler.cpp @@ -12,6 +12,7 @@ #include #include +#include #include From ea30a4889e6284ad96620f1b84cf712c6897fc0c Mon Sep 17 00:00:00 2001 From: Aleksey Loginov Date: Wed, 10 Jan 2024 00:19:18 +0300 Subject: [PATCH 4/4] fix --- src/rpp/rpp/observers/observer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpp/rpp/observers/observer.hpp b/src/rpp/rpp/observers/observer.hpp index 852811c6b..831abccf3 100644 --- a/src/rpp/rpp/observers/observer.hpp +++ b/src/rpp/rpp/observers/observer.hpp @@ -230,7 +230,7 @@ class observer> public: template TStrategy> requires (!std::same_as>) - observer(observer&& other) + explicit observer(observer&& other) : details::observer_impl, details::observers::none_disposable_strategy>{std::move(other)} { }