Update disposables docs#679
Conversation
📝 WalkthroughWalkthroughThe documentation for Reactive Programming has been extensively updated to improve clarity and detail. Key areas include an enhanced introduction to reactive programming, expanded descriptions of Observer and Observable patterns, and refined sections on data handling strategies. The Changes
Possibly related issues
Possibly related PRs
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Outside diff range and nitpick comments (5)
src/rpp/rpp/disposables.hpp (2)
18-21: Consider adding code examples to illustrate resource management.While the detailed explanation is clear, adding simple code examples would help developers better understand how disposables manage different types of resources in practice.
Consider adding examples like:
// Example of managing a network connection auto connection = observable.subscribe_with_disposable([](const auto& data) { // Process data }); // Later, when done connection.dispose(); // Cleanly closes the connection
33-34: Consider expanding the implementation note.While the note about using
disposable_wrapper_implis important, it could be more helpful to explain why this is the recommended approach (e.g., automatic resource management, exception safety).Consider expanding the note:
- @note In rpp all disposables should be created via @link rpp::disposable_wrapper_impl @endlink instead of manually. + @note In rpp all disposables should be created via @link rpp::disposable_wrapper_impl @endlink instead of manually. + This ensures proper resource management with RAII semantics and exception safety. + It also helps prevent common issues like memory leaks or use-after-free errors.src/rpp/rpp/disposables/disposable_wrapper.hpp (2)
108-136: Documentation improvements look great! Consider adding thread-safety details.The documentation updates significantly improve clarity by explaining the smart pointer nature, ownership semantics, and providing practical examples. The relationship with subscribe methods is well explained.
Consider adding:
- Thread-safety guarantees for concurrent access
- Performance characteristics of key operations
155-160: Consider documenting allocation and exception behavior.The documentation clearly explains the purpose and provides a good example. Consider adding:
- Memory allocation behavior
- Exception safety guarantees
docs/readme.md (1)
Line range hint
341-356: Enhance the disposables documentation with lifecycle examples.The documentation for disposables is comprehensive but could be improved by:
- Adding a code example demonstrating the lifecycle management using
disposable_wrapper_impl.- Including a practical example showing the difference between
disposable_wrapperandcomposite_disposable_wrapper.Consider adding examples like:
// Example of disposable lifecycle management auto disposable = rpp::make_callback_disposable([]() noexcept { std::cout << "Resource cleanup" << std::endl; }); { rpp::disposable_wrapper wrapper{std::move(disposable)}; // wrapper automatically calls dispose() when going out of scope } // Example of composite disposable auto composite = rpp::composite_disposable_wrapper{}; composite.add(rpp::make_callback_disposable([]() noexcept { std::cout << "Cleanup 1" << std::endl; })); composite.add(rpp::make_callback_disposable([]() noexcept { std::cout << "Cleanup 2" << std::endl; })); // Both cleanup callbacks will be called when composite is disposed
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (3)
docs/readme.md(1 hunks)src/rpp/rpp/disposables.hpp(1 hunks)src/rpp/rpp/disposables/disposable_wrapper.hpp(2 hunks)
🔇 Additional comments (3)
src/rpp/rpp/disposables.hpp (2)
15-16: LGTM! Clear and concise brief description.
The brief description effectively communicates the core purpose of a Disposable as a handle/resource in the observable-observer relationship.
23-32: Excellent explanation of disposable types!
The documentation clearly distinguishes between upstream and external disposables, providing a comprehensive understanding of their different purposes and use cases.
docs/readme.md (1)
196-198: Verify the Doxygen reference for disposables documentation.
The \copydoc disposables command is used to include documentation from another file. Let's verify this reference exists and is properly linked.
✅ Verification successful
The Doxygen reference for disposables is correctly set up and linked
The documentation reference is properly configured:
- The
@defgroup disposablesis defined insrc/rpp/rpp/disposables.hppwith comprehensive documentation - Multiple files are correctly linked to this group using
@ingroup disposables - The
\copydoccommand in the readme correctly references this documentation group
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check if the disposables documentation reference exists in header files
# Test 1: Search for the disposables documentation group
rg -l '@defgroup disposables' src/
# Test 2: Search for related documentation
rg -l '@ingroup disposables' src/
Length of output: 325
Script:
#!/bin/bash
# Let's verify the actual content of the disposables documentation group
rg -A 5 '@defgroup disposables' src/rpp/rpp/disposables.hpp
# Also check the content around the \copydoc command in the readme
rg -A 5 '\\copydoc disposables' docs/readme.md
Length of output: 741
BENCHMARK RESULTS (AUTOGENERATED)
|
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| Subscribe empty callbacks to empty observable | 304.21 ns | 1.88 ns | 1.85 ns | 1.01 |
| Subscribe empty callbacks to empty observable via pipe operator | 304.03 ns | 1.85 ns | 1.85 ns | 1.00 |
Sources
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| from array of 1 - create + subscribe + immediate | 682.72 ns | 0.31 ns | 0.31 ns | 1.00 |
| from array of 1 - create + subscribe + current_thread | 1051.98 ns | 3.42 ns | 3.43 ns | 1.00 |
| concat_as_source of just(1 immediate) create + subscribe | 2214.71 ns | 112.17 ns | 111.93 ns | 1.00 |
| defer from array of 1 - defer + create + subscribe + immediate | 722.93 ns | 0.31 ns | 0.31 ns | 1.00 |
| interval - interval + take(3) + subscribe + immediate | 2164.66 ns | 59.19 ns | 59.23 ns | 1.00 |
| interval - interval + take(3) + subscribe + current_thread | 2967.29 ns | 32.40 ns | 32.40 ns | 1.00 |
| from array of 1 - create + as_blocking + subscribe + new_thread | 27046.26 ns | 27804.74 ns | 28324.88 ns | 0.98 |
| from array of 1000 - create + as_blocking + subscribe + new_thread | 39197.89 ns | 49553.73 ns | 51243.95 ns | 0.97 |
| concat_as_source of just(1 immediate) and just(1,2 immediate)create + subscribe | 3529.70 ns | 130.24 ns | 130.55 ns | 1.00 |
Filtering Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+take(1)+subscribe | 1094.95 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just+filter(true)+subscribe | 889.79 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just(1,2)+skip(1)+subscribe | 1005.12 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just(1,1,2)+distinct_until_changed()+subscribe | 859.96 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just(1,2)+first()+subscribe | 1230.18 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just(1,2)+last()+subscribe | 920.01 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just+take_last(1)+subscribe | 1170.01 ns | 18.20 ns | 17.91 ns | 1.02 |
| immediate_just(1,2,3)+element_at(1)+subscribe | 876.68 ns | 0.31 ns | 0.31 ns | 1.00 |
Schedulers
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate scheduler create worker + schedule | 264.05 ns | 0.46 ns | 0.46 ns | 1.00 |
| current_thread scheduler create worker + schedule | 365.66 ns | 4.32 ns | 4.32 ns | 1.00 |
| current_thread scheduler create worker + schedule + recursive schedule | 825.55 ns | 60.96 ns | 61.17 ns | 1.00 |
Transforming Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+map(v*2)+subscribe | 886.76 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just+scan(10, std::plus)+subscribe | 875.96 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just+flat_map(immediate_just(v*2))+subscribe | 2305.12 ns | 138.97 ns | 170.56 ns | 0.81 |
| immediate_just+buffer(2)+subscribe | 1575.82 ns | 13.89 ns | 13.59 ns | 1.02 |
| immediate_just+window(2)+subscribe + subscsribe inner | 2384.24 ns | 1353.00 ns | 1325.75 ns | 1.02 |
Conditional Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+take_while(false)+subscribe | 841.61 ns | - | - | 0.00 |
| immediate_just+take_while(true)+subscribe | 913.39 ns | 0.31 ns | 0.31 ns | 1.00 |
Utility Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just(1)+subscribe_on(immediate)+subscribe | 1994.40 ns | 0.31 ns | 0.31 ns | 1.00 |
Combining Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just(immediate_just(1), immediate_just(1)) + merge() + subscribe | 3392.98 ns | 159.95 ns | 203.76 ns | 0.78 |
| immediate_just(1) + merge_with(immediate_just(2)) + subscribe | 3666.51 ns | 160.69 ns | 161.58 ns | 0.99 |
| immediate_just(1) + with_latest_from(immediate_just(2)) + subscribe | - | 133.19 ns | 129.60 ns | 1.03 |
| immediate_just(immediate_just(1),immediate_just(1)) + switch_on_next() + subscribe | 3558.32 ns | 1160.82 ns | 1165.96 ns | 1.00 |
| immediate_just(1) + zip(immediate_just(2)) + subscribe | 2106.12 ns | 210.25 ns | 207.99 ns | 1.01 |
| immediate_just(immediate_just(1), immediate_just(1)) + concat() + subscribe | 3158.00 ns | 238.19 ns | 239.54 ns | 0.99 |
Subjects
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| publish_subject with 1 observer - on_next | 34.49 ns | 14.66 ns | 14.66 ns | 1.00 |
| subscribe 100 observers to publish_subject | 198874.33 ns | 15961.88 ns | 16355.43 ns | 0.98 |
| 100 on_next to 100 observers to publish_subject | 27542.87 ns | 17268.48 ns | 19297.93 ns | 0.89 |
Scenarios
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| basic sample | 1411.64 ns | 12.66 ns | 12.65 ns | 1.00 |
| basic sample with immediate scheduler | 1480.84 ns | 5.24 ns | 5.24 ns | 1.00 |
Aggregating Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+reduce(10, std::plus)+subscribe | 908.80 ns | 0.31 ns | 0.31 ns | 1.00 |
Error Handling Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| create(on_next(1), on_error())+on_error_resume_next(immediate_just(2)))+subscribe | 2020.04 ns | 988.59 ns | 990.54 ns | 1.00 |
| create(on_error())+retry(1)+subscribe | 607.18 ns | 130.81 ns | 115.34 ns | 1.13 |
ci-macos
General
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| Subscribe empty callbacks to empty observable | 1010.42 ns | 0.47 ns | 0.60 ns | 0.78 |
| Subscribe empty callbacks to empty observable via pipe operator | 1007.32 ns | 0.47 ns | 0.58 ns | 0.82 |
Sources
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| from array of 1 - create + subscribe + immediate | 1976.85 ns | 0.24 ns | 0.26 ns | 0.89 |
| from array of 1 - create + subscribe + current_thread | 2502.09 ns | 33.79 ns | 38.65 ns | 0.87 |
| concat_as_source of just(1 immediate) create + subscribe | 5505.64 ns | 317.62 ns | 351.67 ns | 0.90 |
| defer from array of 1 - defer + create + subscribe + immediate | 1983.70 ns | 0.23 ns | 0.26 ns | 0.91 |
| interval - interval + take(3) + subscribe + immediate | 4986.31 ns | 114.10 ns | 124.54 ns | 0.92 |
| interval - interval + take(3) + subscribe + current_thread | 6076.83 ns | 98.85 ns | 106.40 ns | 0.93 |
| from array of 1 - create + as_blocking + subscribe + new_thread | 89167.73 ns | 89880.25 ns | 95570.83 ns | 0.94 |
| from array of 1000 - create + as_blocking + subscribe + new_thread | 87182.10 ns | 87175.08 ns | 103187.36 ns | 0.84 |
| concat_as_source of just(1 immediate) and just(1,2 immediate)create + subscribe | 8362.43 ns | 361.65 ns | 405.12 ns | 0.89 |
Filtering Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+take(1)+subscribe | 2925.87 ns | 0.24 ns | 0.23 ns | 1.01 |
| immediate_just+filter(true)+subscribe | 2136.09 ns | 0.23 ns | 0.23 ns | 1.01 |
| immediate_just(1,2)+skip(1)+subscribe | 2786.82 ns | 0.23 ns | 0.23 ns | 1.00 |
| immediate_just(1,1,2)+distinct_until_changed()+subscribe | 2103.50 ns | 0.47 ns | 0.47 ns | 1.00 |
| immediate_just(1,2)+first()+subscribe | 3247.28 ns | 0.24 ns | 0.23 ns | 1.01 |
| immediate_just(1,2)+last()+subscribe | 2405.04 ns | 0.23 ns | 0.23 ns | 1.00 |
| immediate_just+take_last(1)+subscribe | 3092.74 ns | 0.23 ns | 0.23 ns | 1.01 |
| immediate_just(1,2,3)+element_at(1)+subscribe | 2152.72 ns | 0.23 ns | 0.29 ns | 0.81 |
Schedulers
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate scheduler create worker + schedule | 858.08 ns | 0.94 ns | 4.93 ns | 0.19 |
| current_thread scheduler create worker + schedule | 1198.63 ns | 34.14 ns | 116.11 ns | 0.29 |
| current_thread scheduler create worker + schedule + recursive schedule | 2017.68 ns | 202.99 ns | 226.20 ns | 0.90 |
Transforming Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+map(v*2)+subscribe | 2121.67 ns | 4.44 ns | 4.20 ns | 1.06 |
| immediate_just+scan(10, std::plus)+subscribe | 2363.88 ns | 0.47 ns | 0.47 ns | 1.00 |
| immediate_just+flat_map(immediate_just(v*2))+subscribe | 5387.47 ns | 374.93 ns | 373.21 ns | 1.00 |
| immediate_just+buffer(2)+subscribe | 2533.90 ns | 64.06 ns | 68.22 ns | 0.94 |
| immediate_just+window(2)+subscribe + subscsribe inner | 5552.89 ns | 2423.26 ns | 2363.91 ns | 1.03 |
Conditional Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+take_while(false)+subscribe | 2121.40 ns | - | - | 0.00 |
| immediate_just+take_while(true)+subscribe | 2127.72 ns | 0.23 ns | 0.23 ns | 1.01 |
Utility Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just(1)+subscribe_on(immediate)+subscribe | 4973.07 ns | 4.92 ns | 5.95 ns | 0.83 |
Combining Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just(immediate_just(1), immediate_just(1)) + merge() + subscribe | 8163.48 ns | 431.00 ns | 469.30 ns | 0.92 |
| immediate_just(1) + merge_with(immediate_just(2)) + subscribe | 8542.46 ns | 409.60 ns | 427.10 ns | 0.96 |
| immediate_just(1) + with_latest_from(immediate_just(2)) + subscribe | - | 453.02 ns | 453.63 ns | 1.00 |
| immediate_just(immediate_just(1),immediate_just(1)) + switch_on_next() + subscribe | 8248.57 ns | 1893.19 ns | 1945.74 ns | 0.97 |
| immediate_just(1) + zip(immediate_just(2)) + subscribe | 5249.77 ns | 825.00 ns | 827.10 ns | 1.00 |
| immediate_just(immediate_just(1), immediate_just(1)) + concat() + subscribe | 7580.73 ns | 665.04 ns | 886.27 ns | 0.75 |
Subjects
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| publish_subject with 1 observer - on_next | 75.41 ns | 50.28 ns | 53.14 ns | 0.95 |
| subscribe 100 observers to publish_subject | 354452.00 ns | 41217.11 ns | 45833.83 ns | 0.90 |
| 100 on_next to 100 observers to publish_subject | 52877.00 ns | 19418.38 ns | 22447.80 ns | 0.87 |
Scenarios
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| basic sample | 2794.41 ns | 69.24 ns | 78.27 ns | 0.88 |
| basic sample with immediate scheduler | 2789.01 ns | 18.76 ns | 21.17 ns | 0.89 |
Aggregating Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+reduce(10, std::plus)+subscribe | 2397.01 ns | 0.23 ns | 0.29 ns | 0.80 |
Error Handling Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| create(on_next(1), on_error())+on_error_resume_next(immediate_just(2)))+subscribe | 6643.49 ns | 4168.81 ns | 4350.13 ns | 0.96 |
| create(on_error())+retry(1)+subscribe | 1855.51 ns | 280.26 ns | 288.40 ns | 0.97 |
ci-ubuntu-clang
General
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| Subscribe empty callbacks to empty observable | 272.21 ns | 0.63 ns | 1.54 ns | 0.41 |
| Subscribe empty callbacks to empty observable via pipe operator | 311.05 ns | 0.63 ns | 1.54 ns | 0.41 |
Sources
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| from array of 1 - create + subscribe + immediate | 560.99 ns | 0.31 ns | 0.31 ns | 1.00 |
| from array of 1 - create + subscribe + current_thread | 811.53 ns | 4.01 ns | 4.01 ns | 1.00 |
| concat_as_source of just(1 immediate) create + subscribe | 2334.53 ns | 128.60 ns | 129.51 ns | 0.99 |
| defer from array of 1 - defer + create + subscribe + immediate | 773.49 ns | 0.31 ns | 0.31 ns | 1.00 |
| interval - interval + take(3) + subscribe + immediate | 2215.17 ns | 58.26 ns | 58.26 ns | 1.00 |
| interval - interval + take(3) + subscribe + current_thread | 3280.77 ns | 30.88 ns | 30.88 ns | 1.00 |
| from array of 1 - create + as_blocking + subscribe + new_thread | 28239.00 ns | 27554.49 ns | 28296.37 ns | 0.97 |
| from array of 1000 - create + as_blocking + subscribe + new_thread | 36118.79 ns | 33852.82 ns | 35617.48 ns | 0.95 |
| concat_as_source of just(1 immediate) and just(1,2 immediate)create + subscribe | 3647.61 ns | 147.62 ns | 147.42 ns | 1.00 |
Filtering Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+take(1)+subscribe | 1156.59 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just+filter(true)+subscribe | 849.43 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just(1,2)+skip(1)+subscribe | 1079.75 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just(1,1,2)+distinct_until_changed()+subscribe | 864.41 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just(1,2)+first()+subscribe | 1368.68 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just(1,2)+last()+subscribe | 997.61 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just+take_last(1)+subscribe | 1193.10 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just(1,2,3)+element_at(1)+subscribe | 861.12 ns | 0.31 ns | 0.31 ns | 1.00 |
Schedulers
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate scheduler create worker + schedule | 282.68 ns | 1.54 ns | 0.63 ns | 2.43 |
| current_thread scheduler create worker + schedule | 391.41 ns | 4.01 ns | 4.32 ns | 0.93 |
| current_thread scheduler create worker + schedule + recursive schedule | 854.17 ns | 56.80 ns | 54.88 ns | 1.03 |
Transforming Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+map(v*2)+subscribe | 841.02 ns | 0.31 ns | 0.31 ns | 1.00 |
| immediate_just+scan(10, std::plus)+subscribe | 964.95 ns | 0.62 ns | 0.62 ns | 1.00 |
| immediate_just+flat_map(immediate_just(v*2))+subscribe | 2249.35 ns | 144.59 ns | 142.77 ns | 1.01 |
| immediate_just+buffer(2)+subscribe | 1505.77 ns | 14.19 ns | 14.20 ns | 1.00 |
| immediate_just+window(2)+subscribe + subscsribe inner | 2452.76 ns | 903.82 ns | 911.43 ns | 0.99 |
Conditional Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+take_while(false)+subscribe | 828.81 ns | - | - | 0.00 |
| immediate_just+take_while(true)+subscribe | 862.41 ns | 0.31 ns | 0.31 ns | 1.00 |
Utility Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just(1)+subscribe_on(immediate)+subscribe | 1973.28 ns | 0.31 ns | 0.31 ns | 1.00 |
Combining Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just(immediate_just(1), immediate_just(1)) + merge() + subscribe | 3275.18 ns | 156.91 ns | 155.72 ns | 1.01 |
| immediate_just(1) + merge_with(immediate_just(2)) + subscribe | 3714.12 ns | 139.82 ns | 136.79 ns | 1.02 |
| immediate_just(1) + with_latest_from(immediate_just(2)) + subscribe | - | 143.34 ns | 142.90 ns | 1.00 |
| immediate_just(immediate_just(1),immediate_just(1)) + switch_on_next() + subscribe | 3371.73 ns | 834.73 ns | 827.38 ns | 1.01 |
| immediate_just(1) + zip(immediate_just(2)) + subscribe | 2211.69 ns | 206.04 ns | 206.35 ns | 1.00 |
| immediate_just(immediate_just(1), immediate_just(1)) + concat() + subscribe | 3200.16 ns | 222.63 ns | 224.94 ns | 0.99 |
Subjects
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| publish_subject with 1 observer - on_next | 52.22 ns | 17.94 ns | 17.95 ns | 1.00 |
| subscribe 100 observers to publish_subject | 217049.00 ns | 16646.23 ns | 16038.88 ns | 1.04 |
| 100 on_next to 100 observers to publish_subject | 38991.23 ns | 23666.46 ns | 20692.56 ns | 1.14 |
Scenarios
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| basic sample | 1317.96 ns | 11.42 ns | 11.42 ns | 1.00 |
| basic sample with immediate scheduler | 1290.43 ns | 6.17 ns | 6.17 ns | 1.00 |
Aggregating Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+reduce(10, std::plus)+subscribe | 980.56 ns | 0.31 ns | 0.31 ns | 1.00 |
Error Handling Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| create(on_next(1), on_error())+on_error_resume_next(immediate_just(2)))+subscribe | 2172.03 ns | 1185.86 ns | 1172.90 ns | 1.01 |
| create(on_error())+retry(1)+subscribe | 638.02 ns | 139.71 ns | 139.15 ns | 1.00 |
ci-windows
General
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| Subscribe empty callbacks to empty observable | 559.02 ns | 1.85 ns | 2.16 ns | 0.86 |
| Subscribe empty callbacks to empty observable via pipe operator | 581.85 ns | 1.85 ns | 2.16 ns | 0.86 |
Sources
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| from array of 1 - create + subscribe + immediate | 1141.94 ns | 5.55 ns | 5.55 ns | 1.00 |
| from array of 1 - create + subscribe + current_thread | 1415.21 ns | 15.74 ns | 15.74 ns | 1.00 |
| concat_as_source of just(1 immediate) create + subscribe | 3733.09 ns | 172.47 ns | 171.26 ns | 1.01 |
| defer from array of 1 - defer + create + subscribe + immediate | 1186.40 ns | 5.55 ns | 5.55 ns | 1.00 |
| interval - interval + take(3) + subscribe + immediate | 3403.57 ns | 140.91 ns | 140.00 ns | 1.01 |
| interval - interval + take(3) + subscribe + current_thread | 3444.85 ns | 59.23 ns | 59.74 ns | 0.99 |
| from array of 1 - create + as_blocking + subscribe + new_thread | 120770.00 ns | 115320.00 ns | 110990.00 ns | 1.04 |
| from array of 1000 - create + as_blocking + subscribe + new_thread | 131155.56 ns | 132911.11 ns | 128987.50 ns | 1.03 |
| concat_as_source of just(1 immediate) and just(1,2 immediate)create + subscribe | 5305.33 ns | 198.78 ns | 196.48 ns | 1.01 |
Filtering Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+take(1)+subscribe | 1813.82 ns | 19.73 ns | 19.43 ns | 1.02 |
| immediate_just+filter(true)+subscribe | 1621.71 ns | 18.80 ns | 18.51 ns | 1.02 |
| immediate_just(1,2)+skip(1)+subscribe | 1746.77 ns | 18.50 ns | 17.90 ns | 1.03 |
| immediate_just(1,1,2)+distinct_until_changed()+subscribe | 1350.33 ns | 23.46 ns | 20.68 ns | 1.13 |
| immediate_just(1,2)+first()+subscribe | 2386.00 ns | 17.28 ns | 18.21 ns | 0.95 |
| immediate_just(1,2)+last()+subscribe | 1482.96 ns | 18.51 ns | 19.14 ns | 0.97 |
| immediate_just+take_last(1)+subscribe | 1998.29 ns | 64.76 ns | 65.06 ns | 1.00 |
| immediate_just(1,2,3)+element_at(1)+subscribe | 1635.60 ns | 21.90 ns | 21.00 ns | 1.04 |
Schedulers
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate scheduler create worker + schedule | 478.87 ns | 4.01 ns | 4.01 ns | 1.00 |
| current_thread scheduler create worker + schedule | 646.92 ns | 11.62 ns | 11.60 ns | 1.00 |
| current_thread scheduler create worker + schedule + recursive schedule | 1343.37 ns | 102.19 ns | 104.05 ns | 0.98 |
Transforming Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+map(v*2)+subscribe | 1311.31 ns | 18.82 ns | 18.82 ns | 1.00 |
| immediate_just+scan(10, std::plus)+subscribe | 1424.47 ns | 21.29 ns | 20.96 ns | 1.02 |
| immediate_just+flat_map(immediate_just(v*2))+subscribe | 3817.39 ns | 178.75 ns | 204.01 ns | 0.88 |
| immediate_just+buffer(2)+subscribe | 2309.83 ns | 64.07 ns | 65.36 ns | 0.98 |
| immediate_just+window(2)+subscribe + subscsribe inner | 4022.75 ns | 1289.32 ns | 1322.29 ns | 0.98 |
Conditional Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+take_while(false)+subscribe | 1304.62 ns | 17.57 ns | 17.57 ns | 1.00 |
| immediate_just+take_while(true)+subscribe | 1317.44 ns | 18.81 ns | 18.51 ns | 1.02 |
Utility Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just(1)+subscribe_on(immediate)+subscribe | 3235.82 ns | 11.11 ns | 11.11 ns | 1.00 |
Combining Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just(immediate_just(1), immediate_just(1)) + merge() + subscribe | 5040.27 ns | 195.25 ns | 201.39 ns | 0.97 |
| immediate_just(1) + merge_with(immediate_just(2)) + subscribe | 5673.33 ns | 185.88 ns | 181.89 ns | 1.02 |
| immediate_just(1) + with_latest_from(immediate_just(2)) + subscribe | - | 213.40 ns | 208.78 ns | 1.02 |
| immediate_just(immediate_just(1),immediate_just(1)) + switch_on_next() + subscribe | 6053.16 ns | 948.97 ns | 960.61 ns | 0.99 |
| immediate_just(1) + zip(immediate_just(2)) + subscribe | 3810.93 ns | 518.45 ns | 510.38 ns | 1.02 |
| immediate_just(immediate_just(1), immediate_just(1)) + concat() + subscribe | 4833.62 ns | 339.13 ns | 336.56 ns | 1.01 |
Subjects
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| publish_subject with 1 observer - on_next | 36.81 ns | 20.33 ns | 20.12 ns | 1.01 |
| subscribe 100 observers to publish_subject | 262600.00 ns | 27533.33 ns | 27373.68 ns | 1.01 |
| 100 on_next to 100 observers to publish_subject | 51835.00 ns | 35736.67 ns | 35759.38 ns | 1.00 |
Scenarios
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| basic sample | 1862.05 ns | 96.09 ns | 95.77 ns | 1.00 |
| basic sample with immediate scheduler | 1876.75 ns | 68.50 ns | 68.43 ns | 1.00 |
Aggregating Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| immediate_just+reduce(10, std::plus)+subscribe | 1444.67 ns | 19.42 ns | 19.13 ns | 1.02 |
Error Handling Operators
| name | rxcpp | rpp | prev rpp | ratio |
|---|---|---|---|---|
| create(on_next(1), on_error())+on_error_resume_next(immediate_just(2)))+subscribe | 1901.73 ns | 358.04 ns | 354.01 ns | 1.01 |
| create(on_error())+retry(1)+subscribe | 1571.23 ns | 141.64 ns | 140.22 ns | 1.01 |
Co-authored-by: Markus Werle <daixtrose@users.noreply.github.com>
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## v2 #679 +/- ##
=======================================
Coverage 98.64% 98.64%
=======================================
Files 155 155
Lines 9764 9764
=======================================
Hits 9632 9632
Misses 132 132 ☔ View full report in Codecov by Sentry. |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Outside diff range and nitpick comments (2)
src/rpp/rpp/disposables/disposable_wrapper.hpp (2)
108-136: Documentation improvements suggested for better clarity.While the documentation is comprehensive, consider these enhancements:
- Make the code example on line 120 more concrete by showing a real disposable type (e.g.,
callback_disposableorcomposite_disposable).- Clarify the performance consideration statement on line 123 by explaining the overhead of returning disposables.
- Add a brief type hierarchy diagram or explanation showing the relationship between
interface_disposable,composite_disposable, and other disposable types.
155-160: Enhance make method documentation with more details.Consider improving the documentation by:
- Expanding the code example to show constructor arguments:
// Example with constructor arguments auto d = rpp::disposable_wrapper<rpp::interface_composite_disposable>::make<rpp::composite_disposable>( /* constructor args */ );
- Documenting the template parameter constraints and explaining when to use custom disposable types vs. the default.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (2)
src/rpp/rpp/disposables.hpp(1 hunks)src/rpp/rpp/disposables/disposable_wrapper.hpp(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- src/rpp/rpp/disposables.hpp
|



Summary by CodeRabbit
Disposableclass, detailing upstream and external disposables.disposable_wrapperclass, emphasizing its role as a smart pointer for disposables and providing clearer usage examples.