annotate libstdc++-v3/include/std/coroutine @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 // <coroutine> -*- C++ -*-
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // Copyright (C) 2019-2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // This file is part of the GNU ISO C++ Library. This library is free
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 // software; you can redistribute it and/or modify it under the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 // terms of the GNU General Public License as published by the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 // Free Software Foundation; either version 3, or (at your option)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 // any later version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 // This library is distributed in the hope that it will be useful,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 // GNU General Public License for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 // Under Section 7 of GPL version 3, you are granted additional
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 // permissions described in the GCC Runtime Library Exception, version
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 // 3.1, as published by the Free Software Foundation.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 // You should have received a copy of the GNU General Public License and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 // a copy of the GCC Runtime Library Exception along with this program;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 // <http://www.gnu.org/licenses/>.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 /** @file include/coroutine
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 * This is a Standard C++ Library header.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #ifndef _GLIBCXX_COROUTINE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 #define _GLIBCXX_COROUTINE 1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 #pragma GCC system_header
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 // It is very likely that earlier versions would work, but they are untested.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 #if __cplusplus >= 201402L
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 #include <bits/c++config.h>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 /**
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 * @defgroup coroutines Coroutines
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 * Components for supporting coroutine implementations.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 #if __cplusplus > 201703L && __cpp_impl_three_way_comparison >= 201907L
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 # include <compare>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 # define _COROUTINES_USE_SPACESHIP 1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 # include <bits/stl_function.h> // for std::less
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 # define _COROUTINES_USE_SPACESHIP 0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 namespace std _GLIBCXX_VISIBILITY (default)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 _GLIBCXX_BEGIN_NAMESPACE_VERSION
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 #if __cpp_coroutines
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 inline namespace __n4835 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 // 17.12.2 coroutine traits
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 /// [coroutine.traits]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 /// [coroutine.traits.primary]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 template <typename _Result, typename...>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 struct coroutine_traits
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 using promise_type = typename _Result::promise_type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 // 17.12.3 Class template coroutine_handle
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 /// [coroutine.handle]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 template <typename _Promise = void>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 struct coroutine_handle;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 template <> struct
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 coroutine_handle<void>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 // 17.12.3.1, construct/reset
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 constexpr coroutine_handle() noexcept : _M_fr_ptr(0) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 constexpr coroutine_handle(std::nullptr_t __h) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 : _M_fr_ptr(__h)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 coroutine_handle& operator=(std::nullptr_t) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 _M_fr_ptr = nullptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 return *this;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 // 17.12.3.2, export/import
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 constexpr void* address() const noexcept { return _M_fr_ptr; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 constexpr static coroutine_handle from_address(void* __a) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 coroutine_handle __self;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 __self._M_fr_ptr = __a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 return __self;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 // 17.12.3.3, observers
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 constexpr explicit operator bool() const noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 return bool(_M_fr_ptr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 bool done() const noexcept { return __builtin_coro_done(_M_fr_ptr); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 // 17.12.3.4, resumption
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 void operator()() const { resume(); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 void resume() const { __builtin_coro_resume(_M_fr_ptr); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 void destroy() const { __builtin_coro_destroy(_M_fr_ptr); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 protected:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 void* _M_fr_ptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 // 17.12.3.6 Comparison operators
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 /// [coroutine.handle.compare]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 constexpr bool operator==(coroutine_handle<> __a,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 coroutine_handle<> __b) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 return __a.address() == __b.address();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 #if _COROUTINES_USE_SPACESHIP
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 constexpr strong_ordering
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 operator<=>(coroutine_handle<> __a, coroutine_handle<> __b) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 { return std::compare_three_way()(__a.address(), __b.address()); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 // These are to enable operation with std=c++14,17.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 constexpr bool operator!=(coroutine_handle<> __a,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 coroutine_handle<> __b) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 return !(__a == __b);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 constexpr bool operator<(coroutine_handle<> __a,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 coroutine_handle<> __b) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 return less<void*>()(__a.address(), __b.address());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 constexpr bool operator>(coroutine_handle<> __a,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 coroutine_handle<> __b) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 return __b < __a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 constexpr bool operator<=(coroutine_handle<> __a,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 coroutine_handle<> __b) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 return !(__a > __b);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 constexpr bool operator>=(coroutine_handle<> __a,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 coroutine_handle<> __b) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 return !(__a < __b);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 template <typename _Promise>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 struct coroutine_handle : coroutine_handle<>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 // 17.12.3.1, construct/reset
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 using coroutine_handle<>::coroutine_handle;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 static coroutine_handle from_promise(_Promise& p)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 coroutine_handle __self;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 __self._M_fr_ptr
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 = __builtin_coro_promise((char*) &p, __alignof(_Promise), true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 return __self;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 coroutine_handle& operator=(std::nullptr_t) noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 coroutine_handle<>::operator=(nullptr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 return *this;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 // 17.12.3.2, export/import
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 constexpr static coroutine_handle from_address(void* __a)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 coroutine_handle __self;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 __self._M_fr_ptr = __a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 return __self;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 // 17.12.3.5, promise accesss
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 _Promise& promise() const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 void* __t
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 = __builtin_coro_promise (this->_M_fr_ptr, __alignof(_Promise), false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 return *static_cast<_Promise*>(__t);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 /// [coroutine.noop]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 struct noop_coroutine_promise
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 void __dummy_resume_destroy() __attribute__((__weak__));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 void __dummy_resume_destroy() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 struct __noop_coro_frame
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 void (*__r)() = __dummy_resume_destroy;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 void (*__d)() = __dummy_resume_destroy;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 struct noop_coroutine_promise __p;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 } __noop_coro_fr __attribute__((__weak__));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 // 17.12.4.1 Class noop_coroutine_promise
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 /// [coroutine.promise.noop]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 template <>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 struct coroutine_handle<noop_coroutine_promise> : public coroutine_handle<>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 using _Promise = noop_coroutine_promise;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 // 17.12.4.2.1, observers
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 constexpr explicit operator bool() const noexcept { return true; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 constexpr bool done() const noexcept { return false; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 // 17.12.4.2.2, resumption
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 void operator()() const noexcept {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 void resume() const noexcept {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 void destroy() const noexcept {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 // 17.12.4.2.3, promise access
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 _Promise& promise() const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 return *static_cast<_Promise*>(
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 __builtin_coro_promise(this->_M_fr_ptr, __alignof(_Promise), false));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 // 17.12.4.2.4, address
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 friend coroutine_handle<noop_coroutine_promise> noop_coroutine() noexcept;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 coroutine_handle() noexcept { this->_M_fr_ptr = (void*) &__noop_coro_fr; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 using noop_coroutine_handle = coroutine_handle<noop_coroutine_promise>;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 inline noop_coroutine_handle noop_coroutine() noexcept
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 return noop_coroutine_handle();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 // 17.12.5 Trivial awaitables
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 /// [coroutine.trivial.awaitables]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 struct suspend_always
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 bool await_ready() { return false; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 void await_suspend(coroutine_handle<>) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 void await_resume() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 struct suspend_never
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 bool await_ready() { return true; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 void await_suspend(coroutine_handle<>) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 void await_resume() {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 } // namespace __n4835
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 #error "the coroutine header requires -fcoroutines"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 _GLIBCXX_END_NAMESPACE_VERSION
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 } // namespace std
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 #endif // C++14 (we are allowing use from at least this)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 #endif // _GLIBCXX_COROUTINE