pstade

PStade.Oven hetero

昨日の記事のコメントで教えて頂いたので覚書。 PStade.Oven に tuple から任意の型の range へと変換する関数が用意されているらしいので使ってみた。 [ソース] #include <pstade/oven/hetero.hpp> #include <boost/tuple/tuple.hpp> #include <boost/any.hpp> #include <iostream> #include <string> struct shape{ virtual void draw() = 0;</string></iostream></boost/any.hpp></boost/tuple/tuple.hpp></pstade/oven/hetero.hpp>…

pstade::oven::outdirected の実装と Boost.Range でエミュレート

pstade::oven::outdirected の実装がどうなっているのかなーとソースコードを見てみたら pstade::oven::counting でラップしているだけでした。 こんな感じ。 std::vector<int> v = {1, 2, 3, 4, 5}; auto outdirect = pstade::oven::counting(std::begin(v), std</int>…

algorithm のコールバック関数で iterator を受け取りたかった

for_each や find_if 等を使う時に、値ではなくて iterator として関数で受け取りたい場合があったのでちょっと調べてみました。 要は Boost.Range にある indirected の逆。 Boost.Range には見当たらなかったんですが PStade.Oven の を使えばいいみた。 […

pstade::oven::single(x)

#include <iostream> #include <string> #include <pstade/oven/single.hpp> #include <pstade/oven/io.hpp> #include <pstade/oven/transformed.hpp> int main(){ namespace oven = pstade::oven; boost::equal(oven::single('F'), std::string("F")); std::cout << oven::single(10) << std::endl; // 1次元配列を2次元っぽく int a…</pstade/oven/transformed.hpp></pstade/oven/io.hpp></pstade/oven/single.hpp></string></iostream>

pstade::oven::dropped(n)

#include <iostream> #include <string> #include <pstade/oven/dropped.hpp> #include <pstade/oven/io.hpp> int main(){ namespace oven = pstade::oven; int array[] = {0, 1, 2, 3, 4, 5, 6, 7}; std::cout << (array|oven::dropped(3)) << std::endl; return 0; } [出力] {3,4,5,6,7} pstade::oven::dropped(n) は、range</pstade/oven/io.hpp></pstade/oven/dropped.hpp></string></iostream>…

pstade::oven::offset(n, m)

#include <iostream> #include <pstade/oven/offset.hpp> #include <pstade/oven/io.hpp> int main(){ namespace oven = pstade::oven; int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; std::cout << (array|oven::offset(2, -1)) << std::endl; return 0; } [出力] {2,3,4,5,6,7,8} pstade::oven::offset(n, m) は、</pstade/oven/io.hpp></pstade/oven/offset.hpp></iostream>…

pstade::oven::window(n, m)

#include <iostream> #include <pstade/oven/window.hpp> #include <pstade/oven/io.hpp> int main(){ namespace oven = pstade::oven; int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; std::cout << (array|oven::window(1, 7)) << std::endl; return 0; } [出力] {0,1,2,3,4,5} pstade::oven::window(n, m) は、 b</pstade/oven/io.hpp></pstade/oven/window.hpp></iostream>…

2つの range の全ての組み合わせが欲しい

[お題] 2つの range の全ての組み合わせが欲しい。 #include <iostream> #include <pstade/oven/matrix.hpp> #include <pstade/oven/concatenated.hpp> #include <pstade/oven/cycled.hpp> #include <pstade/oven/distance.hpp> #include <pstade/oven/zipped.hpp> #include <pstade/oven/any_range.hpp> #include <boost/tuple/tuple.hpp> #i…</boost/tuple/tuple.hpp></pstade/oven/any_range.hpp></pstade/oven/zipped.hpp></pstade/oven/distance.hpp></pstade/oven/cycled.hpp></pstade/oven/concatenated.hpp></pstade/oven/matrix.hpp></iostream>

pstade::oven::cycled をしたときに連続して展開して欲しい。

[お題] pstade::oven::cycled した時に、連続して展開して欲しい。 言葉にするとややこしいんですが、こんな感じです。 {0, 1, 2}|pstade::oven::cycled(4); // {0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2} // // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ // // こんな感じで展開して…

pstade::oven::fuzipped に boost::array を渡すとコンパイルエラー

つまりこういうこと。 typedef boost::array<int, 5> array_t; array_t array = {0, 1, 2, 3, 4}; // こいつでコンパイルエラー //oven::make_fuzipped(fusion::make_vector(array, array)); // 変数に代入してから渡したら OK fusion::vector<array_t, array_t> foo(array, array); ov</array_t,></int,>…

pstade::oven::cycled を使用したときに range として展開して欲しい

つまりこんな感じに展開されて欲しい。 {0,1,2}|cycled(3); // {{0,1,2},{0,1,2},{0,1,2}} std::string("無駄")|cycled(3); // {"無駄","無駄","無駄"} pstade::oven::cycled は、引数の数だけ range を結合して展開するので、上記のままでは思うように展開…

pstade::oven::initial_values

#include <vector> #include <list> #include <pstade/oven/initial_values.hpp> #include <pstade/oven/io.hpp> #include <pstade/oven/cycled.hpp> #include <pstade/oven/identities.hpp> int main(){ namespace oven = pstade::oven; std::vector<int> array = oven::initial_values(0, 1, 2, 3, 4); std::cout << (arr…</int></pstade/oven/identities.hpp></pstade/oven/cycled.hpp></pstade/oven/io.hpp></pstade/oven/initial_values.hpp></list></vector>

pstade::oven::any_range

#include <iostream> #include <pstade/oven/any_range.hpp> #include <pstade/oven/filtered.hpp> #include <pstade/oven/transformed.hpp> #include <pstade/oven/io.hpp> #include <boost/lambda/lambda.hpp> template<typename T> pstade::oven::any_range< typename pstade::oven::range_value<T>::type, boost::forwa…</t></typename></boost/lambda/lambda.hpp></pstade/oven/io.hpp></pstade/oven/transformed.hpp></pstade/oven/filtered.hpp></pstade/oven/any_range.hpp></iostream>

pstade::oven::zipped

#include <iostream> #include <boost/tuple/tuple_io.hpp> #include <pstade/oven/zipped.hpp> #include <pstade/oven/copied.hpp> #include <pstade/oven/io.hpp> #include <pstade/oven/identities.hpp> #include <boost/array.hpp> int main(){ namespace oven = pstade::oven; int array1[] = {0, 1, 2, 3, 4}; char a…</boost/array.hpp></pstade/oven/identities.hpp></pstade/oven/io.hpp></pstade/oven/copied.hpp></pstade/oven/zipped.hpp></boost/tuple/tuple_io.hpp></iostream>

pstade::oven::cycled

#include <iostream> #include <string> #include <pstade/oven/cycled.hpp> #include <pstade/oven/io.hpp> int main(){ namespace oven = pstade::oven; namespace lambda = boost::lambda; std::cout << (std::string("01")|oven::cycled(3)) << std::endl; int array[] = {0, 1, 2}; auto range = array|oven::cycled(3…</pstade/oven/io.hpp></pstade/oven/cycled.hpp></string></iostream>

std::string と char[]型の end の位置

std::string と char[] 型で std::end() の返ってくる位置がずれている事に気がついた。 次のコードを実行させるとで実行時エラーが出る。 template<typename T> int distance(const T& range){ return std::end(range) - std::begin(range); } char array[] = "01234"; </typename>…

文字の range を std::string へ代入する

[お題] std::vector の様な文字の range を std::string へ代入したい。 #include <iostream> #include <string> #include <vector> #include <pstade/oven/copied.hpp> #include <pstade/oven/concatenated.hpp> #include <pstade/oven/filtered.hpp> #include <boost/assign.hpp> #include <boost/lambda/lambda.hpp> int main(){ namespa…</boost/lambda/lambda.hpp></boost/assign.hpp></pstade/oven/filtered.hpp></pstade/oven/concatenated.hpp></pstade/oven/copied.hpp></vector></string></iostream>

pstade/oven/io.hpp

[お題] std::vector や int[] を標準出力したい。 #include <iostream> #include <list> #include <pstade/oven/io.hpp> #include <pstade/oven/identities.hpp> #include <pstade/oven/filtered.hpp> #include <pstade/oven/copied.hpp> #include <boost/lambda/lambda.hpp> int main(){ namespace oven = pstade::oven; namespace lam…</boost/lambda/lambda.hpp></pstade/oven/copied.hpp></pstade/oven/filtered.hpp></pstade/oven/identities.hpp></pstade/oven/io.hpp></list></iostream>

pstade::oven::at(n)

#include <assert.h> #include <pstade/oven/at.hpp> int main(){ namespace oven = pstade::oven; int array[] = {0, 1, 2, 3, 4}; assert( (array|oven::at(3)) == array[3] ); return 0; } 内部の動作としては、 *(boost::begin(range)+n); こんな感じ。 std::list の様に要素数でアクセ</pstade/oven/at.hpp></assert.h>…

pstade::oven::copied

#include <vector> #include <list> #include <assert.h> #include <pstade/oven/copied.hpp> int main(){ namespace oven = pstade::oven; namespace lambda = boost::lambda; int array[] = {0, 1, 2, 3, 4}; std::vector<int> array2 = array|oven::copied; std::list<int> array3 = array|oven::copied; assert( boo</int></int></pstade/oven/copied.hpp></assert.h></list></vector>…

pstade::oven::rows(height, width)

#include <iostream> #include <boost/range/algorithm/for_each.hpp> #include <pstade/oven/matrix.hpp> #include <pstade/oven/at.hpp> int main(){ namespace oven = pstade::oven; using oven::at; int array[] = {0, 1, 2, 3, 4, 5, 6, 7}; int array2[2][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, }; assert( (array|oven…</pstade/oven/at.hpp></pstade/oven/matrix.hpp></boost/range/algorithm/for_each.hpp></iostream>

pstade::oven::concatenated

[お題] 2次元配列を1次元配列の様に走査したい。 #include <iostream> #include <boost/range/algorithm/for_each.hpp> #include <boost/array.hpp> #include <pstade/oven/concatenated.hpp> int main(){ namespace oven = pstade::oven; int array[3][3] = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8} }; boost::for_each(array|oven::concatenated, […</pstade/oven/concatenated.hpp></boost/array.hpp></boost/range/algorithm/for_each.hpp></iostream>

range一覧

pstade::oven を追加しました。 随時更新予定。

pstade::oven::steps

[お題] 配列の要素を1つ飛ばしで取得したい。 #include <iostream> #include <boost/range/algorithm/for_each.hpp> #include <pstade/oven/steps.hpp> int main(){ namespace oven = pstade::oven; int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; boost::for_each(array|oven::steps(2), [](int n){ std::cout << n << std::endl;</pstade/oven/steps.hpp></boost/range/algorithm/for_each.hpp></iostream>…

pstade::oven::copied

連続した数値の配列の初期化の続き。 namespace oven = pstade::oven; std::vector<int> array = boost::irange(0, 10)|oven::copied; boost::for_each(array, [](int n){ std::cout << n; }); 出力 0123456789 こっちの方がスマート! コメントありがとうござい</int>…

boost::irange

基本的な使い方は、boost::counting_range と同じ。 違う点は、ステップの設定ができる。 boost::irange(0, 5); // {0, 1, 2, 3, 4} bosst::irange(0, 10); // {0, 2, 4, 6, 8} ただし、ここで注意する点がある。 boost::for_each(boost::irange(0, 9, 2), […

テキストファイル内で使われている文字を数える 続き

昨日の続き。 ワイド文字版。 #include <iostream> #include <map> #include <boost/range/algorithm/for_each.hpp> #include <boost/range/adaptor/sliced.hpp> #include <boost/range/as_array.hpp> #include <pstade/oven/file_range.hpp> int main(){ namespace oven = pstade::oven; namespace adaptors = boost::adaptors; auto fr…</pstade/oven/file_range.hpp></boost/range/as_array.hpp></boost/range/adaptor/sliced.hpp></boost/range/algorithm/for_each.hpp></map></iostream>

テキストファイル内で使われている文字を数える

range の練習問題 #include <iostream> #include <boost/range/algorithm/count.hpp> #include <boost/range/counting_range.hpp> #include <pstade/oven/file_range.hpp> int main(){ namespace oven = pstade::oven; auto frange = oven::file_range<char>("BOOST_LICENSE_1_0.txt"); BOOST_FOREACH(char key, boost::counting…</char></pstade/oven/file_range.hpp></boost/range/counting_range.hpp></boost/range/algorithm/count.hpp></iostream>

pstade::oven::stream_lines

\(^o^)/ #include <iostream> #include <fstream> #include <string> #include <boost/range/algorithm/for_each.hpp> #include <pstade/oven/stream_lines.hpp> int main(){ namespace oven = pstade::oven; std::ifstream ifs("test.txt"); boost::for_each(oven::stream_lines(ifs), [](std::string line){ std::cout <<…</pstade/oven/stream_lines.hpp></boost/range/algorithm/for_each.hpp></string></fstream></iostream>

range の結合

boost::range には見当たりませんでしたが pstade::oven にありました。 boost にもあると速攻でツッコミを受けました。 boost::adaptros ばっかり見てて気がつかなかった…。 コメントありがとうございます。 #include <iostream> #include <boost/range/algorithm/for_each.hpp> #include <boost/range/join.hpp> #include <pstade/oven/jointed.hpp> int m</pstade/oven/jointed.hpp></boost/range/join.hpp></boost/range/algorithm/for_each.hpp></iostream>…