diff --git a/include/Continuable.h b/include/Continuable.h index 6798714..4b53f72 100644 --- a/include/Continuable.h +++ b/include/Continuable.h @@ -488,11 +488,11 @@ namespace detail multiple_result_maker<0, fu::identity<>, fu::identity<>, Args...>; }; - template + template struct multiple_when_all_chainer_t_make_result; - template - struct multiple_when_all_chainer_t_make_result, fu::identity<_RTy...>> + template + struct multiple_when_all_chainer_t_make_result, fu::identity<_RTy...>, fu::identity<_PTy...>> { typedef Continuable<_RTy...> continuable_t; @@ -508,27 +508,32 @@ namespace detail std::tuple<_RTy...> result; }; - typedef std::shared_ptr SharedResult; + typedef std::shared_ptr shared_result_t; - template - static void invoke(SharedResult storage, _CTy&& functional) - { - } + typedef std::tuple<_ATy...> shared_args_t; - // Invoke last - template - static void distribute_invoke(SharedResult storage, _CTy&& current) - { - invoke(storage, std::forward<_CTy>(current)); - } + template + struct distributor; - // Invoke and pass recursive to next - template - static void distribute_invoke(SharedResult storage, _CTy&& current, Rest&&... rest) + template + struct distributor, Stack...> { - invoke(storage, std::forward<_CTy>(current)); - distribute_invoke(storage, std::forward(rest)...); - } + /// Real function invocation + template + inline static void invoke(shared_result_t storage, Arguments&& args, _CTy&& current) + { + std::cout << "invoking: " << Position << std::endl; + } + + /// Invoke and pass recursive to itself + template + inline static void invoke(shared_result_t storage, Arguments&& args, _CTy&& current, Rest&&... rest) + { + invoke(storage, std::forward(args), std::forward<_CTy>(current)); + + distributor::invoke(storage, std::forward(args), std::forward(rest)...); + } + }; /// Creates a faked function which invokes all sub continuables template @@ -539,9 +544,16 @@ namespace detail // Fake continuable which wraps all continuables together return make_continuable([=](Callback<_RTy...>&& callback) mutable { - SharedResult result(new ResultStorage(sizeof...(_CTy))); + shared_result_t result(new ResultStorage(sizeof...(_CTy))); - distribute_invoke(result, std::forward<_CTy>(functionals)...); + distributor<_PTy...>::invoke( + result, + std::make_tuple(std::forward<_ATy>(args)...), + std::forward<_CTy>(functionals)...); + + // distributor_from_identity + + // invoke(result, std::forward<_CTy>(functionals)...); // functional_traits<_ATy...>::correct(std::forward<_CTy>(functionals)) @@ -568,7 +580,7 @@ namespace detail static std::size_t const size = result_maker::size; - typedef multiple_when_all_chainer_t_make_result, arguments_t> make_result; + typedef multiple_when_all_chainer_t_make_result, arguments_t, partial_results_t> make_result; // Creates one continuable from multiple ones static auto make_when_all(_CTy&&... args)