Sprout に range adaptor が追加されていたので使ってみた
軽く触ってみました。
[ソース]
#include <sprout/range/adaptor/jointed.hpp> #include <sprout/range/adaptor/dropped.hpp> #include <sprout/range/adaptor/taken.hpp> #include <sprout/range/adaptor/counting.hpp> #include <sprout/range/adaptor/filtered.hpp> #include <sprout/range/adaptor/copied.hpp> #include <sprout/range/algorithm/equal.hpp> #include <sprout/array.hpp> template<typename Range, typename T> constexpr auto equal(Range&& range, std::initializer_list<T> const& t) ->decltype(sprout::range::equal(sprout::forward<Range>(range), t)){ return sprout::range::equal(sprout::forward<Range>(range), t); } constexpr bool is_even(int n){ return n % 2 == 0; } int main(){ namespace a = sprout::adaptors; constexpr auto v1 = a::counting(0, 5); static_assert(::equal(v1, { 0, 1, 2, 3, 4 }), ""); static_assert(::equal(v1 | a::taken(2), {0, 1}), ""); static_assert(::equal(v1 | a::dropped(3), {3, 4}), ""); static_assert(::equal(v1 | a::filtered(&is_even), {0, 2, 4}), ""); static_assert(::equal(v1 | a::jointed(a::counting(5, 8)), {0, 1, 2, 3, 4, 5, 6, 7}), ""); constexpr sprout::array<int, 5> result = a::counting(0, 10) | a::filtered(&is_even) | a::copied; static_assert(result == sprout::make_array<int>(0, 2, 4, 6, 8), ""); return 0; }
transformed や reversed も使ってみたんですが、そっちはコンパイルエラーになりました。にょろーん。
(どうでもいいけど counting は adaptor ではないような気が。
あと当然のように initializer_list を constexpr として使用していますが、標準では constexpr ではないのでご注意を。
思ったよりも機能が揃っていたので quick sort でもサクッと書こうとしたけど、any_range がなくて詰んだ。
シーケンスの操作は問題ないんだけどなぁ…。