// Datei coro_01.h
// Definition der Coroutinen-Klasse

#ifndef coro_01_h
#define coro_01_h

#include <coroutine>

// Die Coroutinen-Klasse
struct MyCoroutine
{
   struct promise_type;  // Vorwaertsdeklaration
   using handle = std::coroutine_handle<promise_type>;
   // promise_type Klasse
   struct promise_type
   {
      // Aufruf unmittelbar nach Start der Coroutine
      auto initial_suspend()
      { return std::suspend_always{}; }

      // Aufruf nach Beenden der Coroutine
      auto final_suspend() noexcept
      { return std::suspend_always{}; }

      // Aufruf beim Ausloesen einer nicht behandelten
      // Ausnahme
      void unhandled_exception()
      { std::terminate(); }

      // Liefert das Coroutinen-Objekt zurueck
      auto get_return_object()
      { return MyCoroutine{handle::from_promise(*this)}; }

      // Wird durch co_return aufgerufen
      void return_void()
      { }
   };

   // Setzt Coroutine fort (coro.resume()),
   // wenn das Coroutinen-Handle gueltig ist (ungleich 0)
   bool resume()
   { return coro ? (coro.resume(), !coro.done()) : false; };

private:
   // Coroutinen-Handle
   handle coro;
   // ctor, speichert das uebergebene Coroutinen-Handle ab
   MyCoroutine(handle h) : coro(h) {}
};
#endif
