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
Trait,
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
Trait,
typename
InputCore>
19
struct
AllTuple
<
FailPolicy
::
None
, OutputValue, Trait,
InputCore
> {
20
using
PromiseType
=
Promise<OutputValue, Trait>
;
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
R>
29
void
Consume
(
R
&&
result
) {
30
std::get<Index>(_tuple) = std::forward<R>(
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
Trait,
typename
InputCore>
43
struct
AllTuple
<
FailPolicy
::
FirstFail
, OutputValue, Trait,
InputCore
> {
44
using
PromiseType
=
Promise<OutputValue, Trait>
;
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
R>
53
void
Consume
(
R
&&
result
) {
54
if
(Trait::Ok(
result
)) {
55
std::get<Index>(_tuple) = Trait::GetValue(std::forward<R>(
result
));
56
}
else
if
(!_done.load(std::memory_order_relaxed) && !_done.exchange(
true
, std::memory_order_acq_rel)) {
57
std::move(_p).Set(Trait::GetError(std::forward<R>(
result
)));
58
}
59
// An error that lost the _done race is dropped, the promise is already set
60
}
61
62
~AllTuple
() {
63
if
(_p.Valid()) {
64
std::move(_p).Set(std::move(_tuple));
65
}
66
}
67
68
private
:
69
yaclib_std::atomic_bool
_done =
false
;
70
OutputValue _tuple;
71
PromiseType _p;
72
};
73
74
}
// namespace yaclib::when
yaclib::Promise< OutputValue, Trait >
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::MakeContract
Contract< V, T > MakeContract()
Creates related future and promise.
Definition
contract.hpp:25
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::CorePolicy
CorePolicy
Definition
combinator_strategy.hpp:35
yaclib::CorePolicy::Managed
@ Managed
promise.hpp
result.hpp
atomic.hpp
yaclib::when::AllTuple< FailPolicy::FirstFail, OutputValue, Trait, InputCore >::AllTuple
AllTuple(std::size_t count, PromiseType p)
Definition
all_tuple.hpp:49
yaclib::when::AllTuple< FailPolicy::FirstFail, OutputValue, Trait, InputCore >::Consume
void Consume(R &&result)
Definition
all_tuple.hpp:53
yaclib::when::AllTuple< FailPolicy::FirstFail, OutputValue, Trait, InputCore >::~AllTuple
~AllTuple()
Definition
all_tuple.hpp:62
yaclib::when::AllTuple< FailPolicy::None, OutputValue, Trait, InputCore >::AllTuple
AllTuple(std::size_t count, PromiseType p)
Definition
all_tuple.hpp:25
yaclib::when::AllTuple< FailPolicy::None, OutputValue, Trait, InputCore >::~AllTuple
~AllTuple()
Definition
all_tuple.hpp:33
yaclib::when::AllTuple< FailPolicy::None, OutputValue, Trait, InputCore >::Consume
void Consume(R &&result)
Definition
all_tuple.hpp:29
yaclib::when::AllTuple
Definition
all_tuple.hpp:14
type_traits.hpp
include
yaclib
async
when
all_tuple.hpp
Generated by
1.9.8