にゃははー

はへらー

Boost.Coroutine with 1.55.0 Beta 1 RC

もうBoost 1.55.0の時季となったわけで、リリースノートの翻訳作業も進めている。
Boost 1.55.0のリリースノート翻訳を更新 - Faith and Brave - C++で遊ぼう

今回はBoost.PredefというBoost.Configみたいな感じのものが来る。
どうせ誰かが解説するし、変更点とかは次のBoost.勉強会でアキラさんが発表するだろう。

ということで、私は割と見守ってきた(つもりでいる)Concurrentライブラリをつついていた。
過去にOliverはいろいろやってくれていたわけだけど、最近は何事もなかったように思えていたので気を抜いていた。
Boost.Contextの怒涛の変更 - にゃははー
Boost.Contextのnamespace - にゃははー

1.55.0のリリースノートを覗いてみると

New interface (unidirectional data transfer)

と書いてあるわけである。
フム、新しいインターフェイスかどんなものだろう。
当然www.boost.org上にドキュメントはまだ置かれないので、ソースを読む必要がある。

どうやらGeneratorを実装しましたということらしい。
邦訳版のリリースノートの方にも簡単なコード例を載せたが、一応こちらにも示す。

boost::coroutines::coroutine<int>::pull_type gen(
    [](boost::coroutines::coroutine<int>::push_type &yield)
    {
        for (int i : { 0, 1, 2, 3 })
            yield(i);
    });

for (int i : gen)
    std::cout << i << std::endl;

まぁシンプルで良いのではないか。

さて、ここまで気を抜いていた私は、そのままなんとなく昔からあるドキュメントについても眺めてみた。
coroutine.qbk

[section:coroutine Coroutine]

__boost_coroutine__ provides two interfaces - one with uni- and one with bidirectional
data transfer (deprecated).

[include unidirect.qbk]
[/[include old.qbk]]

え、old.qbkって何、
old.qbk

[section:old Bidirectional coroutine (['deprecated])]

[note This interface is deprecated but can be used by compiling the code with
compiler flag BOOST_COROUTINES_OLD.]

何を言っているかわからないだろうが、これまでのインターフェイスは非推奨となった。
BOOST_COROUTINES_OLDマクロが必要らしい。

ここでやっと私はコードを実際にコンパイルしてみようと考えた。
しかし、uniなインターフェイスでどうもコンパイルが通らない。
なんかincomplete typeがなんちゃらと言われる。
coroutine.hppを眺める。

coroutine.hpp

#ifdef BOOST_COROUTINES_UNIDIRECT
#include <boost/coroutine/v2/coroutine.hpp>
#else
#include <boost/coroutine/v1/coroutine.hpp>
#endif

え、BOOST_COROUTINES_OLDどこいった...
とりあえずBOOST_COROUTINES_UNIDIRECTつけたらコンパイル通ったし、期待通り動いたが、どうも釈然としない。

ので、あとでメール投げます。