YACLib
C++ library for concurrent tasks execution
Loading...
Searching...
No Matches
join.hpp
Go to the documentation of this file.
1
#pragma once
2
3
#include <
yaclib/async/promise.hpp
>
4
#include <
yaclib/util/combinator_strategy.hpp
>
5
#include <
yaclib/util/fail_policy.hpp
>
6
#include <
yaclib/util/result.hpp
>
7
8
#include <atomic>
9
10
namespace
yaclib::when
{
11
12
template
<FailPolicy F,
typename
OutputValue,
typename
OutputError,
typename
InputCore>
13
struct
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
18
template
<
typename
OutputError,
typename
InputCore>
19
struct
Join
<
FailPolicy
::
None
,
void
,
OutputError
,
InputCore
> {
20
using
PromiseType
=
Promise<void, OutputError>
;
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
28
~Join
() {
29
std::move(_p).Set();
30
}
31
32
private
:
33
PromiseType _p;
34
};
35
36
template
<
typename
OutputError,
typename
InputCore>
37
struct
Join
<
FailPolicy
::
FirstFail
,
void
,
OutputError
,
InputCore
> {
38
using
PromiseType
=
Promise<void, OutputError>
;
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>
47
void
Consume
(
Result
&&
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
57
~Join
() {
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
yaclib::Promise< void, OutputError >
yaclib::Result
Encapsulated return value from caller.
Definition
result.hpp:90
combinator_strategy.hpp
fail_policy.hpp
yaclib::when
Definition
all.hpp:13
yaclib_std::atomic_bool
atomic< bool > atomic_bool
Definition
atomic.hpp:41
yaclib::FailPolicy
FailPolicy
This Policy describe how algorithm interpret if Future will be fulfilled by fail (exception or error)
Definition
fail_policy.hpp:12
yaclib::FailPolicy::FirstFail
@ FirstFail
yaclib::FailPolicy::LastFail
@ LastFail
yaclib::ConsumePolicy
ConsumePolicy
Definition
combinator_strategy.hpp:24
yaclib::ConsumePolicy::Unordered
@ Unordered
yaclib::ConsumePolicy::None
@ None
yaclib::MakeContract
Contract< V, E > MakeContract()
Creates related future and promise.
Definition
contract.hpp:25
yaclib::CorePolicy
CorePolicy
Definition
combinator_strategy.hpp:35
yaclib::CorePolicy::Managed
@ Managed
yaclib::ResultState::Error
@ Error
yaclib::ResultState::Exception
@ Exception
promise.hpp
result.hpp
yaclib::when::Join< FailPolicy::FirstFail, void, OutputError, InputCore >::Join
Join(std::size_t count, PromiseType p) noexcept
Definition
join.hpp:43
yaclib::when::Join< FailPolicy::FirstFail, void, OutputError, InputCore >::~Join
~Join()
Definition
join.hpp:57
yaclib::when::Join< FailPolicy::FirstFail, void, OutputError, InputCore >::Consume
void Consume(Result &&result)
Definition
join.hpp:47
yaclib::when::Join< FailPolicy::None, void, OutputError, InputCore >::Join
Join(std::size_t count, PromiseType p) noexcept
Definition
join.hpp:25
yaclib::when::Join< FailPolicy::None, void, OutputError, InputCore >::~Join
~Join()
Definition
join.hpp:28
yaclib::when::Join
Definition
join.hpp:13
include
yaclib
async
when
join.hpp
Generated by
1.9.8