Exemple #1
0
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;
    }
}
Exemple #2
0
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;
        }
    }