diff options
Diffstat (limited to 'Rx/v2/src/rxcpp/operators/rx-lift.hpp')
-rw-r--r-- | Rx/v2/src/rxcpp/operators/rx-lift.hpp | 39 |
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)); } } |