?????????? ????????? - ??????????????? - /home/agenciai/public_html/cd38d8/fiber.zip
???????
PK o\�[.�<� � barrier.hppnu �[��� // Copyright Oliver Kowalke 2013. // 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_FIBERS_BARRIER_H #define BOOST_FIBERS_BARRIER_H #include <cstddef> #include <boost/config.hpp> #include <boost/fiber/condition_variable.hpp> #include <boost/fiber/detail/config.hpp> #include <boost/fiber/mutex.hpp> #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX #endif namespace boost { namespace fibers { class BOOST_FIBERS_DECL barrier { private: std::size_t initial_; std::size_t current_; std::size_t cycle_{ 0 }; mutex mtx_{}; condition_variable cond_{}; public: explicit barrier( std::size_t); barrier( barrier const&) = delete; barrier & operator=( barrier const&) = delete; bool wait(); }; }} #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_SUFFIX #endif #endif // BOOST_FIBERS_BARRIER_H PK o\�[�9�c future/packaged_task.hppnu �[��� // Copyright Oliver Kowalke 2013. // 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_FIBERS_PACKAGED_TASK_HPP #define BOOST_FIBERS_PACKAGED_TASK_HPP #include <algorithm> #include <memory> #include <type_traits> #include <utility> #include <boost/config.hpp> #include <boost/fiber/detail/disable_overload.hpp> #include <boost/fiber/exceptions.hpp> #include <boost/fiber/future/detail/task_base.hpp> #include <boost/fiber/future/detail/task_object.hpp> #include <boost/fiber/future/future.hpp> namespace boost { namespace fibers { template< typename Signature > class packaged_task; template< typename R, typename ... Args > class packaged_task< R( Args ... ) > { private: typedef typename detail::task_base< R, Args ... >::ptr_type ptr_type; bool obtained_{ false }; ptr_type task_{}; public: packaged_task() = default; template< typename Fn, typename = detail::disable_overload< packaged_task, Fn > > explicit packaged_task( Fn && fn) : packaged_task{ std::allocator_arg, std::allocator< packaged_task >{}, std::forward< Fn >( fn) } { } template< typename Fn, typename Allocator > explicit packaged_task( std::allocator_arg_t, Allocator const& alloc, Fn && fn) { typedef detail::task_object< typename std::decay< Fn >::type, Allocator, R, Args ... > object_type; typedef std::allocator_traits< typename object_type::allocator_type > traits_type; typedef pointer_traits< typename traits_type::pointer > ptrait_type; typename object_type::allocator_type a{ alloc }; typename traits_type::pointer ptr{ traits_type::allocate( a, 1) }; typename ptrait_type::element_type* p = boost::to_address(ptr); try { traits_type::construct( a, p, a, std::forward< Fn >( fn) ); } catch (...) { traits_type::deallocate( a, ptr, 1); throw; } task_.reset(p); } ~packaged_task() { if ( task_ && obtained_) { task_->owner_destroyed(); } } packaged_task( packaged_task const&) = delete; packaged_task & operator=( packaged_task const&) = delete; packaged_task( packaged_task && other) noexcept : obtained_{ other.obtained_ }, task_{ std::move( other.task_) } { other.obtained_ = false; } packaged_task & operator=( packaged_task && other) noexcept { if ( BOOST_LIKELY( this != & other) ) { packaged_task tmp{ std::move( other) }; swap( tmp); } return * this; } void swap( packaged_task & other) noexcept { std::swap( obtained_, other.obtained_); task_.swap( other.task_); } bool valid() const noexcept { return nullptr != task_.get(); } future< R > get_future() { if ( obtained_) { throw future_already_retrieved{}; } if ( BOOST_UNLIKELY( ! valid() ) ) { throw packaged_task_uninitialized{}; } obtained_ = true; return future< R >{ boost::static_pointer_cast< detail::shared_state< R > >( task_) }; } void operator()( Args ... args) { if ( BOOST_UNLIKELY( ! valid() ) ) { throw packaged_task_uninitialized{}; } task_->run( std::forward< Args >( args) ... ); } void reset() { if ( BOOST_UNLIKELY( ! valid() ) ) { throw packaged_task_uninitialized{}; } packaged_task tmp; tmp.task_ = task_; task_ = tmp.task_->reset(); obtained_ = false; } }; template< typename Signature > void swap( packaged_task< Signature > & l, packaged_task< Signature > & r) noexcept { l.swap( r); } }} #endif // BOOST_FIBERS_PACKAGED_TASK_HPP PK o\�[�>p�- �- future/future.hppnu �[��� // Copyright Oliver Kowalke 2013. // 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_FIBERS_FUTURE_HPP #define BOOST_FIBERS_FUTURE_HPP #include <algorithm> #include <chrono> #include <exception> #include <utility> #include <boost/config.hpp> #include <boost/fiber/detail/config.hpp> #include <boost/fiber/exceptions.hpp> #include <boost/fiber/future/detail/shared_state.hpp> #include <boost/fiber/future/future_status.hpp> namespace boost { namespace fibers { namespace detail { template< typename R > struct future_base { typedef typename shared_state< R >::ptr_type ptr_type; ptr_type state_{}; future_base() = default; explicit future_base( ptr_type p) noexcept : state_{std::move( p )} { } ~future_base() = default; future_base( future_base const& other) : state_{ other.state_ } { } future_base( future_base && other) noexcept : state_{ other.state_ } { other.state_.reset(); } future_base & operator=( future_base const& other) noexcept { if ( BOOST_LIKELY( this != & other) ) { state_ = other.state_; } return * this; } future_base & operator=( future_base && other) noexcept { if ( BOOST_LIKELY( this != & other) ) { state_ = other.state_; other.state_.reset(); } return * this; } bool valid() const noexcept { return nullptr != state_.get(); } std::exception_ptr get_exception_ptr() { if ( BOOST_UNLIKELY( ! valid() ) ) { throw future_uninitialized{}; } return state_->get_exception_ptr(); } void wait() const { if ( BOOST_UNLIKELY( ! valid() ) ) { throw future_uninitialized{}; } state_->wait(); } template< typename Rep, typename Period > future_status wait_for( std::chrono::duration< Rep, Period > const& timeout_duration) const { if ( BOOST_UNLIKELY( ! valid() ) ) { throw future_uninitialized{}; } return state_->wait_for( timeout_duration); } template< typename Clock, typename Duration > future_status wait_until( std::chrono::time_point< Clock, Duration > const& timeout_time) const { if ( BOOST_UNLIKELY( ! valid() ) ) { throw future_uninitialized{}; } return state_->wait_until( timeout_time); } }; template< typename R > struct promise_base; } template< typename R > class shared_future; template< typename Signature > class packaged_task; template< typename R > class future : private detail::future_base< R > { private: typedef detail::future_base< R > base_type; friend struct detail::promise_base< R >; friend class shared_future< R >; template< typename Signature > friend class packaged_task; explicit future( typename base_type::ptr_type const& p) noexcept : base_type{ p } { } public: future() = default; future( future const&) = delete; future & operator=( future const&) = delete; future( future && other) noexcept : base_type{ std::move( other) } { } future & operator=( future && other) noexcept { if ( BOOST_LIKELY( this != & other) ) { base_type::operator=( std::move( other) ); } return * this; } shared_future< R > share(); R get() { if ( BOOST_UNLIKELY( ! base_type::valid() ) ) { throw future_uninitialized{}; } typename base_type::ptr_type tmp{}; tmp.swap( base_type::state_); return std::move( tmp->get() ); } using base_type::valid; using base_type::get_exception_ptr; using base_type::wait; using base_type::wait_for; using base_type::wait_until; }; template< typename R > class future< R & > : private detail::future_base< R & > { private: typedef detail::future_base< R & > base_type; friend struct detail::promise_base< R & >; friend class shared_future< R & >; template< typename Signature > friend class packaged_task; explicit future( typename base_type::ptr_type const& p) noexcept : base_type{ p } { } public: future() = default; future( future const&) = delete; future & operator=( future const&) = delete; future( future && other) noexcept : base_type{ std::move( other) } { } future & operator=( future && other) noexcept { if ( BOOST_LIKELY( this != & other) ) { base_type::operator=( std::move( other) ); } return * this; } shared_future< R & > share(); R & get() { if ( BOOST_UNLIKELY( ! base_type::valid() ) ) { throw future_uninitialized{}; } typename base_type::ptr_type tmp{}; tmp.swap( base_type::state_); return tmp->get(); } using base_type::valid; using base_type::get_exception_ptr; using base_type::wait; using base_type::wait_for; using base_type::wait_until; }; template<> class future< void > : private detail::future_base< void > { private: typedef detail::future_base< void > base_type; friend struct detail::promise_base< void >; friend class shared_future< void >; template< typename Signature > friend class packaged_task; explicit future( base_type::ptr_type const& p) noexcept : base_type{ p } { } public: future() = default; future( future const&) = delete; future & operator=( future const&) = delete; inline future( future && other) noexcept : base_type{ std::move( other) } { } inline future & operator=( future && other) noexcept { if ( BOOST_LIKELY( this != & other) ) { base_type::operator=( std::move( other) ); } return * this; } shared_future< void > share(); inline void get() { if ( BOOST_UNLIKELY( ! base_type::valid() ) ) { throw future_uninitialized{}; } base_type::ptr_type tmp{}; tmp.swap( base_type::state_); tmp->get(); } using base_type::valid; using base_type::get_exception_ptr; using base_type::wait; using base_type::wait_for; using base_type::wait_until; }; template< typename R > class shared_future : private detail::future_base< R > { private: typedef detail::future_base< R > base_type; explicit shared_future( typename base_type::ptr_type const& p) noexcept : base_type{ p } { } public: shared_future() = default; ~shared_future() = default; shared_future( shared_future const& other) : base_type{ other } { } shared_future( shared_future && other) noexcept : base_type{ std::move( other) } { } shared_future( future< R > && other) noexcept : base_type{ std::move( other) } { } shared_future & operator=( shared_future const& other) noexcept { if ( BOOST_LIKELY( this != & other) ) { base_type::operator=( other); } return * this; } shared_future & operator=( shared_future && other) noexcept { if ( BOOST_LIKELY( this != & other) ) { base_type::operator=( std::move( other) ); } return * this; } shared_future & operator=( future< R > && other) noexcept { base_type::operator=( std::move( other) ); return * this; } R const& get() const { if ( BOOST_UNLIKELY( ! valid() ) ) { throw future_uninitialized{}; } return base_type::state_->get(); } using base_type::valid; using base_type::get_exception_ptr; using base_type::wait; using base_type::wait_for; using base_type::wait_until; }; template< typename R > class shared_future< R & > : private detail::future_base< R & > { private: typedef detail::future_base< R & > base_type; explicit shared_future( typename base_type::ptr_type const& p) noexcept : base_type{ p } { } public: shared_future() = default; ~shared_future() = default; shared_future( shared_future const& other) : base_type{ other } { } shared_future( shared_future && other) noexcept : base_type{ std::move( other) } { } shared_future( future< R & > && other) noexcept : base_type{ std::move( other) } { } shared_future & operator=( shared_future const& other) noexcept { if ( BOOST_LIKELY( this != & other) ) { base_type::operator=( other); } return * this; } shared_future & operator=( shared_future && other) noexcept { if ( BOOST_LIKELY( this != & other) ) { base_type::operator=( std::move( other) ); } return * this; } shared_future & operator=( future< R & > && other) noexcept { base_type::operator=( std::move( other) ); return * this; } R & get() const { if ( BOOST_UNLIKELY( ! valid() ) ) { throw future_uninitialized{}; } return base_type::state_->get(); } using base_type::valid; using base_type::get_exception_ptr; using base_type::wait; using base_type::wait_for; using base_type::wait_until; }; template<> class shared_future< void > : private detail::future_base< void > { private: typedef detail::future_base< void > base_type; explicit shared_future( base_type::ptr_type const& p) noexcept : base_type{ p } { } public: shared_future() = default; ~shared_future() = default; inline shared_future( shared_future const& other) : base_type{ other } { } inline shared_future( shared_future && other) noexcept : base_type{ std::move( other) } { } inline shared_future( future< void > && other) noexcept : base_type{ std::move( other) } { } inline shared_future & operator=( shared_future const& other) noexcept { if ( BOOST_LIKELY( this != & other) ) { base_type::operator=( other); } return * this; } inline shared_future & operator=( shared_future && other) noexcept { if ( BOOST_LIKELY( this != & other) ) { base_type::operator=( std::move( other) ); } return * this; } inline shared_future & operator=( future< void > && other) noexcept { base_type::operator=( std::move( other) ); return * this; } inline void get() const { if ( BOOST_UNLIKELY( ! valid() ) ) { throw future_uninitialized{}; } base_type::state_->get(); } using base_type::valid; using base_type::get_exception_ptr; using base_type::wait; using base_type::wait_for; using base_type::wait_until; }; template< typename R > shared_future< R > future< R >::share() { if ( BOOST_UNLIKELY( ! base_type::valid() ) ) { throw future_uninitialized{}; } return shared_future< R >{ std::move( * this) }; } template< typename R > shared_future< R & > future< R & >::share() { if ( BOOST_UNLIKELY( ! base_type::valid() ) ) { throw future_uninitialized{}; } return shared_future< R & >{ std::move( * this) }; } inline shared_future< void > future< void >::share() { if ( BOOST_UNLIKELY( ! base_type::valid() ) ) { throw future_uninitialized{}; } return shared_future< void >{ std::move( * this) }; } }} #endif PK o\�[��as% % future/promise.hppnu �[��� // Copyright Oliver Kowalke 2013. // 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_FIBERS_PROMISE_HPP #define BOOST_FIBERS_PROMISE_HPP #include <algorithm> #include <memory> #include <utility> #include <boost/config.hpp> #include <boost/core/pointer_traits.hpp> #include <boost/fiber/exceptions.hpp> #include <boost/fiber/future/detail/shared_state.hpp> #include <boost/fiber/future/detail/shared_state_object.hpp> #include <boost/fiber/future/future.hpp> namespace boost { namespace fibers { namespace detail { template< typename R > struct promise_base { typedef typename shared_state< R >::ptr_type ptr_type; bool obtained_{ false }; ptr_type future_{}; promise_base() : promise_base{ std::allocator_arg, std::allocator< promise_base >{} } { } template< typename Allocator > promise_base( std::allocator_arg_t, Allocator alloc) { typedef detail::shared_state_object< R, Allocator > object_type; typedef std::allocator_traits< typename object_type::allocator_type > traits_type; typedef pointer_traits< typename traits_type::pointer > ptrait_type; typename object_type::allocator_type a{ alloc }; typename traits_type::pointer ptr{ traits_type::allocate( a, 1) }; typename ptrait_type::element_type* p = boost::to_address(ptr); try { traits_type::construct( a, p, a); } catch (...) { traits_type::deallocate( a, ptr, 1); throw; } future_.reset(p); } ~promise_base() { if ( future_ && obtained_) { future_->owner_destroyed(); } } promise_base( promise_base const&) = delete; promise_base & operator=( promise_base const&) = delete; promise_base( promise_base && other) noexcept : obtained_{ other.obtained_ }, future_{ std::move( other.future_) } { other.obtained_ = false; } promise_base & operator=( promise_base && other) noexcept { if ( BOOST_LIKELY( this != & other) ) { promise_base tmp{ std::move( other) }; swap( tmp); } return * this; } future< R > get_future() { if ( BOOST_UNLIKELY( obtained_) ) { throw future_already_retrieved{}; } if ( BOOST_UNLIKELY( ! future_) ) { throw promise_uninitialized{}; } obtained_ = true; return future< R >{ future_ }; } void swap( promise_base & other) noexcept { std::swap( obtained_, other.obtained_); future_.swap( other.future_); } void set_exception( std::exception_ptr p) { if ( BOOST_UNLIKELY( ! future_) ) { throw promise_uninitialized{}; } future_->set_exception( p); } }; } template< typename R > class promise : private detail::promise_base< R > { private: typedef detail::promise_base< R > base_type; public: promise() = default; template< typename Allocator > promise( std::allocator_arg_t, Allocator alloc) : base_type{ std::allocator_arg, alloc } { } promise( promise const&) = delete; promise & operator=( promise const&) = delete; promise( promise && other) noexcept = default; promise & operator=( promise && other) = default; void set_value( R const& value) { if ( BOOST_UNLIKELY( ! base_type::future_) ) { throw promise_uninitialized{}; } base_type::future_->set_value( value); } void set_value( R && value) { if ( BOOST_UNLIKELY( ! base_type::future_) ) { throw promise_uninitialized{}; } base_type::future_->set_value( std::move( value) ); } void swap( promise & other) noexcept { base_type::swap( other); } using base_type::get_future; using base_type::set_exception; }; template< typename R > class promise< R & > : private detail::promise_base< R & > { private: typedef detail::promise_base< R & > base_type; public: promise() = default; template< typename Allocator > promise( std::allocator_arg_t, Allocator alloc) : base_type{ std::allocator_arg, alloc } { } promise( promise const&) = delete; promise & operator=( promise const&) = delete; promise( promise && other) noexcept = default; promise & operator=( promise && other) noexcept = default; void set_value( R & value) { if ( BOOST_UNLIKELY( ! base_type::future_) ) { throw promise_uninitialized{}; } base_type::future_->set_value( value); } void swap( promise & other) noexcept { base_type::swap( other); } using base_type::get_future; using base_type::set_exception; }; template<> class promise< void > : private detail::promise_base< void > { private: typedef detail::promise_base< void > base_type; public: promise() = default; template< typename Allocator > promise( std::allocator_arg_t, Allocator alloc) : base_type{ std::allocator_arg, alloc } { } promise( promise const&) = delete; promise & operator=( promise const&) = delete; promise( promise && other) noexcept = default; promise & operator=( promise && other) noexcept = default; inline void set_value() { if ( BOOST_UNLIKELY( ! base_type::future_) ) { throw promise_uninitialized{}; } base_type::future_->set_value(); } inline void swap( promise & other) noexcept { base_type::swap( other); } using base_type::get_future; using base_type::set_exception; }; template< typename R > void swap( promise< R > & l, promise< R > & r) noexcept { l.swap( r); } }} #endif // BOOST_FIBERS_PROMISE_HPP PK o\�[|jt� future/detail/task_object.hppnu �[��� // Copyright Oliver Kowalke 2013. // 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_FIBERS_DETAIL_TASK_OBJECT_H #define BOOST_FIBERS_DETAIL_TASK_OBJECT_H #include <exception> #include <memory> #include <tuple> #include <utility> #include <boost/config.hpp> #include <boost/context/detail/config.hpp> #if defined(BOOST_NO_CXX17_STD_APPLY) #include <boost/context/detail/apply.hpp> #endif #include <boost/core/pointer_traits.hpp> #include <boost/fiber/detail/config.hpp> #include <boost/fiber/future/detail/task_base.hpp> #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX #endif namespace boost { namespace fibers { namespace detail { template< typename Fn, typename Allocator, typename R, typename ... Args > class task_object : public task_base< R, Args ... > { private: typedef task_base< R, Args ... > base_type; typedef std::allocator_traits< Allocator > allocator_traits; public: typedef typename allocator_traits::template rebind_alloc< task_object > allocator_type; task_object( allocator_type const& alloc, Fn const& fn) : base_type{}, fn_{ fn }, alloc_{ alloc } { } task_object( allocator_type const& alloc, Fn && fn) : base_type{}, fn_{ std::move( fn) }, alloc_{ alloc } { } void run( Args && ... args) override final { try { this->set_value( #if defined(BOOST_NO_CXX17_STD_APPLY) boost::context::detail::apply( fn_, std::make_tuple( std::forward< Args >( args) ... ) ) #else std::apply( fn_, std::make_tuple( std::forward< Args >( args) ... ) ) #endif ); #if defined(BOOST_CONTEXT_HAS_CXXABI_H) } catch ( abi::__forced_unwind const&) { throw; #endif } catch (...) { this->set_exception( std::current_exception() ); } } typename base_type::ptr_type reset() override final { typedef std::allocator_traits< allocator_type > traity_type; typedef pointer_traits< typename traity_type::pointer> ptrait_type; typename traity_type::pointer ptr{ traity_type::allocate( alloc_, 1) }; typename ptrait_type::element_type* p = boost::to_address(ptr); try { traity_type::construct( alloc_, p, alloc_, std::move( fn_) ); } catch (...) { traity_type::deallocate( alloc_, ptr, 1); throw; } return { p }; } protected: void deallocate_future() noexcept override final { destroy_( alloc_, this); } private: Fn fn_; allocator_type alloc_; static void destroy_( allocator_type const& alloc, task_object * p) noexcept { allocator_type a{ alloc }; typedef std::allocator_traits< allocator_type > traity_type; traity_type::destroy( a, p); traity_type::deallocate( a, p, 1); } }; template< typename Fn, typename Allocator, typename ... Args > class task_object< Fn, Allocator, void, Args ... > : public task_base< void, Args ... > { private: typedef task_base< void, Args ... > base_type; typedef std::allocator_traits< Allocator > allocator_traits; public: typedef typename allocator_traits::template rebind_alloc< task_object< Fn, Allocator, void, Args ... > > allocator_type; task_object( allocator_type const& alloc, Fn const& fn) : base_type{}, fn_{ fn }, alloc_{ alloc } { } task_object( allocator_type const& alloc, Fn && fn) : base_type{}, fn_{ std::move( fn) }, alloc_{ alloc } { } void run( Args && ... args) override final { try { #if defined(BOOST_NO_CXX17_STD_APPLY) boost::context::detail::apply( fn_, std::make_tuple( std::forward< Args >( args) ... ) ); #else std::apply( fn_, std::make_tuple( std::forward< Args >( args) ... ) ); #endif this->set_value(); #if defined(BOOST_CONTEXT_HAS_CXXABI_H) } catch ( abi::__forced_unwind const&) { throw; #endif } catch (...) { this->set_exception( std::current_exception() ); } } typename base_type::ptr_type reset() override final { typedef std::allocator_traits< allocator_type > traity_type; typedef pointer_traits< typename traity_type::pointer> ptrait_type; typename traity_type::pointer ptr{ traity_type::allocate( alloc_, 1) }; typename ptrait_type::element_type* p = boost::to_address(ptr); try { traity_type::construct( alloc_, p, alloc_, std::move( fn_) ); } catch (...) { traity_type::deallocate( alloc_, ptr, 1); throw; } return { p }; } protected: void deallocate_future() noexcept override final { destroy_( alloc_, this); } private: Fn fn_; allocator_type alloc_; static void destroy_( allocator_type const& alloc, task_object * p) noexcept { allocator_type a{ alloc }; typedef std::allocator_traits< allocator_type > traity_type; traity_type::destroy( a, p); traity_type::deallocate( a, p, 1); } }; }}} #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_SUFFIX #endif #endif // BOOST_FIBERS_DETAIL_TASK_OBJECT_H PK o\�[�r�K� � future/detail/task_base.hppnu �[��� // Copyright Oliver Kowalke 2013. // 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_FIBERS_DETAIL_TASK_BASE_H #define BOOST_FIBERS_DETAIL_TASK_BASE_H #include <boost/config.hpp> #include <boost/intrusive_ptr.hpp> #include <boost/fiber/detail/config.hpp> #include <boost/fiber/future/detail/shared_state.hpp> #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX #endif namespace boost { namespace fibers { namespace detail { template< typename R, typename ... Args > struct task_base : public shared_state< R > { typedef intrusive_ptr< task_base > ptr_type; virtual ~task_base() { } virtual void run( Args && ... args) = 0; virtual ptr_type reset() = 0; }; }}} #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_SUFFIX #endif #endif // BOOST_FIBERS_DETAIL_TASK_BASE_H PK o\�[��.f % future/detail/shared_state_object.hppnu �[��� // Copyright Oliver Kowalke 2013. // 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_FIBERS_DETAIL_SHARED_STATE_OBJECT_H #define BOOST_FIBERS_DETAIL_SHARED_STATE_OBJECT_H #include <memory> #include <boost/config.hpp> #include <boost/fiber/detail/config.hpp> #include <boost/fiber/future/detail/shared_state.hpp> #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX #endif namespace boost { namespace fibers { namespace detail { template< typename R, typename Allocator > class shared_state_object : public shared_state< R > { public: typedef typename std::allocator_traits< Allocator >::template rebind_alloc< shared_state_object > allocator_type; shared_state_object( allocator_type const& alloc) : shared_state< R >{}, alloc_{ alloc } { } protected: void deallocate_future() noexcept override final { destroy_( alloc_, this); } private: allocator_type alloc_; static void destroy_( allocator_type const& alloc, shared_state_object * p) noexcept { allocator_type a{ alloc }; typedef std::allocator_traits< allocator_type > traity_type; traity_type::destroy( a, p); traity_type::deallocate( a, p, 1); } }; }}} #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_SUFFIX #endif #endif // BOOST_FIBERS_DETAIL_SHARED_STATE_OBJECT_H PK o\�[8K��J"