Skip to content

Commit

Permalink
Minor defer fix (#414)
Browse files Browse the repository at this point in the history
  • Loading branch information
victimsnino authored Aug 27, 2023
1 parent e68589e commit 75031d7
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 8 deletions.
14 changes: 10 additions & 4 deletions src/rpp/rpp/sources/defer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#pragma once

#include <rpp/defs.hpp>
#include <rpp/sources/fwd.hpp>
#include <rpp/observables/observable.hpp>

Expand All @@ -19,8 +20,13 @@ struct defer_strategy
{
using ValueType = rpp::utils::extract_observable_type_t<std::invoke_result_t<Factory>>;

Factory observable_factory;
void subscribe(auto&& obs) const { observable_factory().subscribe(std::forward<decltype(obs)>(obs)); }
RPP_NO_UNIQUE_ADDRESS Factory observable_factory;

template<rpp::constraint::observer_of_type<ValueType> TObs>
void subscribe(TObs&& obs) const
{
observable_factory().subscribe(std::forward<TObs>(obs));
}
};
}

Expand All @@ -36,7 +42,7 @@ namespace rpp::source
/**
* @brief Creates rpp::observable that calls the specified observable factory to create an observable for each new observer that subscribes.
*
* @tparam Factory the type of the observable factory
* @param observable_factory is function to create observable to subscribe on.
*
* @par Example:
* @snippet defer.cpp defer from_iterable
Expand All @@ -45,7 +51,7 @@ namespace rpp::source
* @see https://reactivex.io/documentation/operators/defer.html
*/
template<std::invocable Factory>
requires(rpp::utils::is_no_argument_function<Factory> && rpp::constraint::observable<std::invoke_result_t<Factory>>)
requires rpp::constraint::observable<std::invoke_result_t<Factory>>
auto defer(Factory&& observable_factory)
{
return defer_observable<rpp::utils::extract_observable_type_t<std::invoke_result_t<Factory>>, Factory>{std::forward<Factory>(observable_factory)};
Expand Down
4 changes: 0 additions & 4 deletions src/rpp/rpp/utils/function_traits.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

#pragma once

#include <concepts>
#include <tuple>
#include <type_traits>

Expand All @@ -34,9 +33,6 @@ struct is_not_template_callable_t<R (*)(Args ...)> : std::true_type{};
template<typename T>
concept is_not_template_callable = is_not_template_callable_t<T>::value;

template<typename F>
concept is_no_argument_function = std::invocable<F>;

// Lambda
template<is_not_template_callable T>
struct function_traits : function_traits<decltype(&T::operator())> {};
Expand Down

1 comment on commit 75031d7

@github-actions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BENCHMARK RESULTS (AUTOGENERATED)

ci-ubuntu-gcc

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 827.51 ns 1.85 ns 1.55 ns 1.20
Subscribe empty callbacks to empty observable via pipe operator 834.63 ns 1.74 ns 1.45 ns 1.20

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 2151.46 ns 0.42 ns 0.33 ns 1.25
from array of 1 - create + subscribe + current_thread 3094.16 ns 50.87 ns 42.37 ns 1.20
concat_as_source of just(1 immediate) create + subscribe 6567.39 ns 0.41 ns 0.33 ns 1.23
defer from array of 1 - defer + create + subscribe + immediate 2342.03 ns 0.41 ns 0.33 ns 1.24

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 1641.26 ns 0.40 ns 0.33 ns 1.20
create+filter(true)+subscribe 1012.98 ns 0.40 ns 0.33 ns 1.20
create(1,2)+skip(1)+subscribe 1393.91 ns 0.40 ns 0.33 ns 1.20
create(1,1,2)+distinct_until_changed()+subscribe 997.02 ns 0.40 ns 0.33 ns 1.20
create(1,2)+first()+subscribe 2045.50 ns 0.40 ns 0.33 ns 1.20
create(1,2)+last()+subscribe 1274.25 ns 0.40 ns 0.33 ns 1.20

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 870.19 ns 1.21 ns 1.00 ns 1.21
current_thread scheduler create worker + schedule 1026.62 ns 9.63 ns 8.02 ns 1.20
current_thread scheduler create worker + schedule + recursive schedule 2295.93 ns 138.92 ns 82.35 ns 1.69

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 999.64 ns 0.40 ns 0.33 ns 1.19
create+scan(10, std::plus)+subscribe 1162.17 ns 0.40 ns 0.33 ns 1.20
create+flat_map(just(v*2))+subscribe 3755.29 ns 179.44 ns 149.72 ns 1.20

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 1057.75 ns - - 0.00
create+take_while(true)+subscribe 1007.89 ns 0.40 ns 0.33 ns 1.20

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 3685.94 ns 38.74 ns 33.41 ns 1.16

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 5128.44 ns 212.29 ns 177.24 ns 1.20
create(1) + merge_with(create(2)) + subscribe 7993.02 ns 212.17 ns 176.28 ns 1.20
create(1) + with_latest_from(create(2)) + subscribe - 173.65 ns 144.93 ns 1.20

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 113.97 ns 89.40 ns 74.76 ns 1.20

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 4582.99 ns 145.36 ns 121.56 ns 1.20

ci-macos

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 1146.05 ns 0.60 ns 0.62 ns 0.97
Subscribe empty callbacks to empty observable via pipe operator 1251.36 ns 0.59 ns 0.63 ns 0.94

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 2360.53 ns 0.49 ns 0.51 ns 0.97
from array of 1 - create + subscribe + current_thread 3011.99 ns 105.79 ns 110.05 ns 0.96
concat_as_source of just(1 immediate) create + subscribe 7397.59 ns 0.32 ns 0.32 ns 0.99
defer from array of 1 - defer + create + subscribe + immediate 2565.04 ns 0.31 ns 0.33 ns 0.95

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 2257.78 ns 4.86 ns 4.76 ns 1.02
create+filter(true)+subscribe 1374.36 ns 2.68 ns 2.95 ns 0.91
create(1,2)+skip(1)+subscribe 2117.20 ns 5.85 ns 6.45 ns 0.91
create(1,1,2)+distinct_until_changed()+subscribe 1298.10 ns 8.87 ns 9.48 ns 0.94
create(1,2)+first()+subscribe 2620.01 ns 6.35 ns 6.46 ns 0.98
create(1,2)+last()+subscribe 1693.72 ns 9.09 ns 8.67 ns 1.05

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 1117.55 ns 0.65 ns 0.65 ns 1.00
current_thread scheduler create worker + schedule 1459.50 ns 10.57 ns 10.12 ns 1.04
current_thread scheduler create worker + schedule + recursive schedule 2523.31 ns 181.45 ns 201.67 ns 0.90

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 1201.34 ns 3.06 ns 2.72 ns 1.13
create+scan(10, std::plus)+subscribe 1516.32 ns 5.42 ns 5.49 ns 0.99
create+flat_map(just(v*2))+subscribe 3711.94 ns 336.74 ns 341.41 ns 0.99

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 1240.58 ns 3.73 ns 3.74 ns 1.00
create+take_while(true)+subscribe 1186.56 ns 2.83 ns 3.13 ns 0.90

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 4297.16 ns 100.07 ns 91.46 ns 1.09

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 5151.20 ns 383.22 ns 415.27 ns 0.92
create(1) + merge_with(create(2)) + subscribe 7980.83 ns 405.91 ns 411.94 ns 0.99
create(1) + with_latest_from(create(2)) + subscribe - 488.95 ns 469.63 ns 1.04

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 117.51 ns 105.85 ns 115.24 ns 0.92

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 4572.68 ns 258.87 ns 258.30 ns 1.00

ci-ubuntu-clang

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 404.08 ns 1.20 ns 1.20 ns 1.00
Subscribe empty callbacks to empty observable via pipe operator 404.97 ns 2.01 ns 2.01 ns 1.00

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 867.35 ns 0.45 ns 0.45 ns 1.00
from array of 1 - create + subscribe + current_thread 1228.42 ns 31.92 ns 32.08 ns 1.00
concat_as_source of just(1 immediate) create + subscribe 2702.12 ns 0.40 ns 0.40 ns 1.00
defer from array of 1 - defer + create + subscribe + immediate 914.30 ns 0.40 ns 0.40 ns 1.00

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 773.01 ns 0.40 ns 0.40 ns 1.00
create+filter(true)+subscribe 440.92 ns 0.40 ns 0.40 ns 1.00
create(1,2)+skip(1)+subscribe 674.58 ns 0.40 ns 0.40 ns 1.00
create(1,1,2)+distinct_until_changed()+subscribe 457.51 ns 0.80 ns 0.80 ns 1.00
create(1,2)+first()+subscribe 918.41 ns 0.40 ns 0.40 ns 1.00
create(1,2)+last()+subscribe 601.72 ns 0.40 ns 0.40 ns 1.00

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 326.94 ns 2.01 ns 2.00 ns 1.00
current_thread scheduler create worker + schedule 473.56 ns 7.62 ns 7.62 ns 1.00
current_thread scheduler create worker + schedule + recursive schedule 952.65 ns 83.37 ns 87.98 ns 0.95

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 435.90 ns 0.40 ns 0.40 ns 1.00
create+scan(10, std::plus)+subscribe 526.94 ns 0.80 ns 0.80 ns 1.00
create+flat_map(just(v*2))+subscribe 1989.16 ns 110.31 ns 109.18 ns 1.01

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 468.58 ns - - 0.00
create+take_while(true)+subscribe 440.85 ns 0.40 ns 0.40 ns 1.00

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 2069.61 ns 22.25 ns 22.37 ns 0.99

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 2515.52 ns 137.62 ns 136.94 ns 1.00
create(1) + merge_with(create(2)) + subscribe 3921.34 ns 122.46 ns 122.84 ns 1.00
create(1) + with_latest_from(create(2)) + subscribe - 117.73 ns 118.81 ns 0.99

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 46.16 ns 31.82 ns 31.95 ns 1.00

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 1813.70 ns 120.42 ns 119.99 ns 1.00

ci-windows

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 1719.88 ns 1.60 ns 2.34 ns 0.69
Subscribe empty callbacks to empty observable via pipe operator 1260.99 ns 1.60 ns 2.34 ns 0.69

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 2586.70 ns 7.21 ns 8.52 ns 0.85
from array of 1 - create + subscribe + current_thread 3452.85 ns 107.00 ns 112.90 ns 0.95
concat_as_source of just(1 immediate) create + subscribe 8601.63 ns 11.28 ns 14.85 ns 0.76
defer from array of 1 - defer + create + subscribe + immediate 2730.58 ns 7.43 ns 8.38 ns 0.89

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 2367.97 ns 9.03 ns 9.07 ns 0.99
create+filter(true)+subscribe 1315.76 ns 6.09 ns 6.38 ns 0.95
create(1,2)+skip(1)+subscribe 2010.31 ns 8.06 ns 9.36 ns 0.86
create(1,1,2)+distinct_until_changed()+subscribe 1342.71 ns 13.16 ns 14.37 ns 0.92
create(1,2)+first()+subscribe 2884.48 ns 10.65 ns 12.03 ns 0.89
create(1,2)+last()+subscribe 1723.04 ns 12.92 ns 13.74 ns 0.94

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 1113.91 ns 4.41 ns 5.02 ns 0.88
current_thread scheduler create worker + schedule 1391.30 ns 9.62 ns 11.37 ns 0.85
current_thread scheduler create worker + schedule + recursive schedule 2389.04 ns 134.04 ns 137.53 ns 0.97

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 1318.80 ns 6.42 ns 7.64 ns 0.84
create+scan(10, std::plus)+subscribe 1549.53 ns 8.91 ns 9.08 ns 0.98
create+flat_map(just(v*2))+subscribe 4299.59 ns 281.59 ns 293.57 ns 0.96

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 1443.72 ns 5.33 ns 6.02 ns 0.89
create+take_while(true)+subscribe 1305.35 ns 5.98 ns 7.71 ns 0.78

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 4353.94 ns 84.54 ns 94.81 ns 0.89

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 5090.60 ns 323.73 ns 341.13 ns 0.95
create(1) + merge_with(create(2)) + subscribe 8153.66 ns 324.99 ns 341.23 ns 0.95
create(1) + with_latest_from(create(2)) + subscribe - 329.69 ns 393.75 ns 0.84

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 121.54 ns 99.32 ns 94.95 ns 1.05

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 5564.19 ns 284.03 ns 302.39 ns 0.94

Please sign in to comment.