mirror of
https://github.com/bolero-MURAKAMI/Sprout
synced 2025-08-03 12:49:50 +00:00
fix rexursion depth: is_pertitioned, partition_point, is_sorted, is_sorted_until
This commit is contained in:
parent
d6914ddd72
commit
eea1c2bbc1
12 changed files with 410 additions and 50 deletions
|
@ -2,6 +2,7 @@
|
|||
#define SPROUT_ITERATOR_DISTANCE_HPP
|
||||
|
||||
#include <iterator>
|
||||
#include <type_traits>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/iterator/next.hpp>
|
||||
#include <sprout/adl/not_found.hpp>
|
||||
|
@ -12,14 +13,34 @@ namespace sprout_adl {
|
|||
|
||||
namespace sprout {
|
||||
namespace iterator_detail {
|
||||
template<typename RandomAccessIterator>
|
||||
inline SPROUT_CONSTEXPR typename std::enable_if<
|
||||
!std::is_pointer<RandomAccessIterator>::value,
|
||||
typename std::iterator_traits<RandomAccessIterator>::difference_type
|
||||
>::type
|
||||
iterator_distance(RandomAccessIterator first, RandomAccessIterator last, std::random_access_iterator_tag*) {
|
||||
return last - first;
|
||||
}
|
||||
|
||||
// Copyright (C) 2011 RiSK (sscrisk)
|
||||
template<typename InputIterator>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type
|
||||
iterator_distance_impl(InputIterator first, InputIterator last) {
|
||||
return first == last ? 0
|
||||
: 1 + sprout::iterator_detail::iterator_distance_impl(sprout::next(first), last)
|
||||
;
|
||||
}
|
||||
template<typename InputIterator>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type
|
||||
iterator_distance(InputIterator first, InputIterator last, void*) {
|
||||
return sprout::iterator_detail::iterator_distance_impl(first, last);
|
||||
}
|
||||
|
||||
template<typename InputIterator>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type
|
||||
iterator_distance(InputIterator first, InputIterator last) {
|
||||
return first == last ? 0
|
||||
: 1 + sprout::iterator_detail::iterator_distance(sprout::next(first), last)
|
||||
;
|
||||
typedef typename std::iterator_traits<InputIterator>::iterator_category* category;
|
||||
return sprout::iterator_detail::iterator_distance(first, last, category());
|
||||
}
|
||||
} // namespace iterator_detail
|
||||
} // namespace sprout
|
||||
|
@ -38,6 +59,11 @@ namespace sprout {
|
|||
//
|
||||
// distance
|
||||
//
|
||||
// effect:
|
||||
// ADL callable iterator_distance(first, last) -> iterator_distance(first, last)
|
||||
// [first, last) is RandomAccessIterator && not Pointer -> last - first
|
||||
// otherwise -> linearly count: first to last
|
||||
//
|
||||
template<typename InputIterator>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type
|
||||
distance(InputIterator first, InputIterator last) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue