some work

This commit is contained in:
Naios 2015-06-21 15:49:45 +02:00
parent 80f4314717
commit e5ecf2dfe3
2 changed files with 85 additions and 27 deletions

View File

@ -76,26 +76,6 @@ namespace detail
typedef typename result_t::CallbackFunction callback_t; typedef typename result_t::CallbackFunction callback_t;
}; };
/// Wrap void returning functionals to returns an empty continuable.
template <typename _CTy>
auto remove_void_trait(_CTy&& functional)
-> typename std::enable_if<std::is_void<fu::return_type_of_t<
typename std::decay<_CTy>::type>>::value,
int>::type
{
return 1;
}
/// Route continuable returning functionals through.
template <typename _CTy>
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);
}
template<typename... _CTy> template<typename... _CTy>
struct multiple_all_chainer struct multiple_all_chainer
{ {
@ -173,6 +153,30 @@ namespace detail
using continuable_factory_t = ContinuableFactory< using continuable_factory_t = ContinuableFactory<
::fu::return_type_of_t<_FTy>, ::fu::argument_type_of_t<_FTy>>; ::fu::return_type_of_t<_FTy>, ::fu::argument_type_of_t<_FTy>>;
template<typename Args>
struct void_wrap_trait;
template<typename... Args>
struct void_wrap_trait<fu::identity<Args...>>
{
template<typename _CTy>
static std::function<Continuable<>(Args...)> wrap(_CTy&& functional)
{
return [functional](Args... args)
{
// Invoke the original callback
functional(std::forward<Args>(args)...);
// FIXME return make_empty_continuable()
// Return a fake continuable
return Continuable<>([](Callback<>&& callback)
{
callback();
});
};
}
};
} // detail } // detail
template<typename... _ATy> template<typename... _ATy>
@ -186,7 +190,7 @@ public:
typedef Callback<_ATy...> CallbackFunction; typedef Callback<_ATy...> CallbackFunction;
typedef std::function<void(Callback<_ATy...>&&)> ForwardFunction; typedef std::function<void(Callback<_ATy...>&&)> ForwardFunction;
private: // private:
/// Functional which expects a callback that is inserted from the Continuable /// Functional which expects a callback that is inserted from the Continuable
/// to chain everything together /// to chain everything together
ForwardFunction _callback_insert; ForwardFunction _callback_insert;
@ -206,9 +210,48 @@ private:
} }
} }
// Pack a continuable into the continuable returning functional type. /// Wrap void returning functionals to returns an empty continuable.
template <typename _CTy>
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(
void_wrap_trait<
fu::return_type_of_t<
typename std::decay<_CTy>::type
>
>::wrap(std::declval<_CTy>())
)
>::type
{
return detail::void_wrap_trait<
fu::return_type_of_t<
typename std::decay<_CTy>::type
>
>::wrap(std::forward<_CTy>(functional));
}
/// Route continuable returning functionals through.
/*template <typename _CTy>
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<typename _CTy> template<typename _CTy>
static auto box_continuable(_CTy&& continuable) static auto box_continuable_trait(_CTy&& continuable)
-> typename std::enable_if<detail::is_continuable<typename std::decay<_CTy>::type>::value, -> typename std::enable_if<detail::is_continuable<typename std::decay<_CTy>::type>::value,
std::function<typename std::decay<_CTy>::type(_ATy...)>>::type std::function<typename std::decay<_CTy>::type(_ATy...)>>::type
{ {
@ -223,9 +266,9 @@ private:
}; };
} }
// Do nothing if already a non continuable type /// Route functionals through and forward to remove_void_trait
template<typename _CTy> template<typename _CTy>
static auto box_continuable(_CTy&& continuable) static auto box_continuable_trait(_CTy&& continuable)
-> typename std::enable_if<!detail::is_continuable<typename std::decay<_CTy>::type>::value, -> typename std::enable_if<!detail::is_continuable<typename std::decay<_CTy>::type>::value,
typename std::decay<_CTy>::type>::type typename std::decay<_CTy>::type>::type
{ {
@ -314,7 +357,7 @@ public:
static_assert(std::is_rvalue_reference<_CTy&&>::value, static_assert(std::is_rvalue_reference<_CTy&&>::value,
"Given continuable must be passed as r-value!"); "Given continuable must be passed as r-value!");
return then(box_continuable(std::forward<_CTy>(continuable))); return then(box_continuable_trait(std::forward<_CTy>(continuable)));
} }
template<typename... _CTy> template<typename... _CTy>
@ -366,6 +409,11 @@ public:
*/ */
}; };
namespace detail
{
}
/// Wraps a functional object which expects a r-value callback as argument into a continuable. /// Wraps a functional object which expects a r-value callback as argument into a continuable.
/// The callable is invoked when the continuable shall continue. /// The callable is invoked when the continuable shall continue.
/// For example: /// For example:

View File

@ -222,7 +222,17 @@ int main(int /*argc*/, char** /*argv*/)
//// Here we go //// Here we go
//entry(); //entry();
/*
auto testaiasj = remove_void_trait([]
{
});
*/
Continuable<>::remove_void_trait([]
{
});
std::cout << "ok" << std::endl; std::cout << "ok" << std::endl;
return 0; return 0;