あめだまふぁくとりー

Boost.Graphとかできますん

C++

Networking TS の Boost.Asio からの変更点 - その 4: Associated Executor

はじめに Boost 1.66 で Boost.Asio が Networking TS に対応するようです. なのでその 3 からかなり間が空きましたが, その 4 の記事を書きます. 前回 Executor について説明したので, 今回は Associated Executor について説明します. Boost.Asio でのハン…

Networking TS の Boost.Asio からの変更点 - その 3: Executor

はじめに 前回までに説明した Associated allocator や async_result は少し地味目な変更点でした. 今回説明する Executor は Boost.Asio から Networking TS の中でも大きめの変更になっています. 一般化された io_service と strand Executor は Networkin…

Boost.Asio でのタイマのキャンセル処理の仕方

先日, マイナンバーのカード管理システムの障害の原因と対応についての発表がありました. 地方公共団体情報システム機構 カード管理システムの中継サーバに生じた障害原因の特定と対応について その原因 2 では, Windows のタイマをキャンセルしたのにタイム…

Networking TS の Boost.Asio からの変更点 - その 1: Associated allocator

はじめに 現在 TS に提案されている Networking Library は Boost.Asio をベースにしていますが, Boost.Asio そのままというわけではなく様々な変更が含まれています. 本記事ではそれらの変更点によって何が変わったのかを説明しようと思います. 最初は Asso…

io_service の使い方

この記事は C++ Advent Calendar 2015 14 日目の記事です. 13 日目は okdshin さんの Boost.Computeでグラボを燃やす - クリアボックス でした. 本記事の内容 本記事では io_service をどう使うかについて書きます. 具体的には, io_service の使用モデルを整…

名前解決から始める C++

この記事は 初心者 C++er Advent Calendar 2015 14 日目の記事です. いきなりですが次のコードを見てください. #include <iostream> struct cat { std::string name; }; void print_name(cat const& neko) // const 参照渡し! { std::cout << "this cat name is " << n</iostream>…

initiating function 内で yield_context を呼べるようになった

Boost 1.58.0 以降では, Asynchronous operation の initiating function (async_write_some など) 内で直接 yield_context の handler の呼び出しが可能になりました. 以前まではどうだったかというと, spawn 外へのコンテキストスイッチ (initiating funct…

GCC 4.9.1 で List-initialization の評価順が直っていた

C++

List-initialization におけるリストの各要素の評価順は左から右に評価されるように規定されています. しかし, GCC 4.9.0 以前では List-initialization でコンストラクタが呼び出される場合は正しい順序で引数が評価されていませんでした. #include <iostream> int f(</iostream>…

Boost 1.59 を GitHub リポジトリのソースからビルド

いつもは zip か, Homebrew でインストールしていたのを使用していましたが, 今回は GitHub から持ってきたのでメモを残しておきます. # boost のトップリポジトリを取得 git clone https://github.com/boostorg/boost.git # 各ライブラリのリポジトリを取得…

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>

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 == *(…

std::pair<Iterator, Iterator>をrange based forで使用する

C++

C++11にはrange based forが加わり,rangeに対する走査処理を書くのが楽になりました.しかしながら,このstd::pair<Iterator, Iterator>で表されるIterator対はこのrangeには含まれません*1. そのため以下のようなコードはコンパイルエラーになります. #include <iostream> #include <map> in</map></iostream></iterator,>…

Boost1.55でMultiple Source Dijkstra

C++

この記事はC++ (fork) Advent Calendar 2013の22日目の記事になります. 今回も軽めの記事です.ご了承ください.Boost1.55ではBoost.Graphの関数boost::dijkstra_shortes_pathsがマルチソースに対応しましたので,本記事ではこれを紹介します. dijkstra_sh…

boost::adjacency_listのVertexListテンプレート引数とvertex_indexの関係

id:faith_and_brave:20131003:1380788496に関して少しばかし補足. まず,知るべきことはboost::adjaceny_listのテンプレート引数を省略した場合である.この場合,以下の引数を指定したものとして扱われる. boost::adjacency_list< boost::vecS, // OutEdge…

property_map_iterator…だと…?

C++

make_property_map_iterator プロパティマップとそのキーを指すイテレータからプロパティマップの値・参照を指すイテレータを作る make_iterator_property_map ランダムアクセスイテレータRAとインデックスマップからRAが指す参照を返すプロパティマップを作…

ぷっとも関数おぶじぇくと

C++

プロパティマップを関数オブジェクトに変換するproperty_map_functionはSTLやboostのアルゴリズム,イテレータを使う際大変便利.でもこれはgetはできてもputができない.getのときはアルゴリズムでputのときはループ回すとかやだ!get,putは大抵関数テンプ…

ぷろぱてぃーまっぷ

BGL等でproperty mapを使っていると,たまにproperty mapをfunctorとして扱いたいときがある.そんなときにはproperty_map_funcionが使える.property_map_functionはproperty mapをfunctorとして扱うためのラッパオブジェクト.make_property_map_function…

さらばTR1

C++

むぅ.やっぱりこんなことはできないのか. #include <iostream> #include <tr1/tuple> using std = ::std::tr1; // エラー int main() { std::tuple<int, int, int> t = std::make_tupple(3, 4, 5); std::cout << std::get<0>(t) << std::endl; } C++11を使ったり使わなかったりするからコードを</int,></tr1/tuple></iostream>…

大晦日

あとちょっとで新年だけど一人で修論書く以外にすることないよ…. private継承の名前探索 class Base1 { public: void f() { } }; class Base2 { public: void f() { } }; class Derived : public Base1, private Base2 { }; int main() { Derived d; d.f();…