Skip to content

Instantly share code, notes, and snippets.

@Zaryob
Created February 26, 2025 21:53
Show Gist options
  • Save Zaryob/269b99fb7bd021ba1e3e39e2c2b76b41 to your computer and use it in GitHub Desktop.
Save Zaryob/269b99fb7bd021ba1e3e39e2c2b76b41 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <coroutine>
struct Generator {
struct promise_type {
int current_value;
Generator get_return_object() {
return Generator{std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void unhandled_exception() { std::terminate(); }
std::suspend_always yield_value(int value) {
current_value = value;
return {};
}
void return_void() {}
};
std::coroutine_handle<promise_type> handle;
Generator(std::coroutine_handle<promise_type> h) : handle(h) {}
~Generator() { if (handle) handle.destroy(); }
struct iterator {
std::coroutine_handle<promise_type> handle;
bool operator!=(std::default_sentinel_t) const { return !handle.done(); }
void operator++() { handle.resume(); }
int operator*() const { return handle.promise().current_value; }
};
iterator begin() { return {handle}; }
std::default_sentinel_t end() { return {}; }
};
Generator generateSequence(int start, int end) {
for (int i = start; i <= end; ++i) {
co_yield i;
}
}
int main() {
for (int value : generateSequence(1, 5)) {
std::cout << value << " "; // Çıktı: 1 2 3 4 5
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment