void print_fibonacci_series(size_t n) { if (0 == n) return; size_t n1 = n + 1; std::vector<unsigned int> fibos(n < 3 ? 3 : n1); std::cout << 1 << std::endl; if (1 == n) return; std::cout << 1 << std::endl; if (2 == n) return; fibos[0] = 0; fibos[1] = 1; fibos[2] = 1; unsigned int val = 0; for (size_t i = 3; i < n1; ++ i) { val = fibos[i - 2] + fibos[i - 1]; fibos[i] = val; std::cout << val << std::endl; } }
void ex_fibonacci() { // initialize on main stack ut::initMainContext(); { auto fiboSC = new ut::StackContext("fibo-generator", &coFiboGenerator); for (int i = 0; i < 10; i++) { // yield nullptr to coroutine auto value = (long *) ut::yieldTo(fiboSC); // back from coroutine. value points to an integer on fibo stack printf ("%ld\n", *value); } printf ("\n\n"); // Terminate context via exception. You could also yield a flag // that coroutine checks to see if it should quit. ut::interruptContext(fiboSC); delete fiboSC; } { // YieldCollection makes it easier to iterate over generators ut::YieldCollection<long> fibos(&coFiboGenerator); int i = 0; foreach_(long value, fibos) { printf ("%ld\n", value); if (++i == 10) break; } }