mirror of
https://github.com/boostorg/algorithm.git
synced 2025-07-06 09:16:33 +02:00
Fix behavior of is_sorted_until; thanks to Michel Morin for the report
[SVN r79433]
This commit is contained in:
@ -38,7 +38,9 @@ Iterator requirements: The `is_sorted` functions will work on all kinds of itera
|
|||||||
|
|
||||||
[heading is_sorted_until]
|
[heading is_sorted_until]
|
||||||
|
|
||||||
The function `is_sorted_until(sequence, predicate)` compares each sequential pair of elements in the sequence, checking if they satisfy the predicate. it returns the first element of the sequence that does not satisfy the predicate with its' predecessor. In short, it returns the element in the sequence that is "out of order". If all adjacent pairs satisfy the predicate, then it will return one past the last element of the sequence.
|
If `distance(first, last) < 2`, then `is_sorted ( first, last )` returns `last`. Otherwise, it returns the last iterator i in [first,last] for which the range [first,i) is sorted.
|
||||||
|
|
||||||
|
In short, it returns the element in the sequence that is "out of order". If the entire sequence is sorted (according to the predicate), then it will return `last`.
|
||||||
|
|
||||||
``
|
``
|
||||||
namespace boost { namespace algorithm {
|
namespace boost { namespace algorithm {
|
||||||
|
@ -46,7 +46,7 @@ using std::is_sorted; // Section 25.4.1.5
|
|||||||
ForwardIterator next = first;
|
ForwardIterator next = first;
|
||||||
while ( ++next != last )
|
while ( ++next != last )
|
||||||
{
|
{
|
||||||
if ( !p ( *first, *next ))
|
if ( p ( *next, *first ))
|
||||||
return next;
|
return next;
|
||||||
first = next;
|
first = next;
|
||||||
}
|
}
|
||||||
@ -63,7 +63,7 @@ using std::is_sorted; // Section 25.4.1.5
|
|||||||
ForwardIterator is_sorted_until ( ForwardIterator first, ForwardIterator last )
|
ForwardIterator is_sorted_until ( ForwardIterator first, ForwardIterator last )
|
||||||
{
|
{
|
||||||
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
|
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
|
||||||
return boost::algorithm::is_sorted_until ( first, last, std::less_equal<value_type>());
|
return boost::algorithm::is_sorted_until ( first, last, std::less<value_type>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -125,10 +125,6 @@ using std::is_sorted; // Section 25.4.1.5
|
|||||||
return boost::algorithm::is_sorted_until ( boost::begin ( range ), boost::end ( range ));
|
return boost::algorithm::is_sorted_until ( boost::begin ( range ), boost::end ( range ));
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
typedef struct { typedef bool type; } bool_;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// \fn is_sorted ( const R &range, Pred p )
|
/// \fn is_sorted ( const R &range, Pred p )
|
||||||
/// \return whether or not the entire range R is sorted
|
/// \return whether or not the entire range R is sorted
|
||||||
/// (according to the comparison predicate 'p').
|
/// (according to the comparison predicate 'p').
|
||||||
@ -173,7 +169,7 @@ namespace detail {
|
|||||||
bool is_increasing ( ForwardIterator first, ForwardIterator last )
|
bool is_increasing ( ForwardIterator first, ForwardIterator last )
|
||||||
{
|
{
|
||||||
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
|
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
|
||||||
return boost::algorithm::is_sorted (first, last, std::less_equal<value_type>());
|
return boost::algorithm::is_sorted (first, last, std::less<value_type>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -206,7 +202,7 @@ namespace detail {
|
|||||||
bool is_decreasing ( ForwardIterator first, ForwardIterator last )
|
bool is_decreasing ( ForwardIterator first, ForwardIterator last )
|
||||||
{
|
{
|
||||||
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
|
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
|
||||||
return boost::algorithm::is_sorted (first, last, std::greater_equal<value_type>());
|
return boost::algorithm::is_sorted (first, last, std::greater<value_type>());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \fn is_decreasing ( const R &range )
|
/// \fn is_decreasing ( const R &range )
|
||||||
@ -238,7 +234,7 @@ namespace detail {
|
|||||||
bool is_strictly_increasing ( ForwardIterator first, ForwardIterator last )
|
bool is_strictly_increasing ( ForwardIterator first, ForwardIterator last )
|
||||||
{
|
{
|
||||||
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
|
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
|
||||||
return boost::algorithm::is_sorted (first, last, std::less<value_type>());
|
return boost::algorithm::is_sorted (first, last, std::less_equal<value_type>());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \fn is_strictly_increasing ( const R &range )
|
/// \fn is_strictly_increasing ( const R &range )
|
||||||
@ -269,7 +265,7 @@ namespace detail {
|
|||||||
bool is_strictly_decreasing ( ForwardIterator first, ForwardIterator last )
|
bool is_strictly_decreasing ( ForwardIterator first, ForwardIterator last )
|
||||||
{
|
{
|
||||||
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
|
typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
|
||||||
return boost::algorithm::is_sorted (first, last, std::greater<value_type>());
|
return boost::algorithm::is_sorted (first, last, std::greater_equal<value_type>());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \fn is_strictly_decreasing ( const R &range )
|
/// \fn is_strictly_decreasing ( const R &range )
|
||||||
|
@ -54,10 +54,10 @@ test_ordered(void)
|
|||||||
BOOST_CHECK ( ba::is_sorted_until ( a_range(strictlyIncreasingValues), std::less<int>()) == boost::end(strictlyIncreasingValues));
|
BOOST_CHECK ( ba::is_sorted_until ( a_range(strictlyIncreasingValues), std::less<int>()) == boost::end(strictlyIncreasingValues));
|
||||||
|
|
||||||
// Check for const and non-const arrays
|
// Check for const and non-const arrays
|
||||||
BOOST_CHECK ( ba::is_sorted_until ( b_e(constantValues), std::less<int>()) != a_end(constantValues));
|
BOOST_CHECK ( ba::is_sorted_until ( b_e(constantValues), std::less<int>()) == a_end(constantValues));
|
||||||
BOOST_CHECK ( ba::is_sorted_until ( a_range(constantValues), std::less<int>()) != boost::end(constantValues));
|
BOOST_CHECK ( ba::is_sorted_until ( a_range(constantValues), std::less<int>()) == boost::end(constantValues));
|
||||||
BOOST_CHECK ( ba::is_sorted_until ( b_e(nonConstantArray), std::less<int>()) != a_end(nonConstantArray));
|
BOOST_CHECK ( ba::is_sorted_until ( b_e(nonConstantArray), std::less<int>()) == a_end(nonConstantArray));
|
||||||
BOOST_CHECK ( ba::is_sorted_until ( a_range(nonConstantArray), std::less<int>()) != boost::end(nonConstantArray));
|
BOOST_CHECK ( ba::is_sorted_until ( a_range(nonConstantArray), std::less<int>()) == boost::end(nonConstantArray));
|
||||||
|
|
||||||
BOOST_CHECK ( ba::is_sorted_until ( b_e(randomValues), std::less<int>()) == &randomValues[2] );
|
BOOST_CHECK ( ba::is_sorted_until ( b_e(randomValues), std::less<int>()) == &randomValues[2] );
|
||||||
BOOST_CHECK ( ba::is_sorted_until ( b_e(randomValues)) == &randomValues[2] );
|
BOOST_CHECK ( ba::is_sorted_until ( b_e(randomValues)) == &randomValues[2] );
|
||||||
|
Reference in New Issue
Block a user