Coroutine

코루틴(Coroutine)
트리 탐색 알고리즘에서 operator++를 이용하면, 의사코드와 차이점이 발생한다.
(가독성을 떨어뜨릴 수 있음)

operator++는 트리의 최좌측 노드로 초기화한다.
이와 같은 코드는 재시작을 지원하지 않으며, 호출 간의 스택을 보존할 수 없기 때문에
재귀 호출도 불가능하다.

코루틴은 호출 중간에 중간 결과를 넘겨준 후 쉰회를 중단하고
중간 결과에 대한 작업이 끝난 후 순회를 재개할 수 있게 한다.

Coroutine; wiki
코루틴(coroutine)은 루틴의 일종으로서, 협동 루틴이라고 한다.
상호 연계 프로그램을 일컫는다.
루틴과 서브루틴은 서로 비대칭적인 관계이지만, 코루틴은 완전히 대칭적인 서로가 서로를 호출하는 관계

코루틴을 사용한 트리의 후위 탐색
// BinaryTree
generator<Node<T>*> postorder_impl(Node<T>* node){
if(node){
for(auto x: post_order_impl(node->left)) co_yeild x;
for(auto y: post_order_impl(node->rigt)) co_yield y;
co_yield node;
}
}
generator<Node<T>*> post_order(){
return post_order_impl(root);
}
위와 같은 coroutine은 begin()/end()를 사용하지 않으며, 단지 generator를 리턴한다.
(가독성을 높임, python의 yield; generator와 유사한 방식)

재귀가 가능하면서 아래와 같은 반복자 인터페이스를 제공
for(auto it: family.post_order()){
cout<<it->value<<endl;
}
C++20 Coroutine
co_await        연산자를 사용하여 재개될 때까지 실행을 일시 중단
co_return        값을 반환하는 실행을 완료
co_yeild        값을 반환하는 실행을 일시 중단

함수에 위와 같은(co_) 키워드가 발생하면, 코루틴이 된다.
co_await expr
co_yield expr
co_return statement
for co_await statement
gcc에서는 아직 지원하지 않음
clang 5.0 이상
clang -fcoroutines-ts -stdlib=libc++ -std=c++2a

https://luncliff.github.io/coroutine/ppt/[Kor]ExploringTheCppCoroutine.pdf