1 // Copyright (c) 2007-2016 Hartmut Kaiser 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef HPX_ACTIONS_CONTINUATION_IMPL_HPP 7 #define HPX_ACTIONS_CONTINUATION_IMPL_HPP 8 9 #include <hpx/runtime/applier/detail/apply_implementations_fwd.hpp> 10 #include <hpx/runtime/applier/apply.hpp> 11 #include <hpx/runtime/naming/id_type.hpp> 12 #include <hpx/runtime/serialization/access.hpp> 13 #include <hpx/util/decay.hpp> 14 #include <hpx/util/result_of.hpp> 15 16 #include <utility> 17 18 namespace hpx { namespace actions { 19 /////////////////////////////////////////////////////////////////////////// 20 template <typename Cont> 21 struct continuation_impl 22 { 23 private: 24 typedef typename util::decay<Cont>::type cont_type; 25 26 public: continuation_implhpx::actions::continuation_impl27 continuation_impl() {} 28 29 template <typename Cont_> continuation_implhpx::actions::continuation_impl30 continuation_impl(Cont_ && cont, hpx::naming::id_type const& target) 31 : cont_(std::forward<Cont_>(cont)), target_(target) 32 {} 33 ~continuation_implhpx::actions::continuation_impl34 virtual ~continuation_impl() {} 35 36 template <typename T> 37 typename util::invoke_result<cont_type, hpx::naming::id_type, T>::type operator ()hpx::actions::continuation_impl38 operator()(hpx::naming::id_type const& lco, T && t) const 39 { 40 hpx::apply_c(cont_, lco, target_, std::forward<T>(t)); 41 42 // Unfortunately we need to default construct the return value, 43 // this possibly imposes an additional restriction of return types. 44 typedef typename util::invoke_result< 45 cont_type, hpx::naming::id_type, T 46 >::type result_type; 47 return result_type(); 48 } 49 50 private: 51 // serialization support 52 friend class hpx::serialization::access; 53 54 template <typename Archive> serializehpx::actions::continuation_impl55 HPX_FORCEINLINE void serialize(Archive& ar, unsigned int const) 56 { 57 ar & cont_ & target_; 58 } 59 60 cont_type cont_; 61 hpx::naming::id_type target_; 62 }; 63 }} 64 65 #endif 66