LeechCraft
0.6.70-18450-gabe19ee3b0
Modular cross-platform feature rich live environment.
Toggle main menu visibility
Loading...
Searching...
No Matches
eithercoro.h
Go to the documentation of this file.
1
/**********************************************************************
2
* LeechCraft - modular cross-platform feature rich internet client.
3
* Copyright (C) 2006-2014 Georg Rudoy
4
*
5
* Distributed under the Boost Software License, Version 1.0.
6
* (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7
**********************************************************************/
8
9
#pragma once
10
11
#include <coroutine>
12
#include <
util/sll/either.h
>
13
#include "
either.h
"
14
15
namespace
LC::Util::detail
16
{
17
struct
EitherLeanCoroAbort
{};
18
}
19
20
template
<
typename
L,
typename
R,
typename
... Args>
21
struct
std::coroutine_traits<
LC
::Util::Either<L, R>, Args...>
22
{
23
using
EitherType
=
LC::Util::Either<L, R>
;
24
25
struct
State
26
{
27
std::optional<EitherType>
Ret_
{};
28
std::exception_ptr
Exc_
{};
29
};
30
31
struct
promise_type;
32
33
struct
Wrapper
34
{
35
State
State_
;
36
promise_type
&
Promise_
;
37
38
explicit
Wrapper
(
promise_type
& promise)
39
:
Promise_
{ promise }
40
{
41
promise.
Wrapper_
=
this
;
42
}
43
44
Wrapper
(
Wrapper
&& other) noexcept
45
:
State_
{ std::move (other.State_) }
46
, Promise_ { other.Promise_ }
47
{
48
Promise_.
Wrapper_
=
this
;
49
}
50
51
Wrapper
(
const
Wrapper
&) =
delete
;
52
Wrapper
& operator= (
const
Wrapper
&) =
delete
;
53
Wrapper
& operator= (
Wrapper
&&) =
delete
;
54
55
explicit
(
false
)
operator
EitherType
()
56
{
57
if
(
State_
.Exc_)
58
{
59
try
60
{
61
std::rethrow_exception (
State_
.Exc_);
62
}
63
catch
(
const
LC::Util::detail::EitherLeanCoroAbort
&) {}
64
}
65
return
std::move (*
State_
.Ret_);
66
}
67
};
68
69
struct
promise_type
70
{
71
constexpr
std::suspend_never
initial_suspend
() const noexcept {
return
{}; }
72
constexpr
std::suspend_never
final_suspend
() const noexcept {
return
{}; }
73
74
constexpr
static
bool
IsVoid
=
false
;
75
76
Wrapper
*
Wrapper_
=
nullptr
;
77
78
template
<
typename
U = R>
79
void
return_value
(U&& val)
80
{
81
Wrapper_
->State_.Ret_.emplace (std::forward<U> (val));
82
}
83
84
void
return_value
(
LC::Util::Left<L>
&& val)
85
{
86
Wrapper_
->State_.Ret_.emplace (std::move (val));
87
}
88
89
void
unhandled_exception
()
90
{
91
Wrapper_
->State_.Exc_ = std::current_exception ();
92
}
93
94
Wrapper
get_return_object
()
95
{
96
return
Wrapper
{ *
this
};
97
}
98
99
template
<
typename
T>
100
auto
await_transform
(T&& either)
const
101
{
102
return
SimpleAwaiter<T>
{ std::forward<T> (either) };
103
}
104
105
template
<
typename
T>
106
struct
SimpleAwaiter
107
{
108
T
Either_
;
109
110
constexpr
static
auto
IsOwning
= !std::is_lvalue_reference_v<T>;
111
using
R_t
= std::decay_t<T>::R_t;
112
113
bool
await_ready
() const noexcept
114
{
115
return
Either_
.IsRight ();
116
}
117
118
[[noreturn]]
119
void
await_suspend
(std::coroutine_handle<promise_type> handle)
120
{
121
handle.promise ().Wrapper_->State_.Ret_.emplace (std::forward_like<T> (
Either_
.GetLeft ()));
122
throw
LC::Util::detail::EitherLeanCoroAbort
{};
123
}
124
125
std::conditional_t<IsOwning, R_t, const R_t&>
await_resume
()
126
{
127
return
std::forward_like<T> (
Either_
.GetRight ());
128
}
129
};
130
};
131
};
LC::Util::Either
Definition
either.h:33
LC::Util::detail
Definition
fancytrayiconfreedesktop.cpp:24
LC
Definition
constants.h:15
either.h
LC::Util::Left
Definition
either.h:20
LC::Util::detail::EitherLeanCoroAbort
Definition
eithercoro.h:17
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::SimpleAwaiter
Definition
eithercoro.h:107
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::SimpleAwaiter::Either_
T Either_
Definition
eithercoro.h:108
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::SimpleAwaiter::await_resume
std::conditional_t< IsOwning, R_t, const R_t & > await_resume()
Definition
eithercoro.h:125
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::SimpleAwaiter::await_suspend
void await_suspend(std::coroutine_handle< promise_type > handle)
Definition
eithercoro.h:119
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::SimpleAwaiter::await_ready
bool await_ready() const noexcept
Definition
eithercoro.h:113
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::SimpleAwaiter::R_t
std::decay_t< T >::R_t R_t
Definition
eithercoro.h:111
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::SimpleAwaiter::IsOwning
static constexpr auto IsOwning
Definition
eithercoro.h:110
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::State
Definition
eithercoro.h:26
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::State::Ret_
std::optional< EitherType > Ret_
Definition
eithercoro.h:27
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::State::Exc_
std::exception_ptr Exc_
Definition
eithercoro.h:28
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::Wrapper
Definition
eithercoro.h:34
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::Wrapper::Promise_
promise_type & Promise_
Definition
eithercoro.h:36
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::Wrapper::Wrapper
Wrapper(promise_type &promise)
Definition
eithercoro.h:38
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::Wrapper::Wrapper
Wrapper(const Wrapper &)=delete
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::Wrapper::Wrapper
Wrapper(Wrapper &&other) noexcept
Definition
eithercoro.h:44
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::Wrapper::State_
State State_
Definition
eithercoro.h:35
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type
Definition
eithercoro.h:70
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::unhandled_exception
void unhandled_exception()
Definition
eithercoro.h:89
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::final_suspend
constexpr std::suspend_never final_suspend() const noexcept
Definition
eithercoro.h:72
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::await_transform
auto await_transform(T &&either) const
Definition
eithercoro.h:100
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::Wrapper_
Wrapper * Wrapper_
Definition
eithercoro.h:76
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::get_return_object
Wrapper get_return_object()
Definition
eithercoro.h:94
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::IsVoid
static constexpr bool IsVoid
Definition
eithercoro.h:74
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::return_value
void return_value(U &&val)
Definition
eithercoro.h:79
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::initial_suspend
constexpr std::suspend_never initial_suspend() const noexcept
Definition
eithercoro.h:71
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::promise_type::return_value
void return_value(LC::Util::Left< L > &&val)
Definition
eithercoro.h:84
std::coroutine_traits< LC::Util::Either< L, R >, Args... >::EitherType
LC::Util::Either< L, R > EitherType
Definition
eithercoro.h:23
either.h
src
util
threads
coro
eithercoro.h
Generated by
1.17.0