5 #if !defined(RXCPP_RX_OBSERVER_HPP) 6 #define RXCPP_RX_OBSERVER_HPP 24 void operator()(
const T&)
const {}
38 struct OnCompletedEmpty
40 void operator()()
const {}
43 template<
class T,
class State,
class OnNext>
46 using state_t = rxu::decay_t<State>;
47 using onnext_t = rxu::decay_t<OnNext>;
48 OnNextForward() : onnext() {}
49 explicit OnNextForward(onnext_t on) : onnext(std::move(on)) {}
51 void operator()(state_t& s, T& t)
const {
54 void operator()(state_t& s, T&& t)
const {
58 template<
class T,
class State>
59 struct OnNextForward<T, State, void>
61 using state_t = rxu::decay_t<State>;
63 void operator()(state_t& s, T& t)
const {
66 void operator()(state_t& s, T&& t)
const {
71 template<
class State,
class OnError>
74 using state_t = rxu::decay_t<State>;
75 using onerror_t = rxu::decay_t<OnError>;
76 OnErrorForward() : onerror() {}
77 explicit OnErrorForward(onerror_t oe) : onerror(std::move(oe)) {}
84 struct OnErrorForward<State, void>
86 using state_t = rxu::decay_t<State>;
93 template<
class State,
class OnCompleted>
94 struct OnCompletedForward
96 using state_t = rxu::decay_t<State>;
97 using oncompleted_t = rxu::decay_t<OnCompleted>;
98 OnCompletedForward() : oncompleted() {}
99 explicit OnCompletedForward(oncompleted_t oc) : oncompleted(std::move(oc)) {}
100 oncompleted_t oncompleted;
101 void operator()(state_t& s)
const {
105 template<
class State>
106 struct OnCompletedForward<State, void>
108 OnCompletedForward() {}
109 void operator()(State& s)
const {
114 template<
class T,
class F>
118 template<
class CT,
class CF>
119 static auto check(
int) -> decltype((*(CF*)
nullptr)(*(CT*)
nullptr));
120 template<
class CT,
class CF>
121 static not_void check(...);
123 typedef decltype(check<T, rxu::decay_t<F>>(0)) detail_result;
124 static const
bool value = std::is_same<detail_result,
void>::value;
132 static auto check(
int) -> decltype((*(CF*)
nullptr)(*(
rxu::error_ptr*)
nullptr));
134 static not_void check(...);
136 static const bool value = std::is_same<decltype(check<rxu::decay_t<F>>(0)),
void>::value;
139 template<
class State,
class F>
140 struct is_on_error_for
144 static auto check(
int) -> decltype((*(CF*)
nullptr)(*(State*)
nullptr, *(
rxu::error_ptr*)
nullptr));
146 static not_void check(...);
148 static const bool value = std::is_same<decltype(check<rxu::decay_t<F>>(0)),
void>::value;
152 struct is_on_completed
156 static auto check(
int) -> decltype((*(CF*)
nullptr)());
158 static not_void check(...);
160 static const bool value = std::is_same<decltype(check<rxu::decay_t<F>>(0)),
void>::value;
178 template<
class T,
class State,
class OnNext,
class OnError,
class OnCompleted>
184 using on_next_t =
typename std::conditional<
185 !std::is_same<void, OnNext>::value,
187 detail::OnNextForward<T, State, OnNext>>::type;
189 !std::is_same<void, OnError>::value,
191 detail::OnErrorForward<State, OnError>>::type;
193 !std::is_same<void, OnCompleted>::value,
195 detail::OnCompletedForward<State, OnCompleted>>::type;
206 : state(std::move(s))
207 , onnext(std::move(n))
208 , onerror(std::move(e))
209 , oncompleted(std::move(c))
213 : state(std::move(s))
214 , onnext(std::move(n))
216 , oncompleted(std::move(c))
223 , oncompleted(o.oncompleted)
227 : state(std::move(o.state))
228 , onnext(std::move(o.onnext))
229 , onerror(std::move(o.onerror))
230 , oncompleted(std::move(o.oncompleted))
234 state = std::move(o.state);
235 onnext = std::move(o.onnext);
236 onerror = std::move(o.onerror);
237 oncompleted = std::move(o.oncompleted);
245 onnext(state, std::move(t));
269 template<
class T,
class OnNext,
class OnError,
class OnCompleted>
270 class observer<T, detail::stateless_observer_tag, OnNext, OnError, OnCompleted> :
public observer_base<T>
273 using this_type = observer<T, detail::stateless_observer_tag, OnNext, OnError, OnCompleted>;
274 using on_next_t =
typename std::conditional<
275 !std::is_same<void, OnNext>::value,
276 rxu::decay_t<OnNext>,
277 detail::OnNextEmpty<T>>::type;
278 using on_error_t =
typename std::conditional<
279 !std::is_same<void, OnError>::value,
280 rxu::decay_t<OnError>,
281 detail::OnErrorEmpty>::type;
282 using on_completed_t =
typename std::conditional<
283 !std::is_same<void, OnCompleted>::value,
284 rxu::decay_t<OnCompleted>,
285 detail::OnCompletedEmpty>::type;
290 on_completed_t oncompleted;
293 static_assert(detail::is_on_next_of<T, on_next_t>::value,
"Function supplied for on_next must be a function with the signature void(T);");
294 static_assert(detail::is_on_error<on_error_t>::value,
"Function supplied for on_error must be a function with the signature void(rxu::error_ptr);");
295 static_assert(detail::is_on_completed<on_completed_t>::value,
"Function supplied for on_completed must be a function with the signature void();");
298 : onnext(on_next_t())
299 , onerror(on_error_t())
300 , oncompleted(on_completed_t())
304 explicit observer(on_next_t n, on_error_t e = on_error_t(), on_completed_t c = on_completed_t())
305 : onnext(std::move(n))
306 , onerror(std::move(e))
307 , oncompleted(std::move(c))
310 observer(
const this_type& o)
313 , oncompleted(o.oncompleted)
316 observer(this_type&& o)
317 : onnext(std::move(o.onnext))
318 , onerror(std::move(o.onerror))
319 , oncompleted(std::move(o.oncompleted))
322 this_type& operator=(this_type o) {
323 onnext = std::move(o.onnext);
324 onerror = std::move(o.onerror);
325 oncompleted = std::move(o.oncompleted);
329 void on_next(T& t)
const {
332 void on_next(T&& t)
const {
333 onnext(std::move(t));
338 void on_completed()
const {
342 return observer<T>(*this);
350 struct virtual_observer :
public std::enable_shared_from_this<virtual_observer<T>>
352 virtual ~virtual_observer() {}
353 virtual void on_next(T&)
const {};
354 virtual void on_next(T&&)
const {};
356 virtual void on_completed()
const {};
359 template<
class T,
class Observer>
360 struct specific_observer :
public virtual_observer<T>
362 explicit specific_observer(Observer o)
363 : destination(std::move(o))
367 Observer destination;
368 virtual void on_next(T& t)
const {
369 destination.on_next(t);
371 virtual void on_next(T&& t)
const {
372 destination.on_next(std::move(t));
375 destination.on_error(e);
377 virtual void on_completed()
const {
378 destination.on_completed();
401 using virtual_observer = detail::virtual_observer<T>;
403 std::shared_ptr<virtual_observer> destination;
405 template<
class Observer>
406 static auto make_destination(Observer o)
407 -> std::shared_ptr<virtual_observer> {
408 return std::make_shared<detail::specific_observer<T, Observer>>(std::move(o));
416 : destination(o.destination)
420 : destination(std::move(o.destination))
424 template<
class Observer>
426 : destination(make_destination(std::move(o)))
431 destination = std::move(o.destination);
439 destination->on_next(std::forward<V>(v));
444 destination->on_error(e);
449 destination->on_completed();
458 template<
class T,
class DefaultOnError = detail::OnErrorEmpty>
464 template<
class T,
class DefaultOnError = detail::OnErrorEmpty,
class U,
class State,
class OnNext,
class OnError,
class OnCompleted>
469 template<
class T,
class DefaultOnError = detail::OnErrorEmpty,
class Observer>
471 ->
typename std::enable_if<
472 !detail::is_on_next_of<T, Observer>::value &&
473 !detail::is_on_error<Observer>::value &&
476 return std::move(ob);
478 template<
class T,
class DefaultOnError = detail::OnErrorEmpty,
class Observer>
480 ->
typename std::enable_if<
481 !detail::is_on_next_of<T, Observer>::value &&
482 !detail::is_on_error<Observer>::value &&
484 observer<T, Observer>>::type {
485 return observer<T, Observer>(std::move(ob));
487 template<
class T,
class DefaultOnError = detail::OnErrorEmpty,
class OnNext>
489 ->
typename std::enable_if<
490 detail::is_on_next_of<T, OnNext>::value,
495 template<
class T,
class DefaultOnError = detail::OnErrorEmpty,
class OnError>
497 ->
typename std::enable_if<
498 !detail::is_on_next_of<T, OnError>::value &&
499 detail::is_on_error<OnError>::value,
502 detail::OnNextEmpty<T>(), std::move(oe));
504 template<
class T,
class DefaultOnError = detail::OnErrorEmpty,
class OnNext,
class OnError>
506 ->
typename std::enable_if<
507 detail::is_on_next_of<T, OnNext>::value &&
508 detail::is_on_error<OnError>::value,
511 std::move(on), std::move(oe));
513 template<
class T,
class DefaultOnError = detail::OnErrorEmpty,
class OnNext,
class OnCompleted>
515 ->
typename std::enable_if<
516 detail::is_on_next_of<T, OnNext>::value &&
517 detail::is_on_completed<OnCompleted>::value,
520 std::move(on), DefaultOnError(), std::move(oc));
522 template<
class T,
class DefaultOnError = detail::OnErrorEmpty,
class OnNext,
class OnError,
class OnCompleted>
524 ->
typename std::enable_if<
525 detail::is_on_next_of<T, OnNext>::value &&
526 detail::is_on_error<OnError>::value &&
527 detail::is_on_completed<OnCompleted>::value,
530 std::move(on), std::move(oe), std::move(oc));
534 template<
class T,
class State,
class OnNext>
536 ->
typename std::enable_if<
537 !detail::is_on_next_of<T, State>::value &&
538 !detail::is_on_error<State>::value,
541 std::move(os), std::move(on));
543 template<
class T,
class State,
class OnError>
545 ->
typename std::enable_if<
546 !detail::is_on_next_of<T, State>::value &&
547 !detail::is_on_error<State>::value &&
548 detail::is_on_error_for<State, OnError>::value,
551 std::move(os), detail::OnNextEmpty<T>(), std::move(oe));
553 template<
class T,
class State,
class OnNext,
class OnError>
555 ->
typename std::enable_if<
556 !detail::is_on_next_of<T, State>::value &&
557 !detail::is_on_error<State>::value &&
558 detail::is_on_error_for<State, OnError>::value,
561 std::move(os), std::move(on), std::move(oe));
563 template<
class T,
class State,
class OnNext,
class OnCompleted>
565 ->
typename std::enable_if<
566 !detail::is_on_next_of<T, State>::value &&
567 !detail::is_on_error<State>::value,
570 std::move(os), std::move(on), std::move(oc));
572 template<
class T,
class State,
class OnNext,
class OnError,
class OnCompleted>
574 ->
typename std::enable_if<
575 !detail::is_on_next_of<T, State>::value &&
576 !detail::is_on_error<State>::value &&
577 detail::is_on_error_for<State, OnError>::value,
580 std::move(os), std::move(on), std::move(oe), std::move(oc));
583 template<
class T,
class Observer>
585 ->
typename std::enable_if<
586 !detail::is_on_next_of<T, Observer>::value,
590 template<
class T,
class OnNext>
592 ->
typename std::enable_if<
593 detail::is_on_next_of<T, OnNext>::value,
596 make_observer<T>(std::forward<OnNext>(on)));
598 template<
class T,
class OnNext,
class OnError>
600 ->
typename std::enable_if<
601 detail::is_on_next_of<T, OnNext>::value &&
602 detail::is_on_error<OnError>::value,
605 make_observer<T>(std::forward<OnNext>(on), std::forward<OnError>(oe)));
607 template<
class T,
class OnNext,
class OnCompleted>
609 ->
typename std::enable_if<
610 detail::is_on_next_of<T, OnNext>::value &&
611 detail::is_on_completed<OnCompleted>::value,
614 make_observer<T>(std::forward<OnNext>(on), std::forward<OnCompleted>(oc)));
616 template<
class T,
class OnNext,
class OnError,
class OnCompleted>
618 ->
typename std::enable_if<
619 detail::is_on_next_of<T, OnNext>::value &&
620 detail::is_on_error<OnError>::value &&
621 detail::is_on_completed<OnCompleted>::value,
624 make_observer<T>(std::forward<OnNext>(on), std::forward<OnError>(oe), std::forward<OnCompleted>(oc)));
630 struct maybe_from_result
632 typedef decltype((*(F*)
nullptr)()) decl_result_type;
633 typedef rxu::
decay_t<decl_result_type> result_type;
634 typedef rxu::maybe<result_type> type;
639 template<class F, class OnError>
641 -> typename std::enable_if<detail::is_on_error<OnError>::value, typename detail::maybe_from_result<F>::type>::type {
642 typename detail::maybe_from_result<F>::type r;
651 template<
class F,
class Subscriber>
653 ->
typename std::enable_if<is_subscriber<Subscriber>::value,
typename detail::maybe_from_result<F>::type>::type {
654 typename detail::maybe_from_result<F>::type r;
typename std::conditional< !std::is_same< void, OnCompleted >::value, rxu::decay_t< OnCompleted >, detail::OnCompletedForward< State, OnCompleted > >::type on_completed_t
Definition: rx-observer.hpp:195
#define RXCPP_TRY
Definition: rx-util.hpp:38
observer()
Definition: rx-observer.hpp:412
Definition: rx-predef.hpp:88
typename std::conditional< !std::is_same< void, OnError >::value, rxu::decay_t< OnError >, detail::OnErrorForward< State, OnError > >::type on_error_t
Definition: rx-observer.hpp:191
std::shared_ptr< util::detail::error_base > error_ptr
Definition: rx-util.hpp:874
Definition: rx-all.hpp:26
void on_error(rxu::error_ptr e) const
Definition: rx-observer.hpp:247
void on_error(rxu::error_ptr e) const
Definition: rx-observer.hpp:442
observer(state_t s, on_next_t n, on_completed_t c)
Definition: rx-observer.hpp:212
observer(Observer o)
Definition: rx-observer.hpp:425
observer(this_type &&o)
Definition: rx-observer.hpp:419
static const bool value
Definition: rx-predef.hpp:97
void on_next(T &&t) const
Definition: rx-observer.hpp:244
#define RXCPP_CATCH(...)
Definition: rx-util.hpp:39
typename std::decay< T >::type decay_t
Definition: rx-util.hpp:48
typename std::conditional< !std::is_same< void, OnNext >::value, rxu::decay_t< OnNext >, detail::OnNextForward< T, State, OnNext > >::type on_next_t
Definition: rx-observer.hpp:187
Definition: rx-predef.hpp:100
this_type & operator=(this_type o)
Definition: rx-observer.hpp:430
observer< T > as_dynamic() const
Definition: rx-observer.hpp:253
void on_next(T &t) const
Definition: rx-observer.hpp:241
void on_completed() const
Definition: rx-observer.hpp:447
observer(state_t s, on_next_t n=on_next_t(), on_error_t e=on_error_t(), on_completed_t c=on_completed_t())
Definition: rx-observer.hpp:205
this_type & operator=(this_type o)
Definition: rx-observer.hpp:233
observer(const this_type &o)
Definition: rx-observer.hpp:219
tag_dynamic_observer dynamic_observer_tag
Definition: rx-observer.hpp:396
tag_observer observer_tag
Definition: rx-observer.hpp:17
auto make_observer() -> observer< T, detail::stateless_observer_tag, detail::OnNextEmpty< T >, DefaultOnError >
Definition: rx-observer.hpp:459
void on_next(V &&v) const
Definition: rx-observer.hpp:437
error_ptr current_exception()
Definition: rx-util.hpp:943
Definition: rx-observer.hpp:14
consumes values from an observable using State that may implement on_next, on_error and on_completed ...
Definition: rx-observer.hpp:179
observer(this_type &&o)
Definition: rx-observer.hpp:226
auto on_exception(const F &f, const OnError &c) -> typename std::enable_if< detail::is_on_error< OnError >::value, typename detail::maybe_from_result< F >::type >::type
Definition: rx-observer.hpp:640
T value_type
Definition: rx-observer.hpp:16
consumes values from an observable using type-forgetting (shared allocated state with virtual methods...
Definition: rx-observer.hpp:393
auto make_observer_dynamic(Observer o) -> typename std::enable_if< !detail::is_on_next_of< T, Observer >::value, observer< T >>::type
Definition: rx-observer.hpp:584
auto as_dynamic() -> detail::dynamic_factory
Definition: rx-subscribe.hpp:117
Definition: rx-predef.hpp:90
void on_completed() const
Definition: rx-observer.hpp:250
observer(const this_type &o)
Definition: rx-observer.hpp:415
observer< T > as_dynamic() const
Definition: rx-observer.hpp:453
rxu::decay_t< State > state_t
Definition: rx-observer.hpp:183