5 #if !defined(RXCPP_SOURCES_RX_ERROR_HPP)
6 #define RXCPP_SOURCES_RX_ERROR_HPP
8 #include "../rx-includes.hpp"
38 template<
class T,
class Coordination>
39 struct error :
public source_base<T>
41 typedef error<T, Coordination> this_type;
43 typedef rxu::decay_t<Coordination> coordination_type;
45 typedef typename coordination_type::coordinator_type coordinator_type;
47 struct error_initial_type
51 , coordination(std::move(cn))
55 coordination_type coordination;
57 error_initial_type initial;
60 : initial(e, std::move(cn))
64 template<
class Subscriber>
65 void on_subscribe(Subscriber o)
const {
68 auto coordinator = initial.coordination.create_coordinator(o.get_subscription());
69 auto controller = coordinator.get_worker();
70 auto exception = initial.exception;
72 auto producer = [=](
const rxsc::schedulable&){
74 if (!dest.is_subscribed()) {
79 dest.on_error(exception);
83 [&](){
return coordinator.act(producer);},
85 if (selectedProducer.empty()) {
88 controller.schedule(selectedProducer.get());
92 struct throw_ptr_tag{};
93 struct throw_instance_tag{};
95 template <
class T,
class Coordination>
96 auto make_error(throw_ptr_tag&&,
rxu::error_ptr exception, Coordination cn)
97 -> observable<T, error<T, Coordination>> {
98 return observable<T, error<T, Coordination>>(error<T, Coordination>(std::move(exception), std::move(cn)));
101 template <
class T,
class E,
class Coordination>
102 auto make_error(throw_instance_tag&&, E e, Coordination cn)
103 -> observable<T, error<T, Coordination>> {
105 return observable<T, error<T, Coordination>>(error<T, Coordination>(std::move(ep), std::move(cn)));
116 template<
class T,
class E>
123 template<
class T,
class E,
class Coordination>
125 -> decltype(detail::make_error<T>(
typename std::conditional<std::is_same<
rxu::error_ptr,
rxu::decay_t<E>>::value, detail::throw_ptr_tag, detail::throw_instance_tag>::type(), std::move(e), std::move(cn))) {
126 return detail::make_error<T>(
typename std::conditional<std::is_same<
rxu::error_ptr,
rxu::decay_t<E>>::value, detail::throw_ptr_tag, detail::throw_instance_tag>::type(), std::move(e), std::move(cn));