Boost logo

Boost :

Subject: Re: [boost] Review Request: Creasing (Sequence Properties)
From: Joachim Faulhaber (afojgo_at_[hidden])
Date: 2010-01-27 03:34:57


Hi Grant,

2010/1/24 Grant Erickson <gerickson_at_[hidden]>:
> The creasing algorithm templates define four template functions for
> determining the order properties of sequences, specifically:
>
>    * Increasing
>    * Decreasing
>    * Strictly Increasing
>    * Strictly Decreasing

in your implementation of 'creasing' you provide the four specific
algorithms is_[strictly_]{in_,de_}creasing while hiding the general
algorithm is_creasing in namespace detail.

I'd suggest to implement only the latter. This would make your
extension both more minimal and more general.

template <typename ForwardIterator, typename BinaryPredicate>
bool is_ordered(ForwardIterator first, ForwardIterator last,
  BinaryPredicate binary_pred)
{
  return std::adjacent_find(first, last,
      std::not2(binary_pred)) == last;
}

Although 'creasing' undoubtedly is a very enjoyable word it violates
the principle of least astonishment. So I'd prefer 'ordered'.

Algorithm is_ordered can be used to express orderedness or sortedness
for operators <, >, <= and >= but also can be used for arbitrary
other strict or partial orderings.

is_ordered(worlds.begin(), worlds.end(), more_perfect<world>());

is_ordered not only allows to use arbitrary ordering relations,
you can also apply the algorithm to check, if elements of a sequence
all share the same equivalence class, if binary_pred is an
equivalence relation:

is_ordered(people.begin(), people.end(), same_sex<person>());

 Best,
Joachim


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk