1 
2 //          Copyright Oliver Kowalke 2009.
3 // Distributed under the Boost Software License, Version 1.0.
4 //    (See accompanying file LICENSE_1_0.txt or copy at
5 //          http://www.boost.org/LICENSE_1_0.txt)
6 
7 #ifndef BOOST_COROUTINES_DETAIL_SETUP_H
8 #define BOOST_COROUTINES_DETAIL_SETUP_H
9 
10 #include <boost/assert.hpp>
11 #include <boost/config.hpp>
12 #include <boost/move/move.hpp>
13 #include <boost/type_traits/decay.hpp>
14 #include <boost/type_traits/is_convertible.hpp>
15 #include <boost/type_traits/is_same.hpp>
16 
17 #include <boost/coroutine/attributes.hpp>
18 #include <boost/coroutine/detail/coroutine_context.hpp>
19 #include <boost/coroutine/detail/flags.hpp>
20 
21 #ifdef BOOST_HAS_ABI_HEADERS
22 #  include BOOST_ABI_PREFIX
23 #endif
24 
25 namespace boost {
26 namespace coroutines {
27 namespace detail {
28 
29 template< typename Fn >
30 struct setup
31 {
32     struct dummy {};
33 
34     Fn                      fn;
35     coroutine_context   *   caller;
36     coroutine_context   *   callee;
37     attributes              attr;
38 
39 #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
setupboost::coroutines::detail::setup40     setup( Fn fn_,
41            coroutine_context * caller_,
42            coroutine_context * callee_,
43            attributes const& attr_) :
44         fn( boost::forward< Fn >( fn_) ),
45         caller( caller_),
46         callee( callee_),
47         attr( attr_)
48     {}
49 #endif
setupboost::coroutines::detail::setup50     setup( BOOST_RV_REF( Fn) fn_,
51            coroutine_context * caller_,
52            coroutine_context * callee_,
53            attributes const& attr_,
54            typename disable_if<
55                is_same< typename decay< Fn >::type, setup >,
56                dummy*
57            >::type = 0) :
58 #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
59         fn( fn_),
60 #else
61         fn( boost::forward< Fn >( fn_) ),
62 #endif
63         caller( caller_),
64         callee( callee_),
65         attr( attr_)
66     {}
67 };
68 
69 }}}
70 
71 #ifdef BOOST_HAS_ABI_HEADERS
72 #  include BOOST_ABI_SUFFIX
73 #endif
74 
75 #endif // BOOST_COROUTINES_DETAIL_SETUP_H
76