🚀 MODERN ISO C++ PROGRAMLAMA DERSLERİ: BÖLÜM 9 🚀 ISO C++20 Coroutines (Korutinler): co_await, co_yield & Generators

/*
================================================================================
🚀 MODERN ISO C++ PROGRAMLAMA DERSLERİ: BÖLÜM 9 🚀
ISO C++20 Coroutines (Korutinler): co_await, co_yield & Generators
================================================================================

GİRİŞ 📌
--------------------------------------------------------------------------------
Sekizinci bölümde Eşzamanlılık (Concurrency) mimarisini, ISO C++20 `std::jthread`
yapısını, `std::scoped_lock` ile ölü düğüm (deadlock) önlemeyi ve `std::async`
ile asenkron görev yürütmeyi incelemiştik.

Bu bölümde ISO C++20'nin en gelişmiş ve devrimsel özelliklerinden biri olan
**Coroutines (Korutinler)** konusunu ele alacağız. Korutinlerin çalışma mantığını,
duraklatma/sürdürme (suspend/resume) mekanizmasını, **Promise Object** ve
**Coroutine Handle** iç mimarisini ve tembel değerlendirilen (lazily evaluated)
bir **Generator** akış tasarımını inceleyeceğiz.
*/

#include <iostream>
#include <coroutine>
#include <exception>
#include <utility>

// =============================================================================
// 1. KORUTİN NEDİR VE İÇ MİMARİSİ NASIL ÇALIŞIR? 🌀
// =============================================================================
/*
* Normal bir fonksiyon çağrıldığında çalışır ve `return` ile sonlanır (Stack Frame silinir).
* Bir Korutin (Coroutine) ise çalışmasını YARIŞTA DURAKLATABİLEN (Suspend) ve daha sonra
* KALDIĞI YERDEN SÜRDÜREBİLEN (Resume) fonksiyondur.
*
* Gövdesinde şu 3 anahtar kelimeden en az birini barındıran fonksiyon Korutindir:
* 1. `co_await`: Bir asenkron işlemin bitmesini beklemek için korutini duraklatır.
* 2. `co_yield`: Dışarıya bir değer üretip korutini duraklatır (Generator deseni).
* 3. `co_return`: Korutini sonlandırıp nihai sonucu döndürür.
*
* BİLEŞENLER:
* - **Promise Object**: Korutinin durumunu yönetir, değer/istisna iletimini sağlar.
* - **Coroutine Handle**: Korutini dışarıdan denetleyen (`resume()`, `done()`, `destroy()`) işaretçidir.
* - **Coroutine Frame**: Korutinin yerel değişkenlerini ve durumunu Heap üzerinde tutan bellek alanıdır.
*/


// =============================================================================
// 2. TEMBEL DERECE C++20 GENERATOR VERİ YAPISI İNŞASI ⚙️
// =============================================================================

template<typename T>
struct Generator {
// A) Promise Object Tanımlaması (Derleyicinin Arka Planda Aradığı İç Sınıf)
struct promise_type {
T current_value;

// Korutin çağrıldığında doğrudan başlasın mı yoksa duraklatılsın mı?
std::suspend_always initial_suspend() noexcept { return {}; } // Lazy evaluation
std::suspend_always final_suspend() noexcept { return {}; }

// co_yield ifadesi çağrıldığında yürütülür:
std::suspend_always yield_value(T value) noexcept {
current_value = std::move(value);
return {}; // Korutini duraklatır
}

void unhandled_exception() { std::terminate(); }
void return_void() noexcept {}

Generator get_return_object() {
return Generator{ std::coroutine_handle<promise_type>::from_promise(*this) };
}
};

using handle_type = std::coroutine_handle<promise_type>;
handle_type m_handle;

explicit Generator(handle_type h) : m_handle(h) {}

~Generator() {
if (m_handle) {
m_handle.destroy(); // Heap üzerindeki Coroutine Frame temizlenir
}
}

// Move-only yapıyoruz (RAII)
Generator(const Generator&) = delete;
Generator& operator=(const Generator&) = delete;
Generator(Generator&& other) noexcept : m_handle(std::exchange(other.m_handle, nullptr)) {}
Generator& operator=(Generator&& other) noexcept {
if (this != &other) {
if (m_handle) m_handle.destroy();
m_handle = std::exchange(other.m_handle, nullptr);
}
return *this;
}

// Korutini bir sonraki değere ilerleten metod:
bool next() {
if (m_handle && !m_handle.done()) {
m_handle.resume(); // Korutini kaldığı yerden devam ettir
return !m_handle.done();
}
return false;
}

T value() const {
return m_handle.promise().current_value;
}
};


// =============================================================================
// 3. KORUTİN KULLANIM ÖRNEĞİ: TEMBEL FİBONACCİ DIZİSİ ÜRETİCİSİ 🔢
// =============================================================================

Generator<std::uint64_t> generate_fibonacci(std::size_t count) {
std::uint64_t a = 0, b = 1;
for (std::size_t i = 0; i < count; ++i) {
co_yield a; // Değeri dışarı gönder ve korutini DURAKLAT!
auto next_val = a + b;
a = b;
b = next_val;
}
}

void demonstrate_coroutines() {
std::cout << "🌀 C++20 Generator ile Tembel Fibonacci Serisi:\n";

// Korutin çağrılır ancak 'initial_suspend' nedeniyle henüz hesaplama YAPMAZ!
auto fib = generate_fibonacci(10);

// `next()` çağrıldıkça korutin adım adım çalışır (Lazy Evaluation):
while (fib.next()) {
std::cout << " Üretilen Değer: " << fib.value() << "\n";
}
}


// =============================================================================
// 4. MAIN VE PROGRAM GİRİŞ NOKTASI 🚀
// =============================================================================

int main() {
std::cout << "============================================" << std::endl;
std::cout << " ISO C++17/20/23 Dersleri - Bolum 9 " << std::endl;
std::cout << "============================================" << std::endl << std::endl;

std::cout << "--- ISO C++20 Coroutines & co_yield Demo ---" << std::endl;
demonstrate_coroutines();

std::cout << "\n✔ Bolum 9 Kavramları Başarıyla İşlendi!" << std::endl;

return 0;
}

/*
================================================================================
BÖLÜM ÖZETİ VE GELECEK BÖLÜM 📝
--------------------------------------------------------------------------------
Bu bölümde C++20 Coroutines mimarisini, `co_yield` kullanımını, Promise Object,
Coroutine Handle ve Coroutine Frame etkileşimini inceledik.

Gelecek Bölüm (Bölüm 10 - FİNAL):
- ISO C++20 / C++23 Standart Özellikleri Derlemesi 🌟
- `std::span` ve `std::string_view` ile Zero-Copy Veri Erişimi
- `std::expected<T, E>` ile Monadik Hata Yönetimi (ISO C++23)
- `std::mdspan` Multidimensional Array Views (ISO C++23)
- Kurs Kapanışı ve İleri Seviye C++ Kitap/Kaynak Tavsiyeleri
===============
=================================================================
Bölüm 9 Sonu.
================================================================================
*/

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
136,671Threads
3,307,492Messages
328,518Members
lucisanto123Latest member
Top Bottom