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 OutputError, 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 OutputError, typename 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 OutputError, 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 Result>
48 if (!result && !_done.load(std::memory_order_relaxed) && !_done.exchange(true, std::memory_order_acq_rel)) {
49 if (result.State() == ResultState::Error) {
50 std::move(_p).Set(std::forward<Result>(result).Error());
51 } else {
52 std::move(_p).Set(std::forward<Result>(result).Exception());
53 }
54 }
55 }
56
58 if (_p.Valid()) {
59 std::move(_p).Set();
60 }
61 }
62
63 private:
64 yaclib_std::atomic_bool _done = false;
65 PromiseType _p;
66};
67
68} // namespace yaclib::when
Encapsulated return value from caller.
Definition result.hpp:90
atomic< bool > atomic_bool
Definition atomic.hpp:41
FailPolicy
This Policy describe how algorithm interpret if Future will be fulfilled by fail (exception or error)
Contract< V, E > MakeContract()
Creates related future and promise.
Definition contract.hpp:25
Join(std::size_t count, PromiseType p) noexcept
Definition join.hpp:25