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