あめだまふぁくとりー

Boost.Graphとかできますん

2014-01-01から1年間の記事一覧

Asio の coroutine で明示的に yield する

実行時間がかかる処理 A を coroutine の中で行うと, その coroutine と同じ strand 内の処理は処理 A が完了するまで待たされてしまいます. io_service::post または strand::post を使用することで, 処理 A の合間で明示的に coroutine を切り替えることが…

boost::asio::async_write / read の限界

asio::async_write と asio::async_read に難癖をつけてみます. stream のコンテキストとハンドラのコンテキストが分離されていない socket への書き込み (読み込み) 処理は sock_strand 内で実行し, その書き込み (読み込み) 完了のハンドラは handler_stra…

連続で async_write するまでの道のり (その 3)

単一の socket で連続して async_write するの 3 回目で, 最終回です. 前回の記事では strand を使用方法について見ました. 本記事では作成する queueing socket の wrapping callback に strand を適用する方法を見ていきます. wrapping callback の実装 qu…

boost::asio::asio_handler_is_continuation の効果

asio_handler_is_continuation の効果がいまいち良く分からなかったので調べてみました. ある handler について, asio_handler_is_continuation の結果が true の場合, 処理が以下の様に少し変わります. handler はスレッド固有の private queue に一度登録…

連続で async_write するまでの道のり (その 2)

単一の socket で連続して async_write するの 2 回目です. 前回の記事 では, 普通に socket に対して非同期送信関数を連続で呼び出す際の問題点について整理しました. 前回の内容を踏まえると, 以下のような動作をする async_write_some メソッドを持つ soc…

連続で async_write するまでの道のり (その 1)

単一の socket を使用して, 一つ目の送信処理の完了を待たずに二つ目の送信処理を実行したいといった場合は多々あります. レスポンスの順番がリクエストの順番とは異なる非同期プロトコルを使用または実装する場合には, そういったケースに特に遭遇します. B…

標準入出力を Boost.Asio で非同期に行う

標準入出力を Boost.Asio で非同期に行いたい場合は, posix::stream_descriptor を使用するといいみたいです. 使用例 #include <chrono> #include <iostream> #include <boost/asio/buffer.hpp> #include <boost/asio/io_service.hpp> #include <boost/asio/posix/stream_descriptor.hpp> #include <boost/asio/read_until.hpp> #include </boost/asio/read_until.hpp></boost/asio/posix/stream_descriptor.hpp></boost/asio/io_service.hpp></boost/asio/buffer.hpp></iostream></chrono>

Graph Visitor でアルゴリズムの振る舞いを描写してみる

BGL

学習用にグラフアルゴリズムの振る舞いを視覚的に見たい場合, Boost.Graph の Visitor を使用すれば, 一からそれ用のアルゴリズムを実装せずにすみそうです. という訳で, 実装してみました. GUI は Python + Tk で実装して, 表示する情報を Visitor から TCP…

Boost.Asio で read / async_read を使用する際の注意点

1. boost::asio::streambuf と組み合わせる場合 うっかり, boost::asio::async_read(socket, streambuf, handler); 見たいに書くと, 永遠に handler が起動されない可能性があるので注意しましょう. これは, async_read は指定されたサイズ分読みを行い, デ…

Boost.Test で Test Suite と Test Case の Fixture の併用

Boost.Test では,Test Case に対して Fixture を設定すると,Test Suite レベルの Fixture がその Test Case に対して使用されなくなります. よって,以下のようなコードはコンパイルエラーになってしまいます. #define BOOST_TEST_DYN_LINK #define BOOS…

第一回 グラフ王 決定戦

dijkstra_shortest_paths での比較 Stanford GraphBase と boost::adjacency_list, boost::vector_as_graph を利用した std::vector によるグラフで boost::dijkstra_shortest_paths の実行時間を 適当に 比較してみました. boost::adjacency_list は節点と…

Boost.Graph property to Boost.Fusion

Boost.Graph のグラフ構造体で使用される property を fusion::for_each で使用できるようにしてみました. ソースは こちら にあげています. property に bundle (ユーザが定義した構造体)が含まれる場合, bundle は fusion::for_each 上には現れないので注…

Boost.Program_optionsで名前を持たないオプションの扱い方

Boost.Program_optionsについて調べてみたので,備忘録として. 名前を持たないオプションの対応 以下が名前を持たないオプション値の例です.オプション値hogeはoptionという名前に関連づけされていますが,huga.txtには関連づけされた名前がありません. $…

先読みiteratorアダプタ作ってみた

C++

指定した値分だけiteratorが進んで見える(つまりstd::advance(it, n))ようなiteratorアダプタを作ってみました. Boost.Rangeのslicedでも同じようなことができるのですが, このアダプタはbase()では元の場所を指したiteratorを返します. 式で書くと*it == *(…