diff --git a/include/Continuable.h b/include/Continuable.h index eb7488a..876b445 100644 --- a/include/Continuable.h +++ b/include/Continuable.h @@ -139,77 +139,6 @@ public: } } - /// Wrap void returning functionals to returns an empty continuable. - template - static auto remove_void_trait(_CTy&& functional) - -> typename std::enable_if< - std::is_void< - fu::return_type_of_t< - typename std::decay<_CTy>::type - > - >::value, - /*decltype( - detail::void_wrap_trait< - fu::return_type_of_t< - typename std::decay<_CTy>::type - > - >::wrap(std::declval<_CTy>()) - ) - */ - decltype( - detail::functional_corrector<_CTy>::correct(std::declval<_CTy>()) - ) - // std::function()> - >::type - { - /*return detail::void_wrap_trait< - fu::return_type_of_t< - typename std::decay<_CTy>::type - > - >::wrap(std::forward<_CTy>(functional));*/ - return detail::functional_corrector<_CTy>::correct(std::forward<_CTy>(functional)); - } - - /// Route continuable returning functionals through. - /*template - static auto remove_void_trait(_CTy&& functional) - -> typename std::enable_if< - !std::is_void< - fu::return_type_of_t< - typename std::decay<_CTy>::type - > - >::value, - _CTy>::type - { - return std::forward<_CTy>(functional); - }*/ - - /// Wrap continuables into the continuable returning functional type. - template - static auto box_continuable_trait(_CTy&& continuable) - -> typename std::enable_if::type>::value, - std::function::type(_ATy...)>>::type - { - // Trick C++11 lambda capture rules for non copyable but moveable continuables. - std::shared_ptr::type> shared_continuable = - std::make_shared::type>(std::forward<_CTy>(continuable)); - - // Create a fake function which returns the value on invoke. - return [shared_continuable](_ATy...) - { - return std::move(*shared_continuable); - }; - } - - /// Route functionals through and forward to remove_void_trait - template - static auto box_continuable_trait(_CTy&& continuable) - -> typename std::enable_if::type>::value, - typename std::decay<_CTy>::type>::type - { - return continuable; - } - public: /// Deleted copy construct Continuable(Continuable const&) = delete; @@ -398,9 +327,83 @@ inline auto make_continuable() namespace detail { + /// Wrap void returning functionals to returns an empty continuable. + template + static auto remove_void_trait(_CTy&& functional) + -> typename std::enable_if< + std::is_void< + fu::return_type_of_t< + typename std::decay<_CTy>::type + > + >::value, + /*decltype( + detail::void_wrap_trait< + fu::return_type_of_t< + typename std::decay<_CTy>::type + > + >::wrap(std::declval<_CTy>()) + ) + */ + decltype( + detail::functional_corrector<_CTy>::correct(std::declval<_CTy>()) + ) + // std::function()> + >::type + { + /*return detail::void_wrap_trait< + fu::return_type_of_t< + typename std::decay<_CTy>::type + > + >::wrap(std::forward<_CTy>(functional));*/ + return detail::functional_corrector<_CTy>::correct(std::forward<_CTy>(functional)); + } + + /// Route continuable returning functionals through. + /*template + static auto remove_void_trait(_CTy&& functional) + -> typename std::enable_if< + !std::is_void< + fu::return_type_of_t< + typename std::decay<_CTy>::type + > + >::value, + _CTy>::type + { + return std::forward<_CTy>(functional); + }*/ + + /// Wrap continuables into the continuable returning functional type. + template + auto box_continuable_trait(_CTy&& continuable) + -> typename std::enable_if::type>::value, + std::function::type(_ATy...)>>::type + { + // Trick C++11 lambda capture rules for non copyable but moveable continuables. + std::shared_ptr::type> shared_continuable = + std::make_shared::type>(std::forward<_CTy>(continuable)); + + // Create a fake function which returns the value on invoke. + return [shared_continuable](_ATy...) + { + return std::move(*shared_continuable); + }; + } + + /// Route functionals through and forward to remove_void_trait + template + auto box_continuable_trait(_CTy&& continuable) + -> typename std::enable_if::type>::value, + typename std::decay<_CTy>::type>::type + { + return continuable; + } + template struct functional_corrector { + typedef fu::return_type_of_t<_CTy> return_t; + typedef fu::argument_type_of_t<_CTy> arg_t; + static int correct(_CTy&&) { return 1;