範囲がソート済みかどうかを判定する

昨日のエントリの一個ずらしリスト。
あれを使って範囲がソート済みかどうかを判定します。

#include <boost/assert.hpp>
#include <pstade/oven/zipped.hpp>
#include <pstade/oven/popped.hpp>
#include <pstade/oven/dropped.hpp>
#include <pstade/oven/any_range.hpp>
#include <pstade/oven/initial_values.hpp>
#include <pstade/oven/forall.hpp>

namespace oven = pstade::oven;

namespace shand {

struct tuple_comp {
    template <class Tuple>
    bool operator()(const Tuple& x) const
    {
        return boost::get<0>(x) <= boost::get<1>(x);
    }
};

template <class R>
bool is_sorted(const R& r)
{
    return oven::forall(
               boost::make_tuple(r | oven::popped, r | oven::dropped(1)) | oven::zipped,
               tuple_comp());
}

}

int main()
{
    BOOST_ASSERT(!shand::is_sorted(oven::initial_values(3, 1, 4, 5, 2, 6)));
    BOOST_ASSERT(shand::is_sorted(oven::initial_values(1, 2, 3, 4, 5, 6)));
}

{(1, 2), (2, 3), (4, 5)}の各タプルの要素を比較するだけで済みます。


修正履歴:
2010/06/23 17:28 : 自前のall_ofアルゴリズムをoven::forallに差し替え