diff options
Diffstat (limited to 'boost/coroutine2/detail/push_control_block_cc.hpp')
-rw-r--r-- | boost/coroutine2/detail/push_control_block_cc.hpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/boost/coroutine2/detail/push_control_block_cc.hpp b/boost/coroutine2/detail/push_control_block_cc.hpp new file mode 100644 index 0000000000..d01c98f089 --- /dev/null +++ b/boost/coroutine2/detail/push_control_block_cc.hpp @@ -0,0 +1,104 @@ + +// 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_PUSH_CONTROL_BLOCK_HPP +#define BOOST_COROUTINES2_DETAIL_PUSH_CONTROL_BLOCK_HPP + +#include <exception> + +#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 push_coroutine< T >::control_block { + boost::context::continuation c; + typename pull_coroutine< T >::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( typename pull_coroutine< T >::control_block *, boost::context::continuation &) noexcept; + + control_block( control_block &) = delete; + control_block & operator=( control_block &) = delete; + + void deallocate() noexcept; + + void resume( T const&); + + void resume( T &&); + + bool valid() const noexcept; +}; + +template< typename T > +struct push_coroutine< T & >::control_block { + boost::context::continuation c; + typename pull_coroutine< T & >::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( typename pull_coroutine< T & >::control_block *, boost::context::continuation &) noexcept; + + control_block( control_block &) = delete; + control_block & operator=( control_block &) = delete; + + void deallocate() noexcept; + + void resume( T &); + + bool valid() const noexcept; +}; + +struct push_coroutine< void >::control_block { + boost::context::continuation c; + pull_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( pull_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_PUSH_CONTROL_BLOCK_HPP |