素数列

※このコードは開発中のものです。


地震のときは素数を数えて落ち着こう。


Ovenの例と違い、any_rangeをsingle pass traversalにしてあります。
iterationはforward traversalにはなれないので、single pass traversalのみ。

#include <iostream>
#include <boost/detail/lightweight_test.hpp>
#include <boost/range/algorithm/equal.hpp>

#include <vector>
#include <boost/assign/list_of.hpp>
#include <boost/range/adaptor/taken.hpp>

#include <boost/range/adaptor/regular_extension/filtered.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/adaptor/dropped.hpp>
#include <boost/range/access/front.hpp>
#include <boost/range/iteration.hpp>
#include <boost/range/any_range.hpp>
#include <boost/lambda/lambda.hpp>

typedef
    boost::any_range<int, boost::single_pass_traversal_tag, int, std::ptrdiff_t>
range;

using boost::lambda::_1;
using namespace boost::adaptors;
using boost::range::access::value_front;

range sieve(range r)
{
    return r | dropped(1) |+ filtered(_1 % value_front(r) != 0);
}

int main()
{
    range primes = boost::iteration(range(boost::iteration(2, boost::regular(_1 + 1))), sieve)
                     | transformed(value_front);

    BOOST_TEST(boost::equal(
        primes | taken(5),
        boost::assign::list_of(2)(3)(5)(7)(11)
    ));

    return boost::report_errors();
}

参照:
primes - github