Coroutine rollback acceleration

To try the new coroutine function in boost, I created the following program:

#include <boost/coroutine/all.hpp> #include <string> #include <vector> typedef boost::coroutines::coroutine<int(char)> coroutine_t; void f(coroutine_t::caller_type & ca) { std::vector<int> vec = {1, 2, 3}; for (int i : vec) { char c = ca.get(); std::cout << "c: " << c << std::endl; ca(i); } } int main() { coroutine_t cr(f); std::string str("abc"); for (char c : str) { std::cout << c << std::flush; cr(c); int n = cr.get(); std::cout << n << std::endl; } } 

The code is based on sample code from the documentation .

My build command is as follows:

 $ g++ -std=c++11 -o test -I/usr/local/include -L/usr/local/lib main.cpp /usr/local/lib/libboost_context.a 

Output:

 $ ./test test: /usr/local/include/boost/coroutine/detail/coroutine_get.hpp:43: typename boost::coroutines::detail::param<Result>::type boost::coroutines::detail::coroutine_get<D, Result, arity>::get() const [with D = boost::coroutines::coroutine<char(int), 1>; Result = char; int arity = 1; typename boost::coroutines::detail::param<Result>::type = char]: Assertion `static_cast< D const* >( this)->impl_->result_' failed. Aborted (core dumped) 

The program is interrupted due to an unsuccessful statement. Can you help me find an error in my code?

+6
source share
1 answer

I think you need to add a call to ca() at the beginning of your f function.

From the documentation on acceleration:

Execution control is passed to the coroutine coroutine during construction (the coroutine function was introduced) - when control should be returned to the original call procedure, call boost :: coroutines :: coroutine <> :: operator () for the first argument of type boost :: coroutines :: coroutine <> :: caller_type inside the coprocessor function.

+2
source

All Articles