diff options
Diffstat (limited to 'boost/coroutine2/detail/pull_control_block_cc.hpp')
-rw-r--r-- | boost/coroutine2/detail/pull_control_block_cc.hpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/boost/coroutine2/detail/pull_control_block_cc.hpp b/boost/coroutine2/detail/pull_control_block_cc.hpp new file mode 100644 index 0000000000..44a14e2102 --- /dev/null +++ b/boost/coroutine2/detail/pull_control_block_cc.hpp @@ -0,0 +1,128 @@ + +// Copyright Oliver Kowalke 2016. +// 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 <type_traits> + +#include <boost/config.hpp> +#include <boost/context/continuation.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::continuation c; + 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::continuation &) noexcept; + + ~control_block(); + + control_block( control_block &) = delete; + control_block & operator=( control_block &) = delete; + + void deallocate() noexcept; + + void resume(); + + void set( T const&); + void set( T &&); + void reset(); + + T & get() noexcept; + + bool valid() const noexcept; +}; + +template< typename T > +struct pull_coroutine< T & >::control_block { + struct holder { + T & t; + + holder( T & t_) : + t{ t_ } { + } + }; + + boost::context::continuation c; + typename push_coroutine< T & >::control_block * other; + state_t state; + std::exception_ptr except; + bool bvalid; + typename std::aligned_storage< sizeof( holder), alignof( holder) >::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::continuation &) noexcept; + + control_block( control_block &) = delete; + control_block & operator=( control_block &) = delete; + + void deallocate() noexcept; + + void resume(); + + void set( T &); + void reset(); + + T & get() noexcept; + + bool valid() const noexcept; +}; + +struct pull_coroutine< void >::control_block { + boost::context::continuation c; + 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::continuation &) 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 |