Skip to content

Commit 92e336f

Browse files
committed
stable
1 parent e161f59 commit 92e336f

File tree

2 files changed

+154
-148
lines changed

2 files changed

+154
-148
lines changed

strings/base_coroutine_foundation.h

Lines changed: 0 additions & 148 deletions
Original file line numberDiff line numberDiff line change
@@ -260,154 +260,6 @@ namespace winrt::impl
260260
Promise* m_promise;
261261
};
262262

263-
template <typename T>
264-
class has_awaitable_member
265-
{
266-
template <typename U, typename = decltype(std::declval<U>().await_ready())> static constexpr bool get_value(int) { return true; }
267-
template <typename> static constexpr bool get_value(...) { return false; }
268-
269-
public:
270-
271-
static constexpr bool value = get_value<T>(0);
272-
};
273-
274-
template <typename T>
275-
class has_awaitable_free
276-
{
277-
template <typename U, typename = decltype(await_ready(std::declval<U>()))> static constexpr bool get_value(int) { return true; }
278-
template <typename> static constexpr bool get_value(...) { return false; }
279-
280-
public:
281-
282-
static constexpr bool value = get_value<T>(0);
283-
};
284-
285-
template <typename T>
286-
struct free_await_adapter_impl
287-
{
288-
T&& awaitable;
289-
290-
bool ready()
291-
{
292-
return await_ready(awaitable);
293-
}
294-
295-
template <typename U>
296-
auto suspend(std::experimental::coroutine_handle<U> handle)
297-
{
298-
return await_suspend(awaitable, handle);
299-
}
300-
301-
auto resume()
302-
{
303-
return await_resume(awaitable);
304-
}
305-
};
306-
307-
template <typename T>
308-
struct free_await_adapter
309-
{
310-
T&& awaitable;
311-
312-
bool await_ready()
313-
{
314-
return free_await_adapter_impl<T>{ static_cast<T&&>(awaitable) }.ready();
315-
}
316-
317-
template <typename U>
318-
auto await_suspend(std::experimental::coroutine_handle<U> handle)
319-
{
320-
return free_await_adapter_impl<T>{ static_cast<T&&>(awaitable) }.suspend(handle);
321-
}
322-
323-
auto await_resume()
324-
{
325-
return free_await_adapter_impl<T>{ static_cast<T&&>(awaitable) }.resume();
326-
}
327-
};
328-
329-
template <typename T>
330-
struct member_await_adapter
331-
{
332-
T&& awaitable;
333-
334-
bool await_ready()
335-
{
336-
return awaitable.await_ready();
337-
}
338-
339-
template <typename U>
340-
auto await_suspend(std::experimental::coroutine_handle<U> handle)
341-
{
342-
return awaitable.await_suspend(handle);
343-
}
344-
345-
auto await_resume()
346-
{
347-
return awaitable.await_resume();
348-
}
349-
};
350-
351-
template <typename T>
352-
auto get_awaiter(T&& value) noexcept -> decltype(static_cast<T&&>(value).operator co_await())
353-
{
354-
return static_cast<T&&>(value).operator co_await();
355-
}
356-
357-
template <typename T>
358-
auto get_awaiter(T&& value) noexcept -> decltype(operator co_await(static_cast<T&&>(value)))
359-
{
360-
return operator co_await(static_cast<T&&>(value));
361-
}
362-
363-
template <typename T, std::enable_if_t<has_awaitable_member<T>::value, int> = 0>
364-
auto get_awaiter(T&& value) noexcept
365-
{
366-
return member_await_adapter<T>{ static_cast<T&&>(value) };
367-
}
368-
369-
template <typename T, std::enable_if_t<has_awaitable_free<T>::value, int> = 0>
370-
auto get_awaiter(T&& value) noexcept
371-
{
372-
return free_await_adapter<T>{ static_cast<T&&>(value) };
373-
}
374-
375-
template <typename T>
376-
struct notify_awaiter
377-
{
378-
decltype(get_awaiter(std::declval<T&&>())) awaitable;
379-
380-
notify_awaiter(T&& awaitable) : awaitable(get_awaiter(static_cast<T&&>(awaitable)))
381-
{
382-
}
383-
384-
bool await_ready()
385-
{
386-
if (winrt_suspend_handler)
387-
{
388-
winrt_suspend_handler(this);
389-
}
390-
391-
return awaitable.await_ready();
392-
}
393-
394-
template <typename U>
395-
auto await_suspend(std::experimental::coroutine_handle<U> handle)
396-
{
397-
return awaitable.await_suspend(handle);
398-
}
399-
400-
auto await_resume()
401-
{
402-
if (winrt_resume_handler)
403-
{
404-
winrt_resume_handler(this);
405-
}
406-
407-
return awaitable.await_resume();
408-
}
409-
};
410-
411263
template <typename Derived, typename AsyncInterface, typename TProgress = void>
412264
struct promise_base : implements<Derived, AsyncInterface, Windows::Foundation::IAsyncInfo>
413265
{

strings/base_coroutine_threadpool.h

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,154 @@ namespace winrt::impl
5353
}
5454
}
5555
}
56+
57+
template <typename T>
58+
class has_awaitable_member
59+
{
60+
template <typename U, typename = decltype(std::declval<U>().await_ready())> static constexpr bool get_value(int) { return true; }
61+
template <typename> static constexpr bool get_value(...) { return false; }
62+
63+
public:
64+
65+
static constexpr bool value = get_value<T>(0);
66+
};
67+
68+
template <typename T>
69+
class has_awaitable_free
70+
{
71+
template <typename U, typename = decltype(await_ready(std::declval<U>()))> static constexpr bool get_value(int) { return true; }
72+
template <typename> static constexpr bool get_value(...) { return false; }
73+
74+
public:
75+
76+
static constexpr bool value = get_value<T>(0);
77+
};
78+
79+
template <typename T>
80+
struct free_await_adapter_impl
81+
{
82+
T&& awaitable;
83+
84+
bool ready()
85+
{
86+
return await_ready(awaitable);
87+
}
88+
89+
template <typename U>
90+
auto suspend(std::experimental::coroutine_handle<U> handle)
91+
{
92+
return await_suspend(awaitable, handle);
93+
}
94+
95+
auto resume()
96+
{
97+
return await_resume(awaitable);
98+
}
99+
};
100+
101+
template <typename T>
102+
struct free_await_adapter
103+
{
104+
T&& awaitable;
105+
106+
bool await_ready()
107+
{
108+
return free_await_adapter_impl<T>{ static_cast<T&&>(awaitable) }.ready();
109+
}
110+
111+
template <typename U>
112+
auto await_suspend(std::experimental::coroutine_handle<U> handle)
113+
{
114+
return free_await_adapter_impl<T>{ static_cast<T&&>(awaitable) }.suspend(handle);
115+
}
116+
117+
auto await_resume()
118+
{
119+
return free_await_adapter_impl<T>{ static_cast<T&&>(awaitable) }.resume();
120+
}
121+
};
122+
123+
template <typename T>
124+
struct member_await_adapter
125+
{
126+
T&& awaitable;
127+
128+
bool await_ready()
129+
{
130+
return awaitable.await_ready();
131+
}
132+
133+
template <typename U>
134+
auto await_suspend(std::experimental::coroutine_handle<U> handle)
135+
{
136+
return awaitable.await_suspend(handle);
137+
}
138+
139+
auto await_resume()
140+
{
141+
return awaitable.await_resume();
142+
}
143+
};
144+
145+
template <typename T>
146+
auto get_awaiter(T&& value) noexcept -> decltype(static_cast<T&&>(value).operator co_await())
147+
{
148+
return static_cast<T&&>(value).operator co_await();
149+
}
150+
151+
template <typename T>
152+
auto get_awaiter(T&& value) noexcept -> decltype(operator co_await(static_cast<T&&>(value)))
153+
{
154+
return operator co_await(static_cast<T&&>(value));
155+
}
156+
157+
template <typename T, std::enable_if_t<has_awaitable_member<T>::value, int> = 0>
158+
auto get_awaiter(T&& value) noexcept
159+
{
160+
return member_await_adapter<T>{ static_cast<T&&>(value) };
161+
}
162+
163+
template <typename T, std::enable_if_t<has_awaitable_free<T>::value, int> = 0>
164+
auto get_awaiter(T&& value) noexcept
165+
{
166+
return free_await_adapter<T>{ static_cast<T&&>(value) };
167+
}
168+
169+
template <typename T>
170+
struct notify_awaiter
171+
{
172+
decltype(get_awaiter(std::declval<T&&>())) awaitable;
173+
174+
notify_awaiter(T&& awaitable) : awaitable(get_awaiter(static_cast<T&&>(awaitable)))
175+
{
176+
}
177+
178+
bool await_ready()
179+
{
180+
if (winrt_suspend_handler)
181+
{
182+
winrt_suspend_handler(this);
183+
}
184+
185+
return awaitable.await_ready();
186+
}
187+
188+
template <typename U>
189+
auto await_suspend(std::experimental::coroutine_handle<U> handle)
190+
{
191+
return awaitable.await_suspend(handle);
192+
}
193+
194+
auto await_resume()
195+
{
196+
if (winrt_resume_handler)
197+
{
198+
winrt_resume_handler(this);
199+
}
200+
201+
return awaitable.await_resume();
202+
}
203+
};
56204
}
57205

58206
WINRT_EXPORT namespace winrt
@@ -378,6 +526,12 @@ namespace std::experimental
378526
{
379527
winrt::terminate();
380528
}
529+
530+
template <typename Expression>
531+
auto await_transform(Expression&& expression)
532+
{
533+
return winrt::impl::notify_awaiter<Expression>{ static_cast<Expression&&>(expression) };
534+
}
381535
};
382536
};
383537
}

0 commit comments

Comments
 (0)