YACLib
C++ library for concurrent tasks execution
Loading...
Searching...
No Matches
all_tuple.hpp
Go to the documentation of this file.
1
#pragma once
2
3
#include <
yaclib_std/detail/atomic.hpp
>
4
5
#include <
yaclib/async/promise.hpp
>
6
#include <
yaclib/util/combinator_strategy.hpp
>
7
#include <
yaclib/util/fail_policy.hpp
>
8
#include <
yaclib/util/result.hpp
>
9
#include <
yaclib/util/type_traits.hpp
>
10
11
namespace
yaclib::when
{
12
13
template
<FailPolicy F,
typename
OutputValue,
typename
OutputError,
typename
InputCore>
14
struct
AllTuple
{
15
static_assert
(F !=
FailPolicy::LastFail
,
"LastFail policy is not supported by AllTuple"
);
16
};
17
18
template
<
typename
OutputValue,
typename
OutputError,
typename
InputCore>
19
struct
AllTuple
<
FailPolicy
::
None
, OutputValue,
OutputError
,
InputCore
> {
20
using
PromiseType
=
Promise<OutputValue, OutputError>
;
21
22
static
constexpr
ConsumePolicy
kConsumePolicy =
ConsumePolicy::Static
;
23
static
constexpr
CorePolicy
kCorePolicy =
CorePolicy::Managed
;
24
25
AllTuple
(std::size_t count,
PromiseType
p
) : _p{std::
move
(
p
)} {
26
}
27
28
template
<std::
size_t
Index,
typename
Result>
29
void
Consume
(
Result
&&
result
) {
30
std::get<Index>(_tuple) = std::forward<Result>(
result
);
31
}
32
33
~AllTuple
() {
34
std::move(_p).Set(std::move(_tuple));
35
}
36
37
private
:
38
OutputValue _tuple;
39
PromiseType _p;
40
};
41
42
template
<
typename
OutputValue,
typename
OutputError,
typename
InputCore>
43
struct
AllTuple
<
FailPolicy
::
FirstFail
, OutputValue,
OutputError
,
InputCore
> {
44
using
PromiseType
=
Promise<OutputValue, OutputError>
;
45
46
static
constexpr
ConsumePolicy
kConsumePolicy =
ConsumePolicy::Static
;
47
static
constexpr
CorePolicy
kCorePolicy =
CorePolicy::Managed
;
48
49
AllTuple
(std::size_t count,
PromiseType
p
) : _p{std::
move
(
p
)} {
50
}
51
52
template
<std::
size_t
Index,
typename
Result>
53
void
Consume
(
Result
&&
result
) {
54
if
(!
result
&& !_done.load(std::memory_order_relaxed) && !_done.exchange(
true
, std::memory_order_acq_rel)) {
55
if
(
result
.State() ==
ResultState::Error
) {
56
std::move(_p).Set(std::forward<Result>(
result
).
Error
());
57
}
else
{
58
std::move(_p).Set(std::forward<Result>(
result
).
Exception
());
59
}
60
}
else
{
61
std::get<Index>(_tuple) = std::forward<Result>(
result
).Value();
62
}
63
}
64
65
~AllTuple
() {
66
if
(_p.Valid()) {
67
std::move(_p).Set(std::move(_tuple));
68
}
69
}
70
71
private
:
72
yaclib_std::atomic_bool
_done =
false
;
73
OutputValue _tuple;
74
PromiseType _p;
75
};
76
77
}
// namespace yaclib::when
yaclib::Promise< OutputValue, 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::None
@ None
yaclib::ConsumePolicy::Static
@ Static
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
atomic.hpp
yaclib::when::AllTuple< FailPolicy::FirstFail, OutputValue, OutputError, InputCore >::Consume
void Consume(Result &&result)
Definition
all_tuple.hpp:53
yaclib::when::AllTuple< FailPolicy::FirstFail, OutputValue, OutputError, InputCore >::AllTuple
AllTuple(std::size_t count, PromiseType p)
Definition
all_tuple.hpp:49
yaclib::when::AllTuple< FailPolicy::FirstFail, OutputValue, OutputError, InputCore >::~AllTuple
~AllTuple()
Definition
all_tuple.hpp:65
yaclib::when::AllTuple< FailPolicy::None, OutputValue, OutputError, InputCore >::Consume
void Consume(Result &&result)
Definition
all_tuple.hpp:29
yaclib::when::AllTuple< FailPolicy::None, OutputValue, OutputError, InputCore >::AllTuple
AllTuple(std::size_t count, PromiseType p)
Definition
all_tuple.hpp:25
yaclib::when::AllTuple< FailPolicy::None, OutputValue, OutputError, InputCore >::~AllTuple
~AllTuple()
Definition
all_tuple.hpp:33
yaclib::when::AllTuple
Definition
all_tuple.hpp:14
type_traits.hpp
include
yaclib
async
when
all_tuple.hpp
Generated by
1.9.8