YACLib
C++ library for concurrent tasks execution
Loading...
Searching...
No Matches
join.hpp
Go to the documentation of this file.
1#pragma once
2
7
8#include <atomic>
9
10namespace yaclib::when {
11
12template <FailPolicy F, typename OutputValue, typename Trait, typename InputCore>
13struct Join {
14 static_assert(F != FailPolicy::LastFail, "LastFail policy is not supported by Join");
15 static_assert(std::is_void_v<OutputValue>, "OutputValue should be void for Join");
16};
17
18template <typename Trait, typename InputCore>
19struct Join<FailPolicy::None, void, Trait, InputCore> {
21
22 static constexpr ConsumePolicy kConsumePolicy = ConsumePolicy::None;
23 static constexpr CorePolicy kCorePolicy = CorePolicy::Managed;
24
25 Join(std::size_t count, PromiseType p) noexcept : _p{std::move(p)} {
26 }
27
29 std::move(_p).Set();
30 }
31
32 private:
33 PromiseType _p;
34};
35
36template <typename Trait, typename InputCore>
39
40 static constexpr ConsumePolicy kConsumePolicy = ConsumePolicy::Unordered;
41 static constexpr CorePolicy kCorePolicy = CorePolicy::Managed;
42
43 Join(std::size_t count, PromiseType p) noexcept : _p{std::move(p)} {
44 }
45
46 template <typename R>
47 void Consume(R&& result) {
48 if (!Trait::Ok(result) && !_done.load(std::memory_order_relaxed) &&
49 !_done.exchange(true, std::memory_order_acq_rel)) {
50 std::move(_p).Set(Trait::GetError(std::forward<R>(result)));
51 }
52 }
53
55 if (_p.Valid()) {
56 std::move(_p).Set();
57 }
58 }
59
60 private:
61 yaclib_std::atomic_bool _done = false;
62 PromiseType _p;
63};
64
65} // namespace yaclib::when
atomic< bool > atomic_bool
Definition atomic.hpp:41
Contract< V, T > MakeContract()
Creates related future and promise.
Definition contract.hpp:25
FailPolicy
This Policy describe how algorithm interpret if Future will be fulfilled by fail (exception or error)
Join(std::size_t count, PromiseType p) noexcept
Definition join.hpp:43
Join(std::size_t count, PromiseType p) noexcept
Definition join.hpp:25