CeresEngine 0.2.0
A game development framework
Loading...
Searching...
No Matches
Coroutine.hpp
Go to the documentation of this file.
1//
2// CeresEngine - A game development framework
3//
4// Created by Rogiel Sulzbach.
5// Copyright (c) 2018-2022 Rogiel Sulzbach. All rights reserved.
6//
7
8#pragma once
9
10#include <exception>
11
12#if !defined(__cpp_coroutines) && !defined(__cpp_impl_coroutine)
13#error "Generator: Unsupported platform!"
14#endif
15
16#include <coroutine>
17
18namespace CeresEngine {
19
20 using std::coroutine_handle;
21 using std::coroutine_traits;
22 using std::suspend_always;
23 using std::suspend_never;
24
26 template<typename T = void> using CoroutineHandle = std::coroutine_handle<T>;
27
29 template<typename T> using CoroutineTraits = std::coroutine_traits<T>;
30
32 using SuspendAlways = std::suspend_always;
33
35 using SuspendNever = std::suspend_never;
36
40 public:
41 class promise_type final { // NOLINT(readability-identifier-naming)
42 public:
44 [[nodiscard]] static constexpr auto initial_suspend() noexcept { // NOLINT(readability-identifier-naming)
45 return SuspendNever{};
46 }
47
49 [[nodiscard]] static constexpr auto final_suspend() noexcept { // NOLINT(readability-identifier-naming)
50 return SuspendNever{};
51 }
52
54 static constexpr void return_void() noexcept { // NOLINT(readability-identifier-naming)
55 // nothing to do because this is `void` return
56 }
57
59 static void unhandled_exception() noexcept(false) { // NOLINT(readability-identifier-naming)
60 std::terminate();
61 }
62
63 [[nodiscard]] constexpr VoidCoroutine get_return_object() noexcept { // NOLINT(readability-identifier-naming)
64 return VoidCoroutine(this);
65 }
66
67 [[nodiscard]] static constexpr VoidCoroutine get_return_object_on_allocation_failure() noexcept { // NOLINT(readability-identifier-naming)
68 return VoidCoroutine(nullptr);
69 }
70 };
71
72 public:
73 explicit constexpr VoidCoroutine(const promise_type*) noexcept {}
74 };
75
79 public:
80 class promise_type;
81
82 private:
84
85 public:
88
89 public:
90 [[nodiscard]] auto get() const noexcept { return handle; }
91
92 explicit operator CoroutineHandle<void>() const noexcept { return handle; }
93
95
97
99
101
102 public:
104 public:
105 auto initial_suspend() noexcept { return suspend_always{}; }
106
108 // !!! notice this behavior !!!
109 return suspend_always{};
110 }
111
113 // nothing to do because this is `void` return
114 }
115
117 // user can customize this point with std::current_exception ...
118 // by default, terminate the program.
119 std::terminate();
120 }
121
123 };
124 };
125} // namespace CeresEngine
auto final_suspend() noexcept
Definition Coroutine.hpp:107
void unhandled_exception() noexcept(false)
Definition Coroutine.hpp:116
ResumableFunction get_return_object() noexcept
Definition Coroutine.hpp:122
auto initial_suspend() noexcept
Definition Coroutine.hpp:105
void return_void() noexcept
Definition Coroutine.hpp:112
Holds the resumable function's handle.
Definition Coroutine.hpp:78
CoroutineHandle< void > * operator->() noexcept
Definition Coroutine.hpp:96
const CoroutineHandle< void > * operator->() const noexcept
Definition Coroutine.hpp:94
const CoroutineHandle< void > & operator*() const noexcept
Definition Coroutine.hpp:98
auto get() const noexcept
Definition Coroutine.hpp:90
CoroutineHandle< void > handle
Definition Coroutine.hpp:83
ResumableFunction() noexcept=default
CoroutineHandle< void > & operator*() noexcept
Definition Coroutine.hpp:100
Definition Coroutine.hpp:41
static constexpr VoidCoroutine get_return_object_on_allocation_failure() noexcept
Definition Coroutine.hpp:67
static constexpr auto initial_suspend() noexcept
No suspend for init suspension point.
Definition Coroutine.hpp:44
static constexpr auto final_suspend() noexcept
No suspend for final suspension point.
Definition Coroutine.hpp:49
static void unhandled_exception() noexcept(false)
An will terminate on an unhandled exception.
Definition Coroutine.hpp:59
static constexpr void return_void() noexcept
This coroutine always returns void.
Definition Coroutine.hpp:54
constexpr VoidCoroutine get_return_object() noexcept
Definition Coroutine.hpp:63
General void return for coroutine.
Definition Coroutine.hpp:39
constexpr VoidCoroutine(const promise_type *) noexcept
Definition Coroutine.hpp:73
Definition Application.hpp:19
std::coroutine_traits< T > CoroutineTraits
A type alias to the C++ standard library coroutine traits.
Definition Coroutine.hpp:29
std::coroutine_handle< T > CoroutineHandle
A type alias to the C++ standard library coroutine handle.
Definition Coroutine.hpp:26
std::suspend_always SuspendAlways
A type alias to the C++ standard library suspend always tag.
Definition Coroutine.hpp:32
std::suspend_never SuspendNever
A type alias to the C++ standard library suspend never tag.
Definition Coroutine.hpp:35
constexpr size_t hash(const T &v)
Generates a hash for the provided type.
Definition Hash.hpp:25