diff options
Diffstat (limited to 'boost/coroutine2/detail/pull_control_block_ecv1.hpp')
-rw-r--r-- | boost/coroutine2/detail/pull_control_block_ecv1.hpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/boost/coroutine2/detail/pull_control_block_ecv1.hpp b/boost/coroutine2/detail/pull_control_block_ecv1.hpp new file mode 100644 index 0000000000..16d65a3e62 --- /dev/null +++ b/boost/coroutine2/detail/pull_control_block_ecv1.hpp @@ -0,0 +1,119 @@ + +// Copyright Oliver Kowalke 2014. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_COROUTINES2_DETAIL_PULL_CONTROL_BLOCK_HPP +#define BOOST_COROUTINES2_DETAIL_PULL_CONTROL_BLOCK_HPP + +#include <exception> +#include <functional> +#include <type_traits> + +#include <boost/config.hpp> +#include <boost/context/execution_context.hpp> + +#include <boost/coroutine2/detail/state.hpp> + +#ifdef BOOST_HAS_ABI_HEADERS +# include BOOST_ABI_PREFIX +#endif + +namespace boost { +namespace coroutines2 { +namespace detail { + +template< typename T > +struct pull_coroutine< T >::control_block { + boost::context::execution_context ctx; + typename push_coroutine< T >::control_block * other; + state_t state; + std::exception_ptr except; + bool bvalid; + typename std::aligned_storage< sizeof( T), alignof( T) >::type storage; + + static void destroy( control_block * cb) noexcept; + + template< typename StackAllocator, typename Fn > + control_block( context::preallocated, StackAllocator, Fn &&); + + control_block( typename push_coroutine< T >::control_block *, boost::context::execution_context const&) noexcept; + + ~control_block() noexcept; + + control_block( control_block &) = delete; + control_block & operator=( control_block &) = delete; + + void deallocate() noexcept; + + void resume(); + + void set( T *); + + T & get() noexcept; + + bool valid() const noexcept; +}; + +template< typename T > +struct pull_coroutine< T & >::control_block { + boost::context::execution_context ctx; + typename push_coroutine< T & >::control_block * other; + state_t state; + std::exception_ptr except; + T * t; + + static void destroy( control_block * cb) noexcept; + + template< typename StackAllocator, typename Fn > + control_block( context::preallocated, StackAllocator, Fn &&); + + control_block( typename push_coroutine< T & >::control_block *, boost::context::execution_context const&) noexcept; + + ~control_block() noexcept; + + control_block( control_block &) = delete; + control_block & operator=( control_block &) = delete; + + void deallocate() noexcept; + + void resume(); + + T & get() noexcept; + + bool valid() const noexcept; +}; + +struct pull_coroutine< void >::control_block { + boost::context::execution_context ctx; + push_coroutine< void >::control_block * other; + state_t state; + std::exception_ptr except; + + static void destroy( control_block * cb) noexcept; + + template< typename StackAllocator, typename Fn > + control_block( context::preallocated, StackAllocator, Fn &&); + + control_block( push_coroutine< void >::control_block *, boost::context::execution_context const&) noexcept; + + ~control_block() noexcept; + + control_block( control_block &) = delete; + control_block & operator=( control_block &) = delete; + + void deallocate() noexcept; + + void resume(); + + bool valid() const noexcept; +}; + +}}} + +#ifdef BOOST_HAS_ABI_HEADERS +# include BOOST_ABI_SUFFIX +#endif + +#endif // BOOST_COROUTINES2_DETAIL_PULL_CONTROL_BLOCK_HPP |