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