]> git.sesse.net Git - casparcg/blob - dependencies64/RxCpp/include/rxcpp/operators/rx-map.hpp
* Added RxCpp library for LINQ api, replacing Boost.Range based iterations where...
[casparcg] / dependencies64 / RxCpp / include / rxcpp / operators / rx-map.hpp
1 // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
2
3 #pragma once
4
5 #if !defined(RXCPP_OPERATORS_RX_MAP_HPP)
6 #define RXCPP_OPERATORS_RX_MAP_HPP
7
8 #include "../rx-includes.hpp"
9
10 namespace rxcpp {
11
12 namespace operators {
13
14 namespace detail {
15
16
17 template<class T, class Selector>
18 struct map
19 {
20     typedef typename std::decay<T>::type source_value_type;
21     typedef typename std::decay<Selector>::type select_type;
22     typedef decltype((*(select_type*)nullptr)(*(source_value_type*)nullptr)) value_type;
23     select_type selector;
24
25     map(select_type s)
26         : selector(std::move(s))
27     {
28     }
29
30     template<class Subscriber>
31     struct map_observer
32     {
33         typedef map_observer<Subscriber> this_type;
34         typedef decltype((*(select_type*)nullptr)(*(source_value_type*)nullptr)) value_type;
35         typedef typename std::decay<Subscriber>::type dest_type;
36         typedef observer<T, this_type> observer_type;
37         dest_type dest;
38         select_type selector;
39
40         map_observer(dest_type d, select_type s)
41             : dest(std::move(d))
42             , selector(std::move(s))
43         {
44         }
45         void on_next(source_value_type v) const {
46             auto selected = on_exception(
47                 [&](){
48                     return this->selector(std::move(v));},
49                 dest);
50             if (selected.empty()) {
51                 return;
52             }
53             dest.on_next(std::move(selected.get()));
54         }
55         void on_error(std::exception_ptr e) const {
56             dest.on_error(e);
57         }
58         void on_completed() const {
59             dest.on_completed();
60         }
61
62         static subscriber<T, observer_type> make(dest_type d, select_type s) {
63             auto cs = d.get_subscription();
64             return make_subscriber<T>(std::move(cs), observer_type(this_type(std::move(d), std::move(s))));
65         }
66     };
67
68     template<class Subscriber>
69     auto operator()(Subscriber dest) const
70         -> decltype(map_observer<Subscriber>::make(std::move(dest), selector)) {
71         return      map_observer<Subscriber>::make(std::move(dest), selector);
72     }
73 };
74
75 template<class Selector>
76 class map_factory
77 {
78     typedef typename std::decay<Selector>::type select_type;
79     select_type selector;
80 public:
81     map_factory(select_type s) : selector(std::move(s)) {}
82     template<class Observable>
83     auto operator()(Observable&& source)
84         -> decltype(source.template lift<typename map<typename std::decay<Observable>::type::value_type, select_type>::value_type>(map<typename std::decay<Observable>::type::value_type, select_type>(selector))) {
85         return      source.template lift<typename map<typename std::decay<Observable>::type::value_type, select_type>::value_type>(map<typename std::decay<Observable>::type::value_type, select_type>(selector));
86     }
87 };
88
89 }
90
91 template<class Selector>
92 auto map(Selector&& p)
93     ->      detail::map_factory<Selector> {
94     return  detail::map_factory<Selector>(std::forward<Selector>(p));
95 }
96
97 }
98
99 }
100
101 #endif