diff options
Diffstat (limited to 'Rx/v2/src/rxcpp/operators/rx-start_with.hpp')
-rw-r--r-- | Rx/v2/src/rxcpp/operators/rx-start_with.hpp | 77 |
1 files changed, 56 insertions, 21 deletions
diff --git a/Rx/v2/src/rxcpp/operators/rx-start_with.hpp b/Rx/v2/src/rxcpp/operators/rx-start_with.hpp index 42bf388..8d82e83 100644 --- a/Rx/v2/src/rxcpp/operators/rx-start_with.hpp +++ b/Rx/v2/src/rxcpp/operators/rx-start_with.hpp @@ -2,10 +2,32 @@ #pragma once +/*! \file rx-start_with.hpp + + \brief Start with the supplied values, then concatenate this observable. + + \tparam Value0 ... + \tparam ValueN the type of sending values + + \param v0 ... + \param vn values to send + + \return Observable that emits the specified items and then emits the items emitted by the source observable. + + \sample + \snippet start_with.cpp short start_with sample + \snippet output.txt short start_with sample + + Another form of this operator, rxcpp::observable<void, void>::start_with, gets the source observable as a parameter: + \snippet start_with.cpp full start_with sample + \snippet output.txt full start_with sample +*/ + #if !defined(RXCPP_OPERATORS_RX_START_WITH_HPP) #define RXCPP_OPERATORS_RX_START_WITH_HPP #include "../rx-includes.hpp" +#include "./rx-concat.hpp" namespace rxcpp { @@ -13,34 +35,47 @@ namespace operators { namespace detail { -template<class StartObservable> -class start_with_factory -{ -public: - using start_type = rxu::decay_t<StartObservable>; - - start_type start; - - explicit start_with_factory(start_type s) : start(s) {} - - template<class Observable> - auto operator()(Observable source) - -> decltype(start.concat(source)) { - return start.concat(source); - } +template<class... AN> +struct start_with_invalid_arguments {}; + +template<class... AN> +struct start_with_invalid : public rxo::operator_base<start_with_invalid_arguments<AN...>> { + using type = observable<start_with_invalid_arguments<AN...>, start_with_invalid<AN...>>; }; - +template<class... AN> +using start_with_invalid_t = typename start_with_invalid<AN...>::type; + } -template<class Value0, class... ValueN> -auto start_with(Value0 v0, ValueN... vn) - -> detail::start_with_factory<decltype(rxs::from(rxu::decay_t<Value0>(v0), rxu::decay_t<Value0>(vn)...))> { - return detail::start_with_factory<decltype(rxs::from(rxu::decay_t<Value0>(v0), rxu::decay_t<Value0>(vn)...))>( - rxs::from(rxu::decay_t<Value0>(v0), rxu::decay_t<Value0>(vn)...)); +/*! @copydoc rx-start_with.hpp +*/ +template<class... AN> +auto start_with(AN&&... an) + -> operator_factory<start_with_tag, AN...> { + return operator_factory<start_with_tag, AN...>(std::make_tuple(std::forward<AN>(an)...)); } } +template<> +struct member_overload<start_with_tag> +{ + template<class Observable, class Value0, class... ValueN, + class Enabled = rxu::enable_if_all_true_type_t< + is_observable<Observable>>> + static auto member(Observable&& o, Value0&& v0, ValueN&&... vn) + -> decltype(rxs::from(rxu::decay_t<Value0>(v0), rxu::decay_t<Value0>(vn)...).concat(std::forward<Observable>(o))) { + return rxs::from(rxu::decay_t<Value0>(v0), rxu::decay_t<Value0>(vn)...).concat(std::forward<Observable>(o)); + } + + template<class... AN> + static operators::detail::start_with_invalid_t<AN...> member(const AN&...) { + std::terminate(); + return {}; + static_assert(sizeof...(AN) == 10000, "start_with takes (Value0, optional ValueN...)"); + } +}; + } #endif |