add coroutine examples

master
Daniel Kolesa 2017-03-06 03:31:37 +01:00
parent e0d6839c8c
commit b9260c8918
3 changed files with 226 additions and 1 deletions

View File

@ -4,7 +4,8 @@
set -e
# example sources
EXAMPLES="format listdir range range_pipe signal stream1 stream2"
EXAMPLES="format listdir range range_pipe signal"
EXAMPLES="${EXAMPLES} stream1 stream2 coroutine1 coroutine2"
# assembly sources
ASM_SOURCES="jump_all_gas make_all_gas ontop_all_gas"

View File

@ -0,0 +1,196 @@
#include <ostd/io.hh>
#include <ostd/coroutine.hh>
using namespace ostd;
struct foo {
foo() {
writeln("***foo ctor***");
}
~foo() {
writeln("***foo dtor***");
}
};
int main() {
writeln("MAIN START");
for (int steps: range(1, 10)) {
if (steps != 1) {
/* separate the results */
writeln();
}
writefln("** SCOPE START %d **", steps);
coroutine<int(int)> f = [](auto &coro, int x) {
foo test;
writeln("got: ", x);
for (int i: range(x)) {
writeln("loop: ", i);
writeln("yield: ", coro.yield(i * 10));
}
writeln("return");
return 1234;
};
writeln("CALL");
int val = 5;
for (int i: range(steps)) {
writeln("COROUTINE RETURNED: ", f(val));
writefln("OUT %d (dead: %s)", i, !f);
val += 5;
}
writefln("** SCOPE END %d **", steps);
}
writeln("MAIN END");
}
/*
MAIN START
** SCOPE START 1 **
CALL
***foo ctor***
got: 5
loop: 0
COROUTINE RETURNED: 0
OUT 0 (dead: false)
** SCOPE END 1 **
***foo dtor***
** SCOPE START 2 **
CALL
***foo ctor***
got: 5
loop: 0
COROUTINE RETURNED: 0
OUT 0 (dead: false)
yield: 10
loop: 1
COROUTINE RETURNED: 10
OUT 1 (dead: false)
** SCOPE END 2 **
***foo dtor***
** SCOPE START 3 **
CALL
***foo ctor***
got: 5
loop: 0
COROUTINE RETURNED: 0
OUT 0 (dead: false)
yield: 10
loop: 1
COROUTINE RETURNED: 10
OUT 1 (dead: false)
yield: 15
loop: 2
COROUTINE RETURNED: 20
OUT 2 (dead: false)
** SCOPE END 3 **
***foo dtor***
** SCOPE START 4 **
CALL
***foo ctor***
got: 5
loop: 0
COROUTINE RETURNED: 0
OUT 0 (dead: false)
yield: 10
loop: 1
COROUTINE RETURNED: 10
OUT 1 (dead: false)
yield: 15
loop: 2
COROUTINE RETURNED: 20
OUT 2 (dead: false)
yield: 20
loop: 3
COROUTINE RETURNED: 30
OUT 3 (dead: false)
** SCOPE END 4 **
***foo dtor***
** SCOPE START 5 **
CALL
***foo ctor***
got: 5
loop: 0
COROUTINE RETURNED: 0
OUT 0 (dead: false)
yield: 10
loop: 1
COROUTINE RETURNED: 10
OUT 1 (dead: false)
yield: 15
loop: 2
COROUTINE RETURNED: 20
OUT 2 (dead: false)
yield: 20
loop: 3
COROUTINE RETURNED: 30
OUT 3 (dead: false)
yield: 25
loop: 4
COROUTINE RETURNED: 40
OUT 4 (dead: false)
** SCOPE END 5 **
***foo dtor***
** SCOPE START 6 **
CALL
***foo ctor***
got: 5
loop: 0
COROUTINE RETURNED: 0
OUT 0 (dead: false)
yield: 10
loop: 1
COROUTINE RETURNED: 10
OUT 1 (dead: false)
yield: 15
loop: 2
COROUTINE RETURNED: 20
OUT 2 (dead: false)
yield: 20
loop: 3
COROUTINE RETURNED: 30
OUT 3 (dead: false)
yield: 25
loop: 4
COROUTINE RETURNED: 40
OUT 4 (dead: false)
yield: 30
return
***foo dtor***
COROUTINE RETURNED: 1234
OUT 5 (dead: true)
** SCOPE END 6 **
** SCOPE START 7 **
CALL
***foo ctor***
got: 5
loop: 0
COROUTINE RETURNED: 0
OUT 0 (dead: false)
yield: 10
loop: 1
COROUTINE RETURNED: 10
OUT 1 (dead: false)
yield: 15
loop: 2
COROUTINE RETURNED: 20
OUT 2 (dead: false)
yield: 20
loop: 3
COROUTINE RETURNED: 30
OUT 3 (dead: false)
yield: 25
loop: 4
COROUTINE RETURNED: 40
OUT 4 (dead: false)
yield: 30
return
***foo dtor***
COROUTINE RETURNED: 1234
OUT 5 (dead: true)
terminating with uncaught exception of type ostd::coroutine_error: dead coroutine
*/

View File

@ -0,0 +1,28 @@
#include <ostd/io.hh>
#include <ostd/coroutine.hh>
using namespace ostd;
int main() {
generator<int> g = [](auto &coro) {
coro.yield(5);
coro.yield(10);
coro.yield(15);
coro.yield(20);
return 25;
};
writeln("generator test");
for (int i: g) {
writeln("generated: ", i);
}
}
/*
generator test
generated: 5
generated: 10
generated: 15
generated: 20
generated: 25
*/