Skip to content

Commit

Permalink
member_ptr_caller (#383)
Browse files Browse the repository at this point in the history
* member_ptr_caller

* fix
  • Loading branch information
victimsnino authored Jun 28, 2023
1 parent 0ccdda9 commit 4884388
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 21 deletions.
39 changes: 18 additions & 21 deletions src/rpp/rpp/observers/dynamic_observer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,20 @@

namespace rpp::details::observers
{
template<typename T, typename Strategy>
void forwarding_on_next_lvalue(const void* const ptr, const T& v) { static_cast<const Strategy*>(ptr)->on_next(v); }
template<auto Fn>
struct member_ptr_caller;

template<typename T, typename Strategy>
void forwarding_on_next_rvalue(const void* const ptr, T&& v) { static_cast<const Strategy*>(ptr)->on_next(std::forward<T>(v)); }

template<typename Strategy>
void forwarding_on_error(const void* const ptr, const std::exception_ptr& err) { static_cast<const Strategy*>(ptr)->on_error(err); }

template<typename Strategy>
void forwarding_on_completed(const void* const ptr) { static_cast<const Strategy*>(ptr)->on_completed(); }

template<typename Strategy>
void forwarding_set_upstream(void* const ptr, const disposable_wrapper& d) { static_cast<Strategy*>(ptr)->set_upstream(d); }
template<class T, class R, class... Args, R (T::*F)(Args...)>
struct member_ptr_caller<F>
{
static R call(void* data, Args...args) { return (static_cast<T*>(data)->*F)(static_cast<Args>(args)...); }
};

template<typename Strategy>
bool forwarding_is_disposed(const void* const ptr) { return static_cast<const Strategy*>(ptr)->is_disposed(); }
template<class T, class R, class... Args, R (T::*F)(Args...) const>
struct member_ptr_caller<F>
{
static R call(const void* data, Args...args) { return (static_cast<const T*>(data)->*F)(static_cast<Args>(args)...); }
};

template<constraint::decayed_type Type>
class dynamic_strategy final
Expand Down Expand Up @@ -71,12 +68,12 @@ class dynamic_strategy final
static const vtable* create() noexcept
{
static vtable s_res{
.on_next_lvalue = forwarding_on_next_lvalue<Type, Strategy>,
.on_next_rvalue = forwarding_on_next_rvalue<Type, Strategy>,
.on_error = forwarding_on_error<Strategy>,
.on_completed = forwarding_on_completed<Strategy>,
.set_upstream = forwarding_set_upstream<Strategy>,
.is_disposed = forwarding_is_disposed<Strategy>,
.on_next_lvalue = &member_ptr_caller<static_cast<typename Strategy::on_next_lvalue>(&Strategy::on_next)>::call,
.on_next_rvalue = &member_ptr_caller<static_cast<typename Strategy::on_next_rvalue>(&Strategy::on_next)>::call,
.on_error = &member_ptr_caller<&Strategy::on_error>::call,
.on_completed = &member_ptr_caller<&Strategy::on_completed>::call,
.set_upstream = &member_ptr_caller<&Strategy::set_upstream>::call,
.is_disposed = &member_ptr_caller<&Strategy::is_disposed>::call,
};
return &s_res;
}
Expand Down
2 changes: 2 additions & 0 deletions src/rpp/rpp/observers/observer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ class observer_impl
observer_impl(observer_impl&&) noexcept = default;

public:
using on_next_lvalue = void(observer_impl::*)(const Type&) const noexcept;
using on_next_rvalue = void(observer_impl::*)(Type&&) const noexcept;
/**
* @brief Observable calls this method to pass disposable. Observer disposes this disposable WHEN observer wants to unsubscribe.
* @note This method can be called multiple times, but new call means "replace upstream with this new one". So, tracked only last one
Expand Down

1 comment on commit 4884388

@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 864.06 ns 1.21 ns 1.27 ns 0.95
Subscribe empty callbacks to empty observable via pipe operator 851.41 ns 1.20 ns 1.17 ns 1.03

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 2195.95 ns 0.40 ns 0.79 ns 0.51
from array of 1 - create + subscribe + current_thread 3180.01 ns 6.46 ns 7.41 ns 0.87
concat_as_source of just(1 immediate) create + subscribe 6679.12 ns 0.40 ns 0.40 ns 1.00

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 1735.97 ns 0.40 ns 0.37 ns 1.08
create+filter(true)+subscribe 1033.29 ns 0.40 ns 0.40 ns 1.00
create(1,2)+skip(1)+subscribe 1481.87 ns 0.40 ns 0.40 ns 0.99
create(1,1,2)+distinct_until_changed()+subscribe 1043.25 ns 0.40 ns 0.40 ns 1.00
create(1,2)+first()+subscribe 2118.06 ns 0.40 ns 0.38 ns 1.06

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 875.60 ns 0.80 ns 0.77 ns 1.04
current_thread scheduler create worker + schedule 1079.00 ns 7.64 ns 7.64 ns 1.00
current_thread scheduler create worker + schedule + recursive schedule 2393.71 ns 98.48 ns 93.24 ns 1.06

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 1029.09 ns 0.40 ns 0.37 ns 1.07
create+scan(10, std::plus)+subscribe 1214.02 ns 0.40 ns 0.39 ns 1.04
create+flat_map(just(v*2))+subscribe 3919.82 ns 195.32 ns 186.52 ns 1.05

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 1073.15 ns - - 0.00
create+take_while(true)+subscribe 1025.65 ns 0.40 ns 0.39 ns 1.02

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 3758.58 ns 0.40 ns 0.40 ns 1.02

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 5339.40 ns 254.56 ns 237.47 ns 1.07
create(1) + merge_with(create(2)) + subscribe 8434.64 ns 251.86 ns 257.28 ns 0.98

ci-macos

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 1076.48 ns 0.56 ns 1.01 ns 0.56
Subscribe empty callbacks to empty observable via pipe operator 1067.89 ns 0.56 ns 0.57 ns 0.98

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 2257.36 ns 0.45 ns 0.58 ns 0.77
from array of 1 - create + subscribe + current_thread 2903.43 ns 8.33 ns 13.15 ns 0.63
concat_as_source of just(1 immediate) create + subscribe 6717.03 ns 0.28 ns 0.28 ns 1.00

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 2001.84 ns 4.18 ns 6.12 ns 0.68
create+filter(true)+subscribe 1149.86 ns 3.62 ns 4.31 ns 0.84
create(1,2)+skip(1)+subscribe 1832.85 ns 6.14 ns 7.64 ns 0.80
create(1,1,2)+distinct_until_changed()+subscribe 1165.68 ns 9.19 ns 12.78 ns 0.72
create(1,2)+first()+subscribe 2387.91 ns 5.95 ns 5.89 ns 1.01

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 1004.32 ns 0.57 ns 0.98 ns 0.58
current_thread scheduler create worker + schedule 1357.94 ns 8.72 ns 12.47 ns 0.70
current_thread scheduler create worker + schedule + recursive schedule 2293.63 ns 156.80 ns 155.88 ns 1.01

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 1136.60 ns 3.06 ns 4.30 ns 0.71
create+scan(10, std::plus)+subscribe 1375.60 ns 5.65 ns 5.61 ns 1.01
create+flat_map(just(v*2))+subscribe 3251.69 ns 318.45 ns 501.97 ns 0.63

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 1189.58 ns 3.34 ns 4.00 ns 0.84
create+take_while(true)+subscribe 1186.88 ns 3.94 ns 4.05 ns 0.97

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 3585.27 ns 0.28 ns 0.43 ns 0.65

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 4077.28 ns 396.98 ns 531.48 ns 0.75
create(1) + merge_with(create(2)) + subscribe 6838.02 ns 376.12 ns 547.78 ns 0.69

ci-ubuntu-clang

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 360.02 ns 0.71 ns 0.80 ns 0.88
Subscribe empty callbacks to empty observable via pipe operator 395.70 ns 0.72 ns 0.60 ns 1.20

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 815.98 ns 0.37 ns 0.41 ns 0.91
from array of 1 - create + subscribe + current_thread 1085.13 ns 5.02 ns 4.35 ns 1.16
concat_as_source of just(1 immediate) create + subscribe 2609.04 ns 0.38 ns 0.40 ns 0.94

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 721.55 ns 0.37 ns 0.40 ns 0.93
create+filter(true)+subscribe 375.18 ns 0.39 ns 0.40 ns 0.96
create(1,2)+skip(1)+subscribe 637.47 ns 0.39 ns 0.40 ns 0.98
create(1,1,2)+distinct_until_changed()+subscribe 439.38 ns 0.77 ns 0.40 ns 1.92
create(1,2)+first()+subscribe 843.50 ns 0.37 ns 0.40 ns 0.91

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 295.23 ns 0.72 ns 0.60 ns 1.19
current_thread scheduler create worker + schedule 424.76 ns 4.66 ns 4.04 ns 1.15
current_thread scheduler create worker + schedule + recursive schedule 899.24 ns 80.60 ns 63.57 ns 1.27

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 426.86 ns 0.39 ns 0.40 ns 0.97
create+scan(10, std::plus)+subscribe 516.39 ns 0.75 ns 0.80 ns 0.94
create+flat_map(just(v*2))+subscribe 1814.79 ns 99.92 ns 85.76 ns 1.17

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 425.49 ns - - 0.00
create+take_while(true)+subscribe 404.41 ns 0.39 ns 0.40 ns 0.97

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 1971.92 ns 0.39 ns 0.40 ns 0.96

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 2327.88 ns 130.61 ns 106.32 ns 1.23
create(1) + merge_with(create(2)) + subscribe 3594.32 ns 121.46 ns 105.33 ns 1.15

ci-windows

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 1186.36 ns 1.67 ns 2.07 ns 0.81
Subscribe empty callbacks to empty observable via pipe operator 1830.43 ns 1.67 ns 2.04 ns 0.82

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 2636.69 ns 8.02 ns 9.89 ns 0.81
from array of 1 - create + subscribe + current_thread 3425.67 ns 27.01 ns 28.61 ns 0.94
concat_as_source of just(1 immediate) create + subscribe 8788.00 ns 13.32 ns 12.88 ns 1.03

Filtering Operators

name rxcpp rpp prev rpp ratio
create+take(1)+subscribe 2432.15 ns 8.14 ns 9.32 ns 0.87
create+filter(true)+subscribe 1359.88 ns 5.68 ns 6.59 ns 0.86
create(1,2)+skip(1)+subscribe 2053.68 ns 8.38 ns 10.27 ns 0.82
create(1,1,2)+distinct_until_changed()+subscribe 1407.89 ns 13.37 ns 15.63 ns 0.85
create(1,2)+first()+subscribe 3348.15 ns 10.72 ns 11.60 ns 0.92

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 1149.95 ns 4.34 ns 4.80 ns 0.91
current_thread scheduler create worker + schedule 1429.53 ns 11.03 ns 12.92 ns 0.85
current_thread scheduler create worker + schedule + recursive schedule 2443.52 ns 139.45 ns 131.09 ns 1.06

Transforming Operators

name rxcpp rpp prev rpp ratio
create+map(v*2)+subscribe 1364.86 ns 6.68 ns 7.43 ns 0.90
create+scan(10, std::plus)+subscribe 1559.35 ns 9.32 ns 9.52 ns 0.98
create+flat_map(just(v*2))+subscribe 3980.83 ns 310.38 ns 297.42 ns 1.04

Conditional Operators

name rxcpp rpp prev rpp ratio
create+take_while(false)+subscribe 1466.15 ns 5.79 ns 5.41 ns 1.07
create+take_while(true)+subscribe 1361.25 ns 5.69 ns 7.70 ns 0.74

Utility Operators

name rxcpp rpp prev rpp ratio
create(1)+subscribe_on(immediate)+subscribe 5016.85 ns 13.47 ns 12.84 ns 1.05

Combining Operators

name rxcpp rpp prev rpp ratio
create(create(1), create(1)) + merge() + subscribe 5086.97 ns 370.58 ns 407.73 ns 0.91
create(1) + merge_with(create(2)) + subscribe 7946.67 ns 365.35 ns 380.51 ns 0.96

Please sign in to comment.