Read egg oven
-
Upload
kohsuke-yuasa -
Category
Technology
-
view
1.289 -
download
1
Transcript of Read egg oven
PStade.OvenとEggを読む。
Boost.勉強会 #6 札幌
@hotwatermorning
はじめに。
はじめに。● この発表の主なターゲット
はじめに。● この発表の主なターゲット● 日常的にBoostを使ってる人or使われている人
はじめに。● この発表の主なターゲット● 日常的にBoostを使ってる人or使われている人● 日常的にPStade.Oven, PStade.Eggを使ってい
る人
はじめに。● この発表の主なターゲット● 日常的にBoostを使ってる人or使われている人● 日常的にPStade.Oven, PStade.Eggを使ってい
る人● EggやOvenの実装に興味がある人
PStadeとは?
PStadeとは?● Shunsuke Sogame氏によって開発された、
C++ Template Libraryです。● Biscuit Parser Library● Ketchup Message Map Library● Egg Functional Library● Oven Range Library
などが含まれています。
PStadeとは?● Shunsuke Sogame氏によって開発された、
C++ Template Libraryです。● Biscuit Parser Library● Ketchup Message Map Library● Egg Functional Library● Oven Range Library
などが含まれています。← 今日はこの2つを 取り上げます
PStade.Egg
● A framework of making function objects.
“http://p-stade.sourceforge.net/”
● Egg is a small header-only framework of building functions, and offers higher-order functions.
“Introduction”
“http://p-stade.sourceforge.net/egg/doc/html/”
PStade.Oven
● A Boost.Range Extension Library
“http://p-stade.sourceforge.net/”
● Oven is an advanced implementation of Range Library Proposal
“Introduction”
“http://p-stade.sourceforge.net/oven/doc/html/”
PStade.Oven
● そして、PStade.Ovenの実装には、PStade.Eggが使われています。
● なので、Ovenを読もうと思うと、Eggを読む必要がある。
● 逆にEggを読めば、Ovenの理解も進みます。
というわけで、今日はOvenとEggのソースを
覗いていきたいと思います。
Ovenの使用例namespace oven = pstade::oven;
std::string const x = "ab123cde5f";
oven::copy(
x
| oven::filtered(isalpha)
| oven::transformed(toupper),
std::ostream_iterator<char>(std::cout) );
//outputs : ABCDEF
Ovenの使用例namespace oven = pstade::oven;
std::string const x = "ab123cde5f";
oven::copy(
x
| oven::filtered(isalpha)
| oven::transformed(toupper),
std::ostream_iterator<char>(std::cout) );
//outputs : ABCDEF
Range
Range
● 何らかの値の列の範囲を表す物● 生配列, std::vector, std::list, std::map,
boost::array, etc, …● コンテナじゃなくても、例えば指定された範囲
の自然数列を返すcounting rangeなんてものもある。
Ovenの使用例namespace oven = pstade::oven;
std::string const x = "ab123cde5f";
oven::copy(
x
| oven::filtered(isalpha)
| oven::transformed(toupper),
std::ostream_iterator<char>(std::cout) );
//outputs : ABCDEF
Range AdaptorRange Adaptor
Range Adaptor
● Iterator AdaptorのRange版● Rangeを横断しながら、値を変更したりスキッ
プしたりして、元のRangeから別のRangeを返す。
● 遅延評価によって、実際にRangeの値が参照されるときに、その処理の間に入って働くため、● 元のRangeは変更しない。● 返されるRangeはいちいち元のRangeを全部コピー
しているわけではない。● 計算量/空間量的にお得。
Range Adaptor
● Range Adaptorはパイプ演算子でつなげていくことが出来る。range_ | adaptor1 | adaptor2 | …
● 効果が順次適用されていく
Ovenの使用例namespace oven = pstade::oven;
std::string const x = "ab123cde5f";
oven::copy(
x
| oven::filtered(isalpha)
| oven::transformed(toupper),
std::ostream_iterator<char>(std::cout) );
//outputs : ABCDEF
Range Based Function
Range-Based Function
● STLのアルゴリズム(copy, sort, findなど)はイテレータのbeginとendを引数に取る。
● これはIterator-Based Functionと呼ばれる。● 使い勝手があんまりよくない。バグを埋めこん
でしまう可能性も高い。● Iteratorのbeginとendをまとめたもの(=Range)
を渡せるようにすればより使いやすい。
Range-Based Function
● ここら辺については、● Exceptional C++● プログラミングの魔導書vol.1
”オーブンレンジクッキング”● プログラミングの魔導少女
“RangeとPStade.Oven”● などなどに情報があります。
というわけで、これからOvenとEggのソースに
潜っていきます
Ovenの使用例namespace oven = pstade::oven;
std::string const x = "ab123cde5f";
oven::copy(
x
| oven::filtered(isalpha)
| oven::transformed(toupper),
std::ostream_iterator<char>(std::cout) );
//outputs : ABCDEF