12 #include <type_traits> 39 constexpr std::suspend_always
final_suspend() const noexcept {
return {}; }
43 std::enable_if_t<!std::is_rvalue_reference<U>::value,
int> = 0>
46 m_value = std::addressof(
value);
52 m_value = std::addressof(
value);
58 m_exception = std::current_exception();
78 std::rethrow_exception(m_exception);
85 std::exception_ptr m_exception;
94 using coroutine_handle = std::coroutine_handle<generator_promise<T>>;
107 : m_coroutine(
nullptr)
111 : m_coroutine(coroutine)
116 return !it.m_coroutine || it.m_coroutine.done();
136 m_coroutine.resume();
137 if (m_coroutine.done())
139 m_coroutine.promise().rethrow_if_exception();
153 return m_coroutine.promise().value();
158 return std::addressof(
operator*());
163 coroutine_handle m_coroutine;
168 class [[nodiscard]] generator
176 : m_coroutine(
nullptr)
180 : m_coroutine(other.m_coroutine)
182 other.m_coroutine =
nullptr;
185 generator(
const generator& other) =
delete;
191 m_coroutine.destroy();
205 m_coroutine.resume();
206 if (m_coroutine.done())
208 m_coroutine.promise().rethrow_if_exception();
220 void swap(generator& other) noexcept
222 std::swap(m_coroutine, other.m_coroutine);
229 explicit generator(std::coroutine_handle<promise_type> coroutine) noexcept
230 : m_coroutine(coroutine)
233 std::coroutine_handle<promise_type> m_coroutine;
248 using coroutine_handle = std::coroutine_handle<generator_promise<T>>;
249 return generator<T>{ coroutine_handle::from_promise(*
this) };
253 template<
typename FUNC,
typename T>
256 for (
auto&&
value : source)
258 co_yield std::invoke(func,
static_cast<decltype(
value)
>(
value));
std::conditional_t< std::is_reference_v< T >, T, T & > reference_type
Definition: generator.hpp:31
constexpr std::suspend_always final_suspend() const noexcept
Definition: generator.hpp:39
void unhandled_exception()
Definition: generator.hpp:56
generator_iterator(coroutine_handle coroutine) noexcept
Definition: generator.hpp:110
reference operator*() const noexcept
Definition: generator.hpp:151
friend bool operator==(generator_sentinel s, const generator_iterator &it) noexcept
Definition: generator.hpp:124
std::suspend_never await_transform(U &&value)=delete
generator< T > get_return_object() noexcept
Definition: generator.hpp:246
constexpr std::suspend_always initial_suspend() const noexcept
Definition: generator.hpp:38
value_type * pointer_type
Definition: generator.hpp:32
std::suspend_always yield_value(std::remove_reference_t< T > &value) noexcept
Definition: generator.hpp:44
typename generator_promise< T >::pointer_type pointer
Definition: generator.hpp:103
generator_iterator & operator++()
Definition: generator.hpp:134
void rethrow_if_exception()
Definition: generator.hpp:74
std::remove_reference_t< T > value_type
Definition: generator.hpp:30
void operator++(int)
Definition: generator.hpp:146
Definition: generator.hpp:89
void swap(generator &other) noexcept
Definition: generator.hpp:220
Definition: generator.hpp:26
friend bool operator!=(generator_sentinel s, const generator_iterator &it) noexcept
Definition: generator.hpp:129
generator & operator=(generator other) noexcept
Definition: generator.hpp:195
generator_iterator() noexcept
Definition: generator.hpp:106
std::suspend_always yield_value(std::remove_reference_t< T > &&value) noexcept
Definition: generator.hpp:50
void return_void()
Definition: generator.hpp:61
generator< std::invoke_result_t< FUNC &, typename generator< T >::iterator::reference > > fmap(FUNC func, generator< T > source)
Definition: generator.hpp:254
reference_type value() const noexcept
Definition: generator.hpp:65
Definition: generator.hpp:21
cppcoro::generator< T > generator
Definition: SampleStreams.h:10
std::ptrdiff_t difference_type
Definition: generator.hpp:100
const word U
Definition: Main.cpp:12
detail::generator_sentinel end() noexcept
Definition: generator.hpp:215
Definition: generator.hpp:18
typename generator_promise< T >::value_type value_type
Definition: generator.hpp:101
generator() noexcept
Definition: generator.hpp:175
void swap(generator< T > &a, generator< T > &b)
Definition: generator.hpp:238
typename generator_promise< T >::reference_type reference
Definition: generator.hpp:102
Definition: generator.hpp:92
generator(generator &&other) noexcept
Definition: generator.hpp:179
generator_promise()=default
iterator begin()
Definition: generator.hpp:201
pointer operator->() const noexcept
Definition: generator.hpp:156
friend bool operator==(const generator_iterator &it, generator_sentinel) noexcept
Definition: generator.hpp:114
friend bool operator!=(const generator_iterator &it, generator_sentinel s) noexcept
Definition: generator.hpp:119
std::input_iterator_tag iterator_category
Definition: generator.hpp:98
~generator()
Definition: generator.hpp:187