diff options
author | Kirk Shoop <kirk.shoop@microsoft.com> | 2015-07-09 19:44:27 -0700 |
---|---|---|
committer | Kirk Shoop <kirk.shoop@microsoft.com> | 2015-07-09 21:19:43 -0700 |
commit | 9a16ae70998723a9e271ba6c8f3884fce0352202 (patch) | |
tree | c981f7f548a7d942b2f72b6a50b42003d6fc0be8 /Rx/v2/src/rxcpp/rx-observer.hpp | |
parent | 52a0747aafb8a5edd523f79bae9edceb4f4f6cd0 (diff) | |
download | RxCpp-9a16ae70998723a9e271ba6c8f3884fce0352202.tar.gz |
added tap operator
Diffstat (limited to 'Rx/v2/src/rxcpp/rx-observer.hpp')
-rw-r--r-- | Rx/v2/src/rxcpp/rx-observer.hpp | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/Rx/v2/src/rxcpp/rx-observer.hpp b/Rx/v2/src/rxcpp/rx-observer.hpp index a3fbc35..da16686 100644 --- a/Rx/v2/src/rxcpp/rx-observer.hpp +++ b/Rx/v2/src/rxcpp/rx-observer.hpp @@ -30,6 +30,11 @@ struct OnErrorEmpty abort(); } }; +struct OnErrorIgnore +{ + void operator()(std::exception_ptr) const { + } +}; struct OnCompletedEmpty { void operator()() const {} @@ -286,34 +291,43 @@ public: } }; -template<class T> +template<class T, class DefaultOnError = detail::OnErrorEmpty> auto make_observer() -> observer<T, void> { return observer<T, void>(); } -template<class T, class U, class I> +template<class T, class DefaultOnError = detail::OnErrorEmpty, class U, class I> auto make_observer(observer<U, I> o) -> observer<T, I> { return observer<T, I>(std::move(o)); } -template<class T, class Observer> +template<class T, class DefaultOnError = detail::OnErrorEmpty, class Observer> auto make_observer(Observer ob) -> typename std::enable_if< !detail::is_on_next_of<T, Observer>::value && + !detail::is_on_error<Observer>::value && !is_observer<Observer>::value, observer<T, Observer>>::type { return observer<T, Observer>(std::move(ob)); } -template<class T, class OnNext> +template<class T, class DefaultOnError = detail::OnErrorEmpty, class OnNext> auto make_observer(OnNext on) -> typename std::enable_if< detail::is_on_next_of<T, OnNext>::value, - observer<T, static_observer<T, OnNext>>>::type { - return observer<T, static_observer<T, OnNext>>( - static_observer<T, OnNext>(std::move(on))); + observer<T, static_observer<T, OnNext, DefaultOnError>>>::type { + return observer<T, static_observer<T, OnNext, DefaultOnError>>( + static_observer<T, OnNext, DefaultOnError>(std::move(on))); } -template<class T, class OnNext, class OnError> +template<class T, class DefaultOnError = detail::OnErrorEmpty, class OnError> +auto make_observer(OnError oe) + -> typename std::enable_if< + detail::is_on_error<OnError>::value, + observer<T, static_observer<T, detail::OnNextEmpty<T>, OnError>>>::type { + return observer<T, static_observer<T, detail::OnNextEmpty<T>, OnError>>( + static_observer<T, detail::OnNextEmpty<T>, OnError>(detail::OnNextEmpty<T>(), std::move(oe))); +} +template<class T, class DefaultOnError = detail::OnErrorEmpty, class OnNext, class OnError> auto make_observer(OnNext on, OnError oe) -> typename std::enable_if< detail::is_on_next_of<T, OnNext>::value && @@ -322,16 +336,16 @@ auto make_observer(OnNext on, OnError oe) return observer<T, static_observer<T, OnNext, OnError>>( static_observer<T, OnNext, OnError>(std::move(on), std::move(oe))); } -template<class T, class OnNext, class OnCompleted> +template<class T, class DefaultOnError = detail::OnErrorEmpty, class OnNext, class OnCompleted> auto make_observer(OnNext on, OnCompleted oc) -> typename std::enable_if< detail::is_on_next_of<T, OnNext>::value && detail::is_on_completed<OnCompleted>::value, - observer<T, static_observer<T, OnNext, detail::OnErrorEmpty, OnCompleted>>>::type { - return observer<T, static_observer<T, OnNext, detail::OnErrorEmpty, OnCompleted>>( - static_observer<T, OnNext, detail::OnErrorEmpty, OnCompleted>(std::move(on), detail::OnErrorEmpty(), std::move(oc))); + observer<T, static_observer<T, OnNext, DefaultOnError, OnCompleted>>>::type { + return observer<T, static_observer<T, OnNext, DefaultOnError, OnCompleted>>( + static_observer<T, OnNext, DefaultOnError, OnCompleted>(std::move(on), DefaultOnError(), std::move(oc))); } -template<class T, class OnNext, class OnError, class OnCompleted> +template<class T, class DefaultOnError = detail::OnErrorEmpty, class OnNext, class OnError, class OnCompleted> auto make_observer(OnNext on, OnError oe, OnCompleted oc) -> typename std::enable_if< detail::is_on_next_of<T, OnNext>::value && @@ -342,7 +356,6 @@ auto make_observer(OnNext on, OnError oe, OnCompleted oc) static_observer<T, OnNext, OnError, OnCompleted>(std::move(on), std::move(oe), std::move(oc))); } - template<class T, class Observer> auto make_observer_dynamic(Observer o) -> typename std::enable_if< |