Home | History | Annotate | only in /external/Reactive-Extensions/RxCpp
Up to higher level directory
NameDateSize
.editorconfig22-Oct-2020148
.gitattributes22-Oct-20202.5K
.travis.yml22-Oct-20207.8K
Android.bp22-Oct-20201.5K
appveyor.yml22-Oct-20201K
AUTHORS.txt22-Oct-2020539
CMakeLists.txt22-Oct-2020111
DeveloperManual.md22-Oct-20203.2K
Ix/22-Oct-2020
LICENSE22-Oct-202011.1K
license.md22-Oct-202011.1K
METADATA22-Oct-2020443
MODULE_LICENSE_APACHE222-Oct-20200
NOTICE22-Oct-202011.1K
OWNERS22-Oct-2020135
projects/22-Oct-2020
Readme.html22-Oct-202030.8K
README.md22-Oct-20209.3K
Rx/22-Oct-2020

README.md

      1 The Reactive Extensions for C++ (__RxCpp__) is a library of algorithms for values-distributed-in-time. The [__Range-v3__](https://github.com/ericniebler/range-v3) library does the same for values-distributed-in-space.
      2 
      3 Platform    | Status | 
      4 ----------- | :------------ |
      5 Windows | [![Windows Status](http://img.shields.io/appveyor/ci/kirkshoop/RxCpp-446.svg?style=flat-square)](https://ci.appveyor.com/project/kirkshoop/rxcpp-446)
      6 Linux & OSX | [![Linux & Osx Status](http://img.shields.io/travis/ReactiveX/RxCpp.svg?style=flat-square)](https://travis-ci.org/ReactiveX/RxCpp)
      7 
      8 Source        | Badges |
      9 ------------- | :--------------- |
     10 Github | [![GitHub license](https://img.shields.io/github/license/ReactiveX/RxCpp.svg?style=flat-square)](https://github.com/ReactiveX/RxCpp) <br/> [![GitHub release](https://img.shields.io/github/release/ReactiveX/RxCpp.svg?style=flat-square)](https://github.com/ReactiveX/RxCpp/releases) <br/> [![GitHub commits](https://img.shields.io/github/commits-since/ReactiveX/RxCpp/4.1.0.svg?style=flat-square)](https://github.com/ReactiveX/RxCpp)
     11 Gitter.im | [![Join in on gitter.im](https://img.shields.io/gitter/room/Reactive-Extensions/RxCpp.svg?style=flat-square)](https://gitter.im/ReactiveX/RxCpp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
     12 Packages | [![NuGet version](http://img.shields.io/nuget/v/RxCpp.svg?style=flat-square)](http://www.nuget.org/packages/RxCpp/) [![vcpkg port](https://img.shields.io/badge/vcpkg-port-blue.svg?style=flat-square)](https://github.com/Microsoft/vcpkg/tree/master/ports/rxcpp)
     13 Documentation | [![rxcpp doxygen documentation](https://img.shields.io/badge/rxcpp-latest-brightgreen.svg?style=flat-square)](http://reactivex.github.io/RxCpp) <br/> [![reactivex intro](https://img.shields.io/badge/reactivex.io-intro-brightgreen.svg?style=flat-square)](http://reactivex.io/intro.html) [![rx marble diagrams](https://img.shields.io/badge/rxmarbles-diagrams-brightgreen.svg?style=flat-square)](http://rxmarbles.com/)
     14 
     15 # Usage
     16 
     17 __RxCpp__ is a header-only C++ library that only depends on the standard library. The CMake build generates documentation and unit tests. The unit tests depend on a git submodule for the [Catch](https://github.com/philsquared/Catch) library.
     18 
     19 # Example
     20 Add `Rx/v2/src` to the include paths
     21 
     22 [![lines from bytes](https://img.shields.io/badge/blog%20post-lines%20from%20bytes-blue.svg?style=flat-square)](http://kirkshoop.github.io/async/rxcpp/c++/2015/07/07/rxcpp_-_parsing_bytes_to_lines_of_text.html)
     23 
     24 ```cpp
     25 #include "rxcpp/rx.hpp"
     26 namespace Rx {
     27 using namespace rxcpp;
     28 using namespace rxcpp::sources;
     29 using namespace rxcpp::operators;
     30 using namespace rxcpp::util;
     31 }
     32 using namespace Rx;
     33 
     34 #include <regex>
     35 #include <random>
     36 using namespace std;
     37 using namespace std::chrono;
     38 
     39 int main()
     40 {
     41     random_device rd;   // non-deterministic generator
     42     mt19937 gen(rd());
     43     uniform_int_distribution<> dist(4, 18);
     44 
     45     // for testing purposes, produce byte stream that from lines of text
     46     auto bytes = range(0, 10) |
     47         flat_map([&](int i){
     48             auto body = from((uint8_t)('A' + i)) |
     49                 repeat(dist(gen)) |
     50                 as_dynamic();
     51             auto delim = from((uint8_t)'\r');
     52             return from(body, delim) | concat();
     53         }) |
     54         window(17) |
     55         flat_map([](observable<uint8_t> w){
     56             return w |
     57                 reduce(
     58                     vector<uint8_t>(),
     59                     [](vector<uint8_t> v, uint8_t b){
     60                         v.push_back(b);
     61                         return v;
     62                     }) |
     63                 as_dynamic();
     64         }) |
     65         tap([](vector<uint8_t>& v){
     66             // print input packet of bytes
     67             copy(v.begin(), v.end(), ostream_iterator<long>(cout, " "));
     68             cout << endl;
     69         });
     70 
     71     //
     72     // recover lines of text from byte stream
     73     //
     74     
     75     auto removespaces = [](string s){
     76         s.erase(remove_if(s.begin(), s.end(), ::isspace), s.end());
     77         return s;
     78     };
     79 
     80     // create strings split on \r
     81     auto strings = bytes |
     82         concat_map([](vector<uint8_t> v){
     83             string s(v.begin(), v.end());
     84             regex delim(R"/(\r)/");
     85             cregex_token_iterator cursor(&s[0], &s[0] + s.size(), delim, {-1, 0});
     86             cregex_token_iterator end;
     87             vector<string> splits(cursor, end);
     88             return iterate(move(splits));
     89         }) |
     90         filter([](const string& s){
     91             return !s.empty();
     92         }) |
     93         publish() |
     94         ref_count();
     95 
     96     // filter to last string in each line
     97     auto closes = strings |
     98         filter(
     99             [](const string& s){
    100                 return s.back() == '\r';
    101             }) |
    102         Rx::map([](const string&){return 0;});
    103 
    104     // group strings by line
    105     auto linewindows = strings |
    106         window_toggle(closes | start_with(0), [=](int){return closes;});
    107 
    108     // reduce the strings for a line into one string
    109     auto lines = linewindows |
    110         flat_map([&](observable<string> w) {
    111             return w | start_with<string>("") | sum() | Rx::map(removespaces);
    112         });
    113 
    114     // print result
    115     lines |
    116         subscribe<string>(println(cout));
    117 
    118     return 0;
    119 }
    120 ```
    121 
    122 # Reactive Extensions
    123 
    124 >The ReactiveX Observable model allows you to treat streams of asynchronous events with the same sort of simple, composable operations that you use for collections of data items like arrays. It frees you from tangled webs of callbacks, and thereby makes your code more readable and less prone to bugs.
    125 
    126 Credit [ReactiveX.io](http://reactivex.io/intro.html)
    127 
    128 ### Other language implementations
    129 
    130 * Java: [RxJava](https://github.com/ReactiveX/RxJava)
    131 * JavaScript: [rxjs](https://github.com/ReactiveX/rxjs)
    132 * C#: [Rx.NET](https://github.com/Reactive-Extensions/Rx.NET)
    133 * [More..](http://reactivex.io/languages.html)
    134 
    135 ### Resources
    136 
    137 * [Intro](http://reactivex.io/intro.html)
    138 * [Tutorials](http://reactivex.io/tutorials.html)
    139 * [Marble Diagrams](http://rxmarbles.com/)
    140 * [twitter stream analysis app](https://github.com/kirkshoop/twitter)
    141   * [![baldwin pass to wilson](https://img.youtube.com/vi/QkvCzShHyVU/0.jpg)](https://www.youtube.com/watch?v=QkvCzShHyVU)
    142 * _Algorithm Design For Values Distributed In Time_
    143   * [![C++ Russia 2016](https://img.youtube.com/vi/Re6DS5Ff0uE/0.jpg)](https://www.youtube.com/watch?v=Re6DS5Ff0uE)
    144   * [![CppCon 2016](https://img.youtube.com/vi/FcQURwM806o/0.jpg)](https://www.youtube.com/watch?v=FcQURwM806o)
    145 
    146 # Cloning RxCpp
    147 
    148 RxCpp uses a git submodule (in `ext/catch`) for the excellent [Catch](https://github.com/philsquared/Catch) library. The easiest way to ensure that the submodules are included in the clone is to add `--recursive` in the clone command.
    149 
    150 ```shell
    151 git clone --recursive https://github.com/ReactiveX/RxCpp.git
    152 cd RxCpp
    153 ```
    154 
    155 # Building RxCpp Unit Tests
    156 
    157 * RxCpp is regularly tested on OSX and Windows.
    158 * RxCpp is regularly built with Clang, Gcc and VC
    159 * RxCpp depends on the latest compiler releases.
    160 
    161 RxCpp uses CMake to create build files for several platforms and IDE's
    162 
    163 ### ide builds
    164 
    165 #### XCode
    166 ```shell
    167 mkdir projects/build
    168 cd projects/build
    169 cmake -G"Xcode" ../CMake -B.
    170 ```
    171 
    172 #### Visual Studio 2017
    173 ```batch
    174 mkdir projects\build
    175 cd projects\build
    176 cmake -G "Visual Studio 15" ..\CMake\
    177 msbuild Project.sln
    178 ```
    179 
    180 ### makefile builds
    181 
    182 #### OSX
    183 ```shell
    184 mkdir projects/build
    185 cd projects/build
    186 cmake -G"Unix Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -B. ../CMake
    187 make
    188 ```
    189 
    190 #### Linux --- Clang
    191 ```shell
    192 mkdir projects/build
    193 cd projects/build
    194 cmake -G"Unix Makefiles" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_EXE_LINKER_FLAGS="-stdlib=libc++" -B. ../CMake
    195 make
    196 ```
    197 
    198 #### Linux --- GCC
    199 ```shell
    200 mkdir projects/build
    201 cd projects/build
    202 cmake -G"Unix Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -B. ../CMake
    203 make
    204 ```
    205 
    206 #### Windows
    207 ```batch
    208 mkdir projects\build
    209 cd projects\build
    210 cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -B. ..\CMake
    211 nmake
    212 ```
    213 
    214 The build only produces test and example binaries.
    215 
    216 # Running tests
    217 
    218 * You can use the CMake test runner `ctest`
    219 * You can run the test binaries directly `rxcpp_test_*`
    220 * Tests can be selected by name or tag
    221 Example of by-tag
    222 
    223 `rxcpp_test_subscription [perf]`
    224 
    225 # Documentation
    226 
    227 RxCpp uses Doxygen to generate project [documentation](http://reactivex.github.io/RxCpp).
    228 
    229 When Doxygen+Graphviz is installed, CMake creates a special build task named `doc`. It creates actual documentation and puts it to `projects/doxygen/html/` folder, which can be published to the `gh-pages` branch. Each merged pull request will build the docs and publish them.
    230 
    231 [Developers Material](DeveloperManual.md)
    232 
    233 # Contributing Code
    234 
    235 Before submitting a feature or substantial code contribution please  discuss it with the team and ensure it follows the product roadmap. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.
    236 
    237 # Microsoft Open Source Code of Conduct
    238 This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode (a] microsoft.com](mailto:opencode (a] microsoft.com) with any additional questions or comments. 
    239