summaryrefslogtreecommitdiff
path: root/Rx/v2/src/rxcpp/operators/rx-start_with.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'Rx/v2/src/rxcpp/operators/rx-start_with.hpp')
-rw-r--r--Rx/v2/src/rxcpp/operators/rx-start_with.hpp77
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