diff --git a/example/simple.cpp b/example/simple.cpp index 1c0bd1a..f8743d7 100644 --- a/example/simple.cpp +++ b/example/simple.cpp @@ -9,12 +9,18 @@ #include +using namespace boost::coroutines2; + +asymmetric_coroutine::pull_type make_dummy_range() +{ + return asymmetric_coroutine::pull_type([](asymmetric_coroutine::push_type& yield) + { + yield(1); + }); +} + int main() { - boost::coroutines2::coroutine< void >::push_type sink( - []( boost::coroutines2::coroutine< void >::pull_type & source) { - std::cout << "inside coroutine-fn" << std::endl; - }); - sink(); + std::distance(make_dummy_range()); // error std::cout << "Done" << std::endl; return EXIT_SUCCESS; } diff --git a/include/boost/coroutine2/detail/coroutine.hpp b/include/boost/coroutine2/detail/coroutine.hpp index 83021b6..7c1483d 100644 --- a/include/boost/coroutine2/detail/coroutine.hpp +++ b/include/boost/coroutine2/detail/coroutine.hpp @@ -8,6 +8,7 @@ #define BOOST_COROUTINES2_DETAIL_COROUTINE_HPP #include +#include #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX @@ -28,24 +29,25 @@ class push_coroutine; #include #include -#if ! defined(BOOST_USE_EXECUTION_CONTEXT) -#include -#include -#else -#include -#include -#endif +#if defined(BOOST_EXECUTION_CONTEXT) +# if (BOOST_EXECUTION_CONTEXT==1) +# include +# include +# else +# include +# include +# endif -#include -#include +# include +# include -#if ! defined(BOOST_USE_EXECUTION_CONTEXT) -#include -#include -#include -#else -#include -#include +# if (BOOST_EXECUTION_CONTEXT==1) +# include +# include +# else +# include +# include +# endif #endif #ifdef BOOST_HAS_ABI_HEADERS diff --git a/include/boost/coroutine2/detail/pull_control_block_ec.hpp b/include/boost/coroutine2/detail/pull_control_block_ecv1.hpp similarity index 100% rename from include/boost/coroutine2/detail/pull_control_block_ec.hpp rename to include/boost/coroutine2/detail/pull_control_block_ecv1.hpp diff --git a/include/boost/coroutine2/detail/pull_control_block_ec.ipp b/include/boost/coroutine2/detail/pull_control_block_ecv1.ipp similarity index 100% rename from include/boost/coroutine2/detail/pull_control_block_ec.ipp rename to include/boost/coroutine2/detail/pull_control_block_ecv1.ipp diff --git a/include/boost/coroutine2/detail/pull_control_block_cc.hpp b/include/boost/coroutine2/detail/pull_control_block_ecv2.hpp similarity index 89% rename from include/boost/coroutine2/detail/pull_control_block_cc.hpp rename to include/boost/coroutine2/detail/pull_control_block_ecv2.hpp index 4fd72a3..f3148a5 100644 --- a/include/boost/coroutine2/detail/pull_control_block_cc.hpp +++ b/include/boost/coroutine2/detail/pull_control_block_ecv2.hpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include @@ -25,7 +25,7 @@ namespace detail { template< typename T > struct pull_coroutine< T >::control_block { - boost::context::captured_context ctx; + boost::context::execution_context ctx; typename push_coroutine< T >::control_block * other; state_t state; std::exception_ptr except; @@ -37,7 +37,7 @@ struct pull_coroutine< T >::control_block { template< typename StackAllocator, typename Fn > control_block( context::preallocated, StackAllocator, Fn &&); - control_block( typename push_coroutine< T >::control_block *, boost::context::captured_context &) noexcept; + control_block( typename push_coroutine< T >::control_block *, boost::context::execution_context &) noexcept; ~control_block(); @@ -57,7 +57,7 @@ struct pull_coroutine< T >::control_block { template< typename T > struct pull_coroutine< T & >::control_block { - boost::context::captured_context ctx; + boost::context::execution_context ctx; typename push_coroutine< T & >::control_block * other; state_t state; std::exception_ptr except; @@ -68,7 +68,7 @@ struct pull_coroutine< T & >::control_block { template< typename StackAllocator, typename Fn > control_block( context::preallocated, StackAllocator, Fn &&); - control_block( typename push_coroutine< T & >::control_block *, boost::context::captured_context &) noexcept; + control_block( typename push_coroutine< T & >::control_block *, boost::context::execution_context &) noexcept; control_block( control_block &) = delete; control_block & operator=( control_block &) = delete; @@ -83,7 +83,7 @@ struct pull_coroutine< T & >::control_block { }; struct pull_coroutine< void >::control_block { - boost::context::captured_context ctx; + boost::context::execution_context ctx; push_coroutine< void >::control_block * other; state_t state; std::exception_ptr except; @@ -93,7 +93,7 @@ struct pull_coroutine< void >::control_block { template< typename StackAllocator, typename Fn > control_block( context::preallocated, StackAllocator, Fn &&); - control_block( push_coroutine< void >::control_block *, boost::context::captured_context &) noexcept; + control_block( push_coroutine< void >::control_block *, boost::context::execution_context &) noexcept; control_block( control_block &) = delete; control_block & operator=( control_block &) = delete; diff --git a/include/boost/coroutine2/detail/pull_control_block_cc.ipp b/include/boost/coroutine2/detail/pull_control_block_ecv2.ipp similarity index 94% rename from include/boost/coroutine2/detail/pull_control_block_cc.ipp rename to include/boost/coroutine2/detail/pull_control_block_ecv2.ipp index 1933030..3a9a92c 100644 --- a/include/boost/coroutine2/detail/pull_control_block_cc.ipp +++ b/include/boost/coroutine2/detail/pull_control_block_ecv2.ipp @@ -15,7 +15,7 @@ #include #include -#include +#include #include #include @@ -33,7 +33,7 @@ namespace detail { template< typename T > void pull_coroutine< T >::control_block::destroy( control_block * cb) noexcept { - boost::context::captured_context ctx = std::move( cb->ctx); + boost::context::execution_context ctx = std::move( cb->ctx); // destroy control structure cb->~control_block(); // destroy coroutine's stack @@ -48,7 +48,7 @@ pull_coroutine< T >::control_block::control_block( context::preallocated palloc, ctx{ std::allocator_arg, palloc, salloc, std::move( std::bind( - [this]( typename std::decay< Fn >::type & fn_, boost::context::captured_context ctx, void *) mutable { + [this]( typename std::decay< Fn >::type & fn_, boost::context::execution_context ctx, void *) mutable { // create synthesized push_coroutine< T > typename push_coroutine< T >::control_block synthesized_cb{ this, ctx }; push_coroutine< T > synthesized{ & synthesized_cb }; @@ -75,7 +75,7 @@ pull_coroutine< T >::control_block::control_block( context::preallocated palloc, std::placeholders::_2))}, #else ctx{ std::allocator_arg, palloc, salloc, - [this,fn_=std::forward< Fn >( fn)]( boost::context::captured_context ctx, void *) mutable { + [this,fn_=std::forward< Fn >( fn)]( boost::context::execution_context ctx, void *) mutable { // create synthesized push_coroutine< T > typename push_coroutine< T >::control_block synthesized_cb{ this, ctx }; push_coroutine< T > synthesized{ & synthesized_cb }; @@ -111,7 +111,7 @@ pull_coroutine< T >::control_block::control_block( context::preallocated palloc, template< typename T > pull_coroutine< T >::control_block::control_block( typename push_coroutine< T >::control_block * cb, - boost::context::captured_context & ctx_) noexcept : + boost::context::execution_context & ctx_) noexcept : ctx{ std::move( ctx_) }, other{ cb }, state{ state_t::none }, @@ -180,7 +180,7 @@ pull_coroutine< T >::control_block::valid() const noexcept { template< typename T > void pull_coroutine< T & >::control_block::destroy( control_block * cb) noexcept { - boost::context::captured_context ctx = std::move( cb->ctx); + boost::context::execution_context ctx = std::move( cb->ctx); // destroy control structure cb->~control_block(); // destroy coroutine's stack @@ -195,7 +195,7 @@ pull_coroutine< T & >::control_block::control_block( context::preallocated pallo ctx{ std::allocator_arg, palloc, salloc, std::move( std::bind( - [this]( typename std::decay< Fn >::type & fn_, boost::context::captured_context ctx, void *) mutable { + [this]( typename std::decay< Fn >::type & fn_, boost::context::execution_context ctx, void *) mutable { // create synthesized push_coroutine< T > typename push_coroutine< T & >::control_block synthesized_cb{ this, ctx }; push_coroutine< T & > synthesized{ & synthesized_cb }; @@ -222,7 +222,7 @@ pull_coroutine< T & >::control_block::control_block( context::preallocated pallo std::placeholders::_2))}, #else ctx{ std::allocator_arg, palloc, salloc, - [this,fn_=std::forward< Fn >( fn)]( boost::context::captured_context ctx, void *) mutable { + [this,fn_=std::forward< Fn >( fn)]( boost::context::execution_context ctx, void *) mutable { // create synthesized push_coroutine< T > typename push_coroutine< T & >::control_block synthesized_cb{ this, ctx }; push_coroutine< T & > synthesized{ & synthesized_cb }; @@ -257,7 +257,7 @@ pull_coroutine< T & >::control_block::control_block( context::preallocated pallo template< typename T > pull_coroutine< T & >::control_block::control_block( typename push_coroutine< T & >::control_block * cb, - boost::context::captured_context & ctx_) noexcept : + boost::context::execution_context & ctx_) noexcept : ctx{ std::move( ctx_) }, other{ cb }, state{ state_t::none }, @@ -302,7 +302,7 @@ pull_coroutine< T & >::control_block::valid() const noexcept { inline void pull_coroutine< void >::control_block::destroy( control_block * cb) noexcept { - boost::context::captured_context ctx = std::move( cb->ctx); + boost::context::execution_context ctx = std::move( cb->ctx); // destroy control structure cb->~control_block(); // destroy coroutine's stack @@ -316,7 +316,7 @@ pull_coroutine< void >::control_block::control_block( context::preallocated pall ctx{ std::allocator_arg, palloc, salloc, std::move( std::bind( - [this]( typename std::decay< Fn >::type & fn_, boost::context::captured_context ctx, void *) mutable { + [this]( typename std::decay< Fn >::type & fn_, boost::context::execution_context ctx, void *) mutable { // create synthesized push_coroutine< T > typename push_coroutine< void >::control_block synthesized_cb{ this, ctx }; push_coroutine< void > synthesized{ & synthesized_cb }; @@ -343,7 +343,7 @@ pull_coroutine< void >::control_block::control_block( context::preallocated pall std::placeholders::_2))}, #else ctx{ std::allocator_arg, palloc, salloc, - [this,fn_=std::forward< Fn >( fn)]( boost::context::captured_context ctx, void *) mutable { + [this,fn_=std::forward< Fn >( fn)]( boost::context::execution_context ctx, void *) mutable { // create synthesized push_coroutine< T > typename push_coroutine< void >::control_block synthesized_cb{ this, ctx }; push_coroutine< void > synthesized{ & synthesized_cb }; @@ -376,7 +376,7 @@ pull_coroutine< void >::control_block::control_block( context::preallocated pall inline pull_coroutine< void >::control_block::control_block( push_coroutine< void >::control_block * cb, - boost::context::captured_context & ctx_) noexcept : + boost::context::execution_context & ctx_) noexcept : ctx{ std::move( ctx_) }, other{ cb }, state{ state_t::none }, diff --git a/include/boost/coroutine2/detail/push_control_block_ec.hpp b/include/boost/coroutine2/detail/push_control_block_ecv1.hpp similarity index 100% rename from include/boost/coroutine2/detail/push_control_block_ec.hpp rename to include/boost/coroutine2/detail/push_control_block_ecv1.hpp diff --git a/include/boost/coroutine2/detail/push_control_block_ec.ipp b/include/boost/coroutine2/detail/push_control_block_ecv1.ipp similarity index 100% rename from include/boost/coroutine2/detail/push_control_block_ec.ipp rename to include/boost/coroutine2/detail/push_control_block_ecv1.ipp diff --git a/include/boost/coroutine2/detail/push_control_block_cc.hpp b/include/boost/coroutine2/detail/push_control_block_ecv2.hpp similarity index 88% rename from include/boost/coroutine2/detail/push_control_block_cc.hpp rename to include/boost/coroutine2/detail/push_control_block_ecv2.hpp index ac4ab61..966582f 100644 --- a/include/boost/coroutine2/detail/push_control_block_cc.hpp +++ b/include/boost/coroutine2/detail/push_control_block_ecv2.hpp @@ -10,7 +10,7 @@ #include #include -#include +#include #include @@ -24,7 +24,7 @@ namespace detail { template< typename T > struct push_coroutine< T >::control_block { - boost::context::captured_context ctx; + boost::context::execution_context ctx; typename pull_coroutine< T >::control_block * other; state_t state; std::exception_ptr except; @@ -34,7 +34,7 @@ struct push_coroutine< T >::control_block { template< typename StackAllocator, typename Fn > control_block( context::preallocated, StackAllocator, Fn &&); - control_block( typename pull_coroutine< T >::control_block *, boost::context::captured_context &) noexcept; + control_block( typename pull_coroutine< T >::control_block *, boost::context::execution_context &) noexcept; control_block( control_block &) = delete; control_block & operator=( control_block &) = delete; @@ -50,7 +50,7 @@ struct push_coroutine< T >::control_block { template< typename T > struct push_coroutine< T & >::control_block { - boost::context::captured_context ctx; + boost::context::execution_context ctx; typename pull_coroutine< T & >::control_block * other; state_t state; std::exception_ptr except; @@ -60,7 +60,7 @@ struct push_coroutine< T & >::control_block { template< typename StackAllocator, typename Fn > control_block( context::preallocated, StackAllocator, Fn &&); - control_block( typename pull_coroutine< T & >::control_block *, boost::context::captured_context &) noexcept; + control_block( typename pull_coroutine< T & >::control_block *, boost::context::execution_context &) noexcept; control_block( control_block &) = delete; control_block & operator=( control_block &) = delete; @@ -73,7 +73,7 @@ struct push_coroutine< T & >::control_block { }; struct push_coroutine< void >::control_block { - boost::context::captured_context ctx; + boost::context::execution_context ctx; pull_coroutine< void >::control_block * other; state_t state; std::exception_ptr except; @@ -83,7 +83,7 @@ struct push_coroutine< void >::control_block { template< typename StackAllocator, typename Fn > control_block( context::preallocated, StackAllocator, Fn &&); - control_block( pull_coroutine< void >::control_block *, boost::context::captured_context &) noexcept; + control_block( pull_coroutine< void >::control_block *, boost::context::execution_context &) noexcept; control_block( control_block &) = delete; control_block & operator=( control_block &) = delete; diff --git a/include/boost/coroutine2/detail/push_control_block_cc.ipp b/include/boost/coroutine2/detail/push_control_block_ecv2.ipp similarity index 93% rename from include/boost/coroutine2/detail/push_control_block_cc.ipp rename to include/boost/coroutine2/detail/push_control_block_ecv2.ipp index 78a6394..461a7e1 100644 --- a/include/boost/coroutine2/detail/push_control_block_cc.ipp +++ b/include/boost/coroutine2/detail/push_control_block_ecv2.ipp @@ -14,7 +14,7 @@ #include #include -#include +#include #include #include @@ -32,7 +32,7 @@ namespace detail { template< typename T > void push_coroutine< T >::control_block::destroy( control_block * cb) noexcept { - boost::context::captured_context ctx = std::move( cb->ctx); + boost::context::execution_context ctx = std::move( cb->ctx); // destroy control structure cb->~control_block(); // destroy coroutine's stack @@ -47,7 +47,7 @@ push_coroutine< T >::control_block::control_block( context::preallocated palloc, ctx{ std::allocator_arg, palloc, salloc, std::move( std::bind( - [this]( typename std::decay< Fn >::type & fn_, boost::context::captured_context ctx, void * data) mutable { + [this]( typename std::decay< Fn >::type & fn_, boost::context::execution_context ctx, void * data) mutable { // create synthesized pull_coroutine< T > typename pull_coroutine< T >::control_block synthesized_cb{ this, ctx }; pull_coroutine< T > synthesized{ & synthesized_cb }; @@ -76,7 +76,7 @@ push_coroutine< T >::control_block::control_block( context::preallocated palloc, std::placeholders::_2))}, #else ctx{ std::allocator_arg, palloc, salloc, - [this,fn_=std::forward< Fn >( fn)]( boost::context::captured_context ctx, void * data) mutable { + [this,fn_=std::forward< Fn >( fn)]( boost::context::execution_context ctx, void * data) mutable { // create synthesized pull_coroutine< T > typename pull_coroutine< T >::control_block synthesized_cb{ this, ctx }; pull_coroutine< T > synthesized{ & synthesized_cb }; @@ -108,7 +108,7 @@ push_coroutine< T >::control_block::control_block( context::preallocated palloc, template< typename T > push_coroutine< T >::control_block::control_block( typename pull_coroutine< T >::control_block * cb, - boost::context::captured_context & ctx_) noexcept : + boost::context::execution_context & ctx_) noexcept : ctx{ std::move( ctx_) }, other{ cb }, state{ state_t::none }, @@ -157,7 +157,7 @@ push_coroutine< T >::control_block::valid() const noexcept { template< typename T > void push_coroutine< T & >::control_block::destroy( control_block * cb) noexcept { - boost::context::captured_context ctx = std::move( cb->ctx); + boost::context::execution_context ctx = std::move( cb->ctx); // destroy control structure cb->~control_block(); // destroy coroutine's stack @@ -172,7 +172,7 @@ push_coroutine< T & >::control_block::control_block( context::preallocated pallo ctx{ std::allocator_arg, palloc, salloc, std::move( std::bind( - [this]( typename std::decay< Fn >::type & fn_, boost::context::captured_context ctx, void * data) mutable { + [this]( typename std::decay< Fn >::type & fn_, boost::context::execution_context ctx, void * data) mutable { // create synthesized pull_coroutine< T > typename pull_coroutine< T & >::control_block synthesized_cb{ this, ctx }; pull_coroutine< T & > synthesized{ & synthesized_cb }; @@ -201,7 +201,7 @@ push_coroutine< T & >::control_block::control_block( context::preallocated pallo std::placeholders::_2))}, #else ctx{ std::allocator_arg, palloc, salloc, - [this,fn_=std::forward< Fn >( fn)]( boost::context::captured_context ctx, void * data) mutable { + [this,fn_=std::forward< Fn >( fn)]( boost::context::execution_context ctx, void * data) mutable { // create synthesized pull_coroutine< T > typename pull_coroutine< T & >::control_block synthesized_cb{ this, ctx }; pull_coroutine< T & > synthesized{ & synthesized_cb }; @@ -233,7 +233,7 @@ push_coroutine< T & >::control_block::control_block( context::preallocated pallo template< typename T > push_coroutine< T & >::control_block::control_block( typename pull_coroutine< T & >::control_block * cb, - boost::context::captured_context & ctx_) noexcept : + boost::context::execution_context & ctx_) noexcept : ctx{ std::move( ctx_) }, other{ cb }, state{ state_t::none }, @@ -271,7 +271,7 @@ push_coroutine< T & >::control_block::valid() const noexcept { inline void push_coroutine< void >::control_block::destroy( control_block * cb) noexcept { - boost::context::captured_context ctx = std::move( cb->ctx); + boost::context::execution_context ctx = std::move( cb->ctx); // destroy control structure cb->~control_block(); // destroy coroutine's stack @@ -284,7 +284,7 @@ push_coroutine< void >::control_block::control_block( context::preallocated pall ctx{ std::allocator_arg, palloc, salloc, std::move( std::bind( - [this]( typename std::decay< Fn >::type & fn_, boost::context::captured_context ctx, void *) mutable { + [this]( typename std::decay< Fn >::type & fn_, boost::context::execution_context ctx, void *) mutable { // create synthesized pull_coroutine< T > typename pull_coroutine< void >::control_block synthesized_cb{ this, ctx }; pull_coroutine< void > synthesized{ & synthesized_cb }; @@ -311,7 +311,7 @@ push_coroutine< void >::control_block::control_block( context::preallocated pall std::placeholders::_2))}, #else ctx{ std::allocator_arg, palloc, salloc, - [this,fn_=std::forward< Fn >( fn)]( boost::context::captured_context ctx, void *) mutable { + [this,fn_=std::forward< Fn >( fn)]( boost::context::execution_context ctx, void *) mutable { // create synthesized pull_coroutine< T > typename pull_coroutine< void >::control_block synthesized_cb{ this, ctx}; pull_coroutine< void > synthesized{ & synthesized_cb }; @@ -341,7 +341,7 @@ push_coroutine< void >::control_block::control_block( context::preallocated pall inline push_coroutine< void >::control_block::control_block( pull_coroutine< void >::control_block * cb, - boost::context::captured_context & ctx_) noexcept : + boost::context::execution_context & ctx_) noexcept : ctx{ std::move( ctx_) }, other{ cb }, state{ state_t::none },