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 がなくて詰んだ。
シーケンスの操作は問題ないんだけどなぁ…。