156 using reference = std::conditional_t<std::is_reference_v<T>, T, T&>;
186 return handle_.promise().value();
194 return std::addressof(
handle_.promise().value());
205 handle_.promise().rethrow_if_exception();
221 [[nodiscard]]
bool operator==(std::default_sentinel_t)
const noexcept
229 [[nodiscard]]
bool operator!=(std::default_sentinel_t)
const noexcept
252 :
handle_(std::exchange(other.handle_,
nullptr)) {}
265 handle_ = std::exchange(other.handle_,
nullptr);
288 [[nodiscard]]
bool valid() const noexcept
296 [[nodiscard]]
explicit operator bool() const noexcept
313 handle_.promise().rethrow_if_exception();
322 [[nodiscard]] std::default_sentinel_t
end() noexcept
336 std::coroutine_handle<detail::generator_promise<T>>::from_promise(*
this)};
346 template<
typename Range>
349 for (
auto&& element : range)
351 co_yield std::forward<decltype(element)>(element);
367 for (
auto&& element : gen)
369 if (yielded++ >= count)
373 co_yield std::forward<decltype(element)>(element);
iterator & operator++()
Pre-increment operator.
iterator() noexcept
Default constructor - creates end iterator.
generator::reference reference
bool operator==(std::default_sentinel_t) const noexcept
Equality comparison.
std::ptrdiff_t difference_type
void operator++(int)
Post-increment operator.
bool operator!=(std::default_sentinel_t) const noexcept
Inequality comparison.
generator::value_type value_type
generator::pointer pointer
iterator(handle_type handle) noexcept
Construct from coroutine handle.
reference operator*() const noexcept
Dereference operator.
std::input_iterator_tag iterator_category
pointer operator->() const noexcept
Arrow operator.
Forward declaration of generator.
iterator begin()
Get iterator to beginning.
generator(generator &&other) noexcept
Move constructor.
generator(const generator &)=delete
generator() noexcept
Default constructor - creates empty generator.
bool valid() const noexcept
Check if generator is valid.
std::default_sentinel_t end() noexcept
Get sentinel for end.
generator & operator=(const generator &)=delete
std::remove_reference_t< T > value_type
std::coroutine_handle< promise_type > handle_type
generator(handle_type handle) noexcept
Construct from coroutine handle.
generator & operator=(generator &&other) noexcept
Move assignment operator.
~generator()
Destructor - destroys the coroutine if owned.
std::conditional_t< std::is_reference_v< T >, T, T & > reference
Enhanced type-safe value with perfect legacy compatibility.
generator< T > take(generator< T > gen, size_t count)
Create a generator that yields a fixed number of elements.
generator< typename std::ranges::range_value_t< Range > > from_range(Range &&range)
Create a generator from a range.
Promise type for generator.
std::suspend_always final_suspend() noexcept
Suspend at final point.
std::suspend_always yield_value(value_type &value) noexcept
Yield a value.
value_type * pointer_type
std::suspend_always initial_suspend() noexcept
Suspend at start - generators are lazy.
std::exception_ptr exception_
generator< T > get_return_object() noexcept
Get return object (the generator)
void unhandled_exception() noexcept
Handle unhandled exceptions.
std::conditional_t< std::is_reference_v< T >, T, T & > reference_type
std::suspend_always yield_value(value_type &&value) noexcept
Yield an rvalue.
pointer_type current_value_
void return_void() noexcept
Generators don't return values directly.
std::remove_reference_t< T > value_type
reference_type value() const noexcept
Get the current value.
void rethrow_if_exception()
Rethrow stored exception if any.