@@ -133,26 +133,6 @@ namespace winrt::impl
133133 resume_apartment_sync (context.m_context , handle, failure);
134134 }
135135 }
136-
137- template <typename T>
138- class awaiter_finder
139- {
140- template <typename > static constexpr bool find_awaitable_member (...) { return false ; }
141- template <typename > static constexpr bool find_co_await_member (...) { return false ; }
142- template <typename > static constexpr bool find_co_await_free (...) { return false ; }
143-
144- #ifdef WINRT_IMPL_COROUTINES
145- template <typename U, typename = decltype (std::declval<U>().await_ready())> static constexpr bool find_awaitable_member (int ) { return true ; }
146- template <typename U, typename = decltype (std::declval<U>().operator co_await ())> static constexpr bool find_co_await_member(int ) { return true ; }
147- template <typename U, typename = decltype (operator co_await (std::declval<U>()))> static constexpr bool find_co_await_free(int ) { return true ; }
148- #endif
149-
150- public:
151-
152- static constexpr bool has_awaitable_member = find_awaitable_member<T>(0 );
153- static constexpr bool has_co_await_member = find_co_await_member<T&&>(0 );
154- static constexpr bool has_co_await_free = find_co_await_free<T&&>(0 );
155- };
156136}
157137
158138WINRT_EXPORT namespace winrt
@@ -226,76 +206,6 @@ WINRT_EXPORT namespace winrt
226206 };
227207}
228208
229- namespace winrt ::impl
230- {
231- template <typename T>
232- decltype (auto ) get_awaiter(T&& value) noexcept
233- {
234- #ifdef WINRT_IMPL_COROUTINES
235- if constexpr (awaiter_finder<T>::has_co_await_member)
236- {
237- static_assert (!awaiter_finder<T>::has_co_await_free, " Ambiguous operator co_await (as both member and free function)." );
238- return static_cast <T&&>(value).operator co_await ();
239- }
240- else if constexpr (awaiter_finder<T>::has_co_await_free)
241- {
242- return operator co_await (static_cast <T&&>(value));
243- }
244- else
245- {
246- static_assert (awaiter_finder<T>::has_awaitable_member, " Not an awaitable type" );
247- return static_cast <T&&>(value);
248- }
249- #else
250- return static_cast <T&&>(value);
251- #endif
252- }
253-
254- template <typename T>
255- struct notify_awaiter
256- {
257- decltype (get_awaiter(std::declval<T&&>())) awaitable;
258-
259- notify_awaiter (T&& awaitable_arg, [[maybe_unused]] cancellable_promise* promise = nullptr ) : awaitable(get_awaiter(static_cast <T&&>(awaitable_arg)))
260- {
261- if constexpr (std::is_convertible_v<std::remove_reference_t <decltype (awaitable)>&, enable_await_cancellation&>)
262- {
263- if (promise)
264- {
265- static_cast <enable_await_cancellation&>(awaitable).set_cancellable_promise (promise);
266- awaitable.enable_cancellation (promise);
267- }
268- }
269- }
270-
271- bool await_ready ()
272- {
273- if (winrt_suspend_handler)
274- {
275- winrt_suspend_handler (this );
276- }
277-
278- return awaitable.await_ready ();
279- }
280-
281- template <typename U>
282- auto await_suspend (coroutine_handle<U> handle)
283- {
284- return awaitable.await_suspend (handle);
285- }
286-
287- decltype (auto ) await_resume()
288- {
289- if (winrt_resume_handler)
290- {
291- winrt_resume_handler (this );
292- }
293-
294- return awaitable.await_resume ();
295- }
296- };
297- }
298-
299209WINRT_EXPORT namespace winrt
300210{
301211 [[nodiscard]] inline auto resume_background () noexcept
@@ -728,24 +638,13 @@ namespace std::experimental
728638
729639 suspend_never final_suspend () const noexcept
730640 {
731- if (winrt_suspend_handler)
732- {
733- winrt_suspend_handler (this );
734- }
735-
736641 return {};
737642 }
738643
739644 void unhandled_exception () const noexcept
740645 {
741646 winrt::terminate ();
742647 }
743-
744- template <typename Expression>
745- auto await_transform (Expression&& expression)
746- {
747- return winrt::impl::notify_awaiter<Expression>{ static_cast <Expression&&>(expression) };
748- }
749648 };
750649 };
751650}
0 commit comments