Editor/croutines.cpp (80 lines of code) (raw):

#include <iostream> #ifdef __clang__ #include <experimental/coroutine> #else #include <coroutine> #endif #include <memory> template<typename T> struct foo { std::shared_ptr<T> value; foo(std::shared_ptr<T> p) : value(p) { std::cout << "Created a sync object" << std::endl; } foo(const foo &s) : value(s.value) { std::cout << "Copied a sync object" << std::endl; } ~foo() { std::cout << "Sync gone" << std::endl; } T get() { std::cout << "We got asked for the return value..." << std::endl; return *value; } struct promise_type { std::shared_ptr<T> ptr; promise_type() : ptr(std::make_shared<T>()) { std::cout << "Promise created" << std::endl; } ~promise_type() { std::cout << "Promise died" << std::endl; } auto get_return_object() { std::cout << "Send back a sync" << std::endl; return ptr; } auto initial_suspend() { std::cout << "Started the coroutine, don't stop now!" << std::endl; #ifdef __clang__ return std::experimental::suspend_never{}; #else return std::suspend_never{}; #endif } auto return_value(T v) { std::cout << "Got an answer of " << v << std::endl; *ptr = v; #ifdef __clang__ return std::experimental::suspend_never{}; #else return std::suspend_never{}; #endif } auto yield_value(T value) { std::cout << "Yielded " << value << std::endl; #ifdef __clang__ return std::experimental::suspend_always{}; #else return std::suspend_always{}; #endif } auto final_suspend() noexcept { std::cout << "Finished the coro" << std::endl; #ifdef __clang__ return std::experimental::suspend_never{}; #else return std::suspend_never{}; #endif } void unhandled_exception() { std::exit(1); } }; }; foo<int> iota(int n = 0) { while (n>5) co_yield n++; }