Skip to content

Commit 936ff27

Browse files
committed
stabilize1
1 parent 7c6948c commit 936ff27

File tree

2 files changed

+144
-150
lines changed

2 files changed

+144
-150
lines changed

strings/base_coroutine_foundation.h

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,150 @@ 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+
free_await_adapter_impl<T>&& awaitable;
311+
312+
bool await_ready()
313+
{
314+
return awaitable.ready();
315+
}
316+
317+
template <typename U>
318+
auto await_suspend(std::experimental::coroutine_handle<U> handle)
319+
{
320+
return awaitable.suspend(handle);
321+
}
322+
323+
auto await_resume()
324+
{
325+
return 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+
bool await_ready()
381+
{
382+
if (winrt_suspend_handler)
383+
{
384+
winrt_suspend_handler(this);
385+
}
386+
387+
return awaitable.await_ready();
388+
}
389+
390+
template <typename U>
391+
auto await_suspend(std::experimental::coroutine_handle<U> handle)
392+
{
393+
return awaitable.await_suspend(handle);
394+
}
395+
396+
auto await_resume()
397+
{
398+
if (winrt_resume_handler)
399+
{
400+
winrt_resume_handler(this);
401+
}
402+
403+
return awaitable.await_resume();
404+
}
405+
};
406+
263407
template <typename Derived, typename AsyncInterface, typename TProgress = void>
264408
struct promise_base : implements<Derived, AsyncInterface, Windows::Foundation::IAsyncInfo>
265409
{

strings/base_coroutine_threadpool.h

Lines changed: 0 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -53,150 +53,6 @@ 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-
free_await_adapter_impl<T>&& awaitable;
105-
106-
bool await_ready()
107-
{
108-
return awaitable.ready();
109-
}
110-
111-
template <typename U>
112-
auto await_suspend(std::experimental::coroutine_handle<U> handle)
113-
{
114-
return awaitable.suspend(handle);
115-
}
116-
117-
auto await_resume()
118-
{
119-
return 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-
bool await_ready()
175-
{
176-
if (winrt_suspend_handler)
177-
{
178-
winrt_suspend_handler(this);
179-
}
180-
181-
return awaitable.await_ready();
182-
}
183-
184-
template <typename U>
185-
auto await_suspend(std::experimental::coroutine_handle<U> handle)
186-
{
187-
return awaitable.await_suspend(handle);
188-
}
189-
190-
auto await_resume()
191-
{
192-
if (winrt_resume_handler)
193-
{
194-
winrt_resume_handler(this);
195-
}
196-
197-
return awaitable.await_resume();
198-
}
199-
};
20056
}
20157

20258
WINRT_EXPORT namespace winrt
@@ -522,12 +378,6 @@ namespace std::experimental
522378
{
523379
winrt::terminate();
524380
}
525-
526-
template <typename Expression>
527-
auto await_transform(Expression&& expression) noexcept
528-
{
529-
return winrt::impl::notify_awaiter<Expression>{ winrt::impl::get_awaiter<Expression>(static_cast<Expression&&>(expression)) };
530-
}
531381
};
532382
};
533383
}

0 commit comments

Comments
 (0)