123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- // 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/fiber.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::fiber 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::fiber &) 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 &&);
- 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::fiber 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::fiber &) 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;
- };
- struct pull_coroutine< void >::control_block {
- boost::context::fiber 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::fiber &) 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
|