123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- #ifndef BOOST_COBALT_WAIT_GROUP_HPP
- #define BOOST_COBALT_WAIT_GROUP_HPP
- #include <boost/cobalt/detail/wait_group.hpp>
- namespace boost::cobalt
- {
- struct wait_group
- {
-
- explicit
- wait_group(asio::cancellation_type normal_cancel = asio::cancellation_type::none,
- asio::cancellation_type exception_cancel = asio::cancellation_type::all);
-
- void push_back(promise<void> p);
-
- std::size_t size() const;
-
- std::size_t reap();
-
- void cancel(asio::cancellation_type ct = asio::cancellation_type::all);
-
-
- auto wait_one() -> detail::race_wrapper
- {
- return detail::race_wrapper(waitables_);
- }
- detail::gather_wrapper wait()
- {
- return detail::gather_wrapper(waitables_);
- }
- detail::gather_wrapper::awaitable_type operator co_await ()
- {
- return detail::gather_wrapper(waitables_).operator co_await();
- }
-
- detail::gather_wrapper await_exit(std::exception_ptr ep)
- {
- auto ct = ep ? ct_except_ : ct_normal_;
- if (ct != asio::cancellation_type::none)
- for (auto & w : waitables_)
- w.cancel(ct);
- return detail::gather_wrapper(waitables_);
- }
- private:
- std::list<promise<void>> waitables_;
- asio::cancellation_type ct_normal_, ct_except_;
-
- };
- inline wait_group::wait_group(
- asio::cancellation_type normal_cancel,
- asio::cancellation_type exception_cancel)
- : ct_normal_(normal_cancel), ct_except_(exception_cancel) {}
- inline
- std::size_t wait_group::size() const {return waitables_.size();}
- inline
- std::size_t wait_group::reap()
- {
- return erase_if(waitables_, [](promise<void> & p) { return p.ready() && p;});
- }
- inline
- void wait_group::cancel(asio::cancellation_type ct)
- {
- for (auto & w : waitables_)
- w.cancel(ct);
- }
- inline
- void wait_group::push_back(promise<void> p) { waitables_.push_back(std::move(p));}
- }
- #endif
|