summaryrefslogtreecommitdiff
path: root/Rx/v2/src/rxcpp/operators/rx-lift.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'Rx/v2/src/rxcpp/operators/rx-lift.hpp')
-rw-r--r--Rx/v2/src/rxcpp/operators/rx-lift.hpp39
1 files changed, 28 insertions, 11 deletions
diff --git a/Rx/v2/src/rxcpp/operators/rx-lift.hpp b/Rx/v2/src/rxcpp/operators/rx-lift.hpp
index 1800984..ad2ec4f 100644
--- a/Rx/v2/src/rxcpp/operators/rx-lift.hpp
+++ b/Rx/v2/src/rxcpp/operators/rx-lift.hpp
@@ -11,7 +11,7 @@ namespace rxcpp {
namespace detail {
-template<class S, class F>
+template<class V, class S, class F>
struct is_lift_function_for {
struct tag_not_valid {};
@@ -23,7 +23,7 @@ struct is_lift_function_for {
typedef typename std::decay<S>::type for_type;
typedef typename std::decay<F>::type func_type;
typedef decltype(check<for_type, func_type>(0)) detail_result;
- static const bool value = is_subscriber<detail_result>::value && is_subscriber<for_type>::value;
+ static const bool value = is_subscriber<detail_result>::value && is_subscriber<for_type>::value && std::is_convertible<V, typename detail_result::value_type>::value;
};
}
@@ -32,25 +32,22 @@ namespace operators {
namespace detail {
-template<class SourceOperator, class Operator>
+template<class ResultType, class SourceOperator, class Operator>
struct lift_traits
{
+ typedef typename std::decay<ResultType>::type result_value_type;
typedef typename std::decay<SourceOperator>::type source_operator_type;
typedef typename std::decay<Operator>::type operator_type;
typedef typename source_operator_type::value_type source_value_type;
- static_assert(rxcpp::detail::is_lift_function_for<subscriber<source_value_type>, operator_type>::value, "lift Operator must be a function with the signature subscriber<...>(subscriber<source_value_type, ...>)");
-
- typedef decltype((*(operator_type*)nullptr)(*(subscriber<source_value_type>*)nullptr)) result_for_dynamic_source_subscriber_type;
-
- typedef typename result_for_dynamic_source_subscriber_type::value_type result_value_type;
+ static_assert(rxcpp::detail::is_lift_function_for<source_value_type, subscriber<result_value_type>, operator_type>::value, "lift Operator must be a function with the signature subscriber<source_value_type, ...>(subscriber<result_value_type, ...>)");
};
-template<class SourceOperator, class Operator>
-struct lift : public operator_base<typename lift_traits<SourceOperator, Operator>::result_value_type>
+template<class ResultType, class SourceOperator, class Operator>
+struct lift : public operator_base<typename lift_traits<ResultType, SourceOperator, Operator>::result_value_type>
{
- typedef lift_traits<SourceOperator, Operator> traits;
+ typedef lift_traits<ResultType, SourceOperator, Operator> traits;
typedef typename traits::source_operator_type source_operator_type;
typedef typename traits::operator_type operator_type;
source_operator_type source;
@@ -70,6 +67,26 @@ struct lift : public operator_base<typename lift_traits<SourceOperator, Operator
}
};
+template<class ResultType, class Operator>
+class lift_factory
+{
+ typedef typename std::decay<Operator>::type operator_type;
+ operator_type chain;
+public:
+ lift_factory(operator_type op) : chain(std::move(op)) {}
+ template<class Observable>
+ auto operator()(Observable&& source)
+ -> decltype(source.template lift<ResultType>(chain)) {
+ return source.template lift<ResultType>(chain);
+ }
+};
+
+}
+
+template<class ResultType, class Operator>
+auto lift(Operator&& op)
+ -> detail::lift_factory<ResultType, Operator> {
+ return detail::lift_factory<ResultType, Operator>(std::forward<Operator>(op));
}
}