//******************************************************** // The following code example is taken from the book // C++23 - The Complete Guide // by Nicolai M. Josuttis (www.josuttis.com) // http://www.cppstd23.com // // The code is licensed under a // Creative Commons Attribution 4.0 International License // http://creativecommons.org/licenses/by/4.0/ //******************************************************** #include #include #include #include // for std::byte #include #include #include // coroutine using passed memory resource to hold its state: std::pmr::generator fibonacci(std::allocator_arg_t, std::pmr::polymorphic_allocator<>, int num) { // first two numbers are 1: long a = 1; long b = 1; co_yield a; // SUSPEND with first number co_yield b; // SUSPEND with second number // loop over sums of previous two numbers: for (int i = 0; i < num-2; ++i) { auto sum = a + b; co_yield sum; // SUSPEND with third to num-th number a = std::exchange(b, sum); } } int main() { // memory pool operating on 1k memory on the stack: std::array buf; std::pmr::monotonic_buffer_resource pool{buf.data(), buf.size(), std::pmr::null_memory_resource()}; // call coroutine using the memory pool: for (auto val : fibonacci(std::allocator_arg, &pool, 10)) {; std::cout << val << ' '; } std::cout << '\n'; }