boost::any coro_body(coroutine_type::self& self) { self.yield(first_type()); self.yield(second_type()); self.yield(third_type()); self.yield(fourth_type()); return fifth_type(); }
void b_body(coroutine_type::self& self, int arg) { std::cout << "B(" << arg << ")" << std::endl; BOOST_CHECK_EQUAL(arg, 11); arg = self.yield(); std::cout << "B(" << arg << ")" << std::endl; BOOST_CHECK_EQUAL(arg, 21); arg = self.yield_to(coro_a, arg+=1); BOOST_FAIL("Coroutine-B reached the end of the function"); }
void fsm_regexp(coroutine_type::self& self, char) { while(true) { if(self.result() == '0') { std::cout << '0'; self.yield(); if(self.result() == '1') { std::cout << '0'; self.yield(); while(self.result() == '1') { std::cout << '0'; self.yield(); } std::cout <<'0'; self.yield(); if(self.result() == '1') { std::cout << '0'; self.yield(); if(self.result() == '0') { std::cout << '1'; self.yield(); } else { std::cout <<'0'; self.yield(); } } else { std::cout <<'0'; self.yield(); } } else { std::cout << '0'; self.yield(); } } else { std::cout <<'0'; self.yield(); } } }
boost::optional<int> coro_body(coroutine_type::self& self, int parm) { self.yield(); self.yield(0); self.yield(); self.yield(0); self.yield(); self.yield(1); return boost::optional<int>(); }
option random_result(coroutine_type::self& self, option) { while(true) self.yield(std::rand()%2? defect: cooperate); return defect; }
option always_defect(coroutine_type::self& self, option) { while(true) self.yield(defect); return defect; }
option always_cooperate(coroutine_type::self& self, option) { while(true) self.yield(cooperate); return cooperate; }
option tit_for_tat_forgiving(coroutine_type::self& self, option a, int forgiveness) { while(true) a = self.yield((std::rand() %100) < forgiveness? cooperate: a); return cooperate; }
option tit_for_tat(coroutine_type::self& self, option a) { while(true) a = self.yield(a); return cooperate; }