1
0
Fork 0
mirror of https://github.com/bolero-MURAKAMI/Sprout synced 2025-08-03 12:49:50 +00:00

fix recursion depth O(logN): some algorithms

This commit is contained in:
bolero-MURAKAMI 2013-01-03 17:01:50 +09:00
parent 28697ee7a8
commit 5019f6aa96
162 changed files with 3600 additions and 1659 deletions

View file

@ -11,7 +11,7 @@
#include <sprout/iterator/type_traits/common.hpp>
#include <sprout/utility/swap.hpp>
#include <sprout/utility/limited.hpp>
#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT
#include <sprout/iterator/operation.hpp>
namespace sprout {
//
@ -279,19 +279,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename LIterator, typename RIterator>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::alternate_iterator<LIterator, RIterator> >::difference_type
iterator_distance(
sprout::alternate_iterator<LIterator, RIterator> first,
sprout::alternate_iterator<LIterator, RIterator> last
)
{
return last - first;
}
//
// iterator_next
//
@ -300,15 +287,6 @@ namespace sprout {
iterator_next(sprout::alternate_iterator<LIterator, RIterator> const& it) {
return it.next();
}
template<typename LIterator, typename RIterator>
inline SPROUT_CONSTEXPR sprout::alternate_iterator<LIterator, RIterator>
iterator_next(
sprout::alternate_iterator<LIterator, RIterator> const& it,
typename sprout::alternate_iterator<LIterator, RIterator>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -318,15 +296,6 @@ namespace sprout {
iterator_prev(sprout::alternate_iterator<LIterator, RIterator> const& it) {
return it.prev();
}
template<typename LIterator, typename RIterator>
inline SPROUT_CONSTEXPR sprout::alternate_iterator<LIterator, RIterator>
iterator_prev(
sprout::alternate_iterator<LIterator, RIterator> const& it,
typename sprout::alternate_iterator<LIterator, RIterator>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_ALTERNATE_ITERATOR_HPP

View file

@ -189,15 +189,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Iterator, typename Traits>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::bytes_iterator<Iterator, Traits> >::difference_type
iterator_distance(sprout::bytes_iterator<Iterator, Traits> first, sprout::bytes_iterator<Iterator, Traits> last) {
return last - first;
}
//
// iterator_next
//
@ -206,15 +197,6 @@ namespace sprout {
iterator_next(sprout::bytes_iterator<Iterator, Traits> const& it) {
return it.next();
}
template<typename Iterator, typename Traits>
inline SPROUT_CONSTEXPR sprout::bytes_iterator<Iterator, Traits>
iterator_next(
sprout::bytes_iterator<Iterator, Traits> const& it,
typename sprout::bytes_iterator<Iterator, Traits>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -224,15 +206,6 @@ namespace sprout {
iterator_prev(sprout::bytes_iterator<Iterator, Traits> const& it) {
return it.prev();
}
template<typename Iterator, typename Traits>
inline SPROUT_CONSTEXPR sprout::bytes_iterator<Iterator, Traits>
iterator_prev(
sprout::bytes_iterator<Iterator, Traits> const& it,
typename sprout::bytes_iterator<Iterator, Traits>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_BYTES_ITERATOR_HPP

View file

@ -215,15 +215,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Iterator, typename Compare>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::clamp_iterator<Iterator, Compare> >::difference_type
iterator_distance(sprout::clamp_iterator<Iterator, Compare> first, sprout::clamp_iterator<Iterator, Compare> last) {
return last - first;
}
//
// iterator_next
//
@ -232,15 +223,6 @@ namespace sprout {
iterator_next(sprout::clamp_iterator<Iterator, Compare> const& it) {
return it.next();
}
template<typename Iterator, typename Compare>
inline SPROUT_CONSTEXPR sprout::clamp_iterator<Iterator, Compare>
iterator_next(
sprout::clamp_iterator<Iterator, Compare> const& it,
typename sprout::clamp_iterator<Iterator, Compare>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -250,15 +232,6 @@ namespace sprout {
iterator_prev(sprout::clamp_iterator<Iterator, Compare> const& it) {
return it.prev();
}
template<typename Iterator, typename Compare>
inline SPROUT_CONSTEXPR sprout::clamp_iterator<Iterator, Compare>
iterator_prev(
sprout::clamp_iterator<Iterator, Compare> const& it,
typename sprout::clamp_iterator<Iterator, Compare>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // SPROUT_ITERATOR_CLAMP_ITERATOR_HPP

View file

@ -184,15 +184,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Incrementable>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::counting_iterator<Incrementable> >::difference_type
iterator_distance(sprout::counting_iterator<Incrementable> first, sprout::counting_iterator<Incrementable> last) {
return last - first;
}
//
// iterator_next
//
@ -201,15 +192,6 @@ namespace sprout {
iterator_next(sprout::counting_iterator<Incrementable> const& it) {
return it.next();
}
template<typename Incrementable>
inline SPROUT_CONSTEXPR sprout::counting_iterator<Incrementable>
iterator_next(
sprout::counting_iterator<Incrementable> const& it,
typename sprout::counting_iterator<Incrementable>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -219,15 +201,6 @@ namespace sprout {
iterator_prev(sprout::counting_iterator<Incrementable> const& it) {
return it.prev();
}
template<typename Incrementable>
inline SPROUT_CONSTEXPR sprout::counting_iterator<Incrementable>
iterator_prev(
sprout::counting_iterator<Incrementable> const& it,
typename sprout::counting_iterator<Incrementable>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_COUNTING_ITERATOR_HPP

View file

@ -11,7 +11,7 @@
#include <sprout/iterator/distance.hpp>
#include <sprout/utility/swap.hpp>
#include <sprout/numeric/dft/dft_element.hpp>
#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT
#include <sprout/iterator/operation.hpp>
namespace sprout {
//
@ -60,7 +60,7 @@ namespace sprout {
dft_iterator(dft_iterator const&) = default;
SPROUT_CONSTEXPR dft_iterator(iterator_type first, iterator_type last, difference_type index = 0)
: first_(first), last_(last), index_(index)
, size_(NS_SSCRISK_CEL_OR_SPROUT::distance(first, last))
, size_(sprout::distance(first, last))
{}
SPROUT_CONSTEXPR dft_iterator next() const {
return dft_iterator(first_, last_, index_, index_ + 1, size_);
@ -164,15 +164,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Iterator>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::dft_iterator<Iterator> >::difference_type
iterator_distance(sprout::dft_iterator<Iterator> first, sprout::dft_iterator<Iterator> last) {
return last - first;
}
//
// iterator_next
//
@ -181,15 +172,6 @@ namespace sprout {
iterator_next(sprout::dft_iterator<Iterator> const& it) {
return it.next();
}
template<typename Iterator>
inline SPROUT_CONSTEXPR sprout::dft_iterator<Iterator>
iterator_next(
sprout::dft_iterator<Iterator> const& it,
typename sprout::dft_iterator<Iterator>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -199,15 +181,6 @@ namespace sprout {
iterator_prev(sprout::dft_iterator<Iterator> const& it) {
return it.prev();
}
template<typename Iterator>
inline SPROUT_CONSTEXPR sprout::dft_iterator<Iterator>
iterator_prev(
sprout::dft_iterator<Iterator> const& it,
typename sprout::dft_iterator<Iterator>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_DFT_ITERATOR_HPP

View file

@ -5,6 +5,7 @@
#include <type_traits>
#include <sprout/config.hpp>
#include <sprout/iterator/next.hpp>
#include <sprout/iterator/type_traits/is_iterator.hpp>
#include <sprout/utility/pair.hpp>
#include <sprout/adl/not_found.hpp>
@ -16,7 +17,7 @@ namespace sprout {
namespace iterator_detail {
template<typename RandomAccessIterator>
inline SPROUT_CONSTEXPR typename std::enable_if<
!std::is_pointer<RandomAccessIterator>::value,
sprout::is_constant_distance_iterator<RandomAccessIterator>::value,
typename std::iterator_traits<RandomAccessIterator>::difference_type
>::type
iterator_distance(RandomAccessIterator first, RandomAccessIterator last, std::random_access_iterator_tag*) {
@ -103,7 +104,7 @@ namespace sprout {
//
// effect:
// ADL callable iterator_distance(first, last) -> iterator_distance(first, last)
// otherwise, [first, last) is LiteralType -> std::distance(first, last)
// otherwise, [first, last) is not LiteralType -> std::distance(first, last)
// otherwise, [first, last) is RandomAccessIterator && not Pointer -> last - first
// otherwise -> linearly count: first to last
//

View file

@ -132,15 +132,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Generator>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::generator_iterator<Generator> >::difference_type
iterator_distance(sprout::generator_iterator<Generator> first, sprout::generator_iterator<Generator> last) {
return last - first;
}
//
// iterator_next
//

View file

@ -11,7 +11,7 @@
#include <sprout/iterator/distance.hpp>
#include <sprout/utility/swap.hpp>
#include <sprout/numeric/dft/idft_element.hpp>
#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT
#include <sprout/iterator/operation.hpp>
namespace sprout {
//
@ -60,7 +60,7 @@ namespace sprout {
idft_iterator(idft_iterator const&) = default;
SPROUT_CONSTEXPR idft_iterator(iterator_type first, iterator_type last, difference_type index = 0)
: first_(first), last_(last), index_(index)
, size_(NS_SSCRISK_CEL_OR_SPROUT::distance(first, last))
, size_(sprout::distance(first, last))
{}
SPROUT_CONSTEXPR idft_iterator next() const {
return idft_iterator(first_, last_, index_, index_ + 1, size_);
@ -164,15 +164,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Iterator>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::idft_iterator<Iterator> >::difference_type
iterator_distance(sprout::idft_iterator<Iterator> first, sprout::idft_iterator<Iterator> last) {
return last - first;
}
//
// iterator_next
//
@ -181,15 +172,6 @@ namespace sprout {
iterator_next(sprout::idft_iterator<Iterator> const& it) {
return it.next();
}
template<typename Iterator>
inline SPROUT_CONSTEXPR sprout::idft_iterator<Iterator>
iterator_next(
sprout::idft_iterator<Iterator> const& it,
typename sprout::idft_iterator<Iterator>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -199,15 +181,6 @@ namespace sprout {
iterator_prev(sprout::idft_iterator<Iterator> const& it) {
return it.prev();
}
template<typename Iterator>
inline SPROUT_CONSTEXPR sprout::idft_iterator<Iterator>
iterator_prev(
sprout::idft_iterator<Iterator> const& it,
typename sprout::idft_iterator<Iterator>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_IDFT_ITERATOR_HPP

View file

@ -211,15 +211,6 @@ namespace sprout {
: public std::true_type
{};
//
// iterator_distance
//
template<typename Container>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::index_iterator<Container> >::difference_type
iterator_distance(sprout::index_iterator<Container> first, sprout::index_iterator<Container> last) {
return last - first;
}
//
// iterator_next
//
@ -228,15 +219,6 @@ namespace sprout {
iterator_next(sprout::index_iterator<Container> const& it) {
return it.next();
}
template<typename Container>
inline SPROUT_CONSTEXPR sprout::index_iterator<Container>
iterator_next(
sprout::index_iterator<Container> const& it,
typename sprout::index_iterator<Container>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -246,15 +228,6 @@ namespace sprout {
iterator_prev(sprout::index_iterator<Container> const& it) {
return it.prev();
}
template<typename Container>
inline SPROUT_CONSTEXPR sprout::index_iterator<Container>
iterator_prev(
sprout::index_iterator<Container> const& it,
typename sprout::index_iterator<Container>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_INDEX_ITERATOR_HPP

View file

@ -190,15 +190,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Iterator>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::indexed_iterator<Iterator> >::difference_type
iterator_distance(sprout::indexed_iterator<Iterator> first, sprout::indexed_iterator<Iterator> last) {
return last - first;
}
//
// iterator_next
//
@ -207,15 +198,6 @@ namespace sprout {
iterator_next(sprout::indexed_iterator<Iterator> const& it) {
return it.next();
}
template<typename Iterator>
inline SPROUT_CONSTEXPR sprout::indexed_iterator<Iterator>
iterator_next(
sprout::indexed_iterator<Iterator> const& it,
typename sprout::indexed_iterator<Iterator>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -225,15 +207,6 @@ namespace sprout {
iterator_prev(sprout::indexed_iterator<Iterator> const& it) {
return it.prev();
}
template<typename Iterator>
inline SPROUT_CONSTEXPR sprout::indexed_iterator<Iterator>
iterator_prev(
sprout::indexed_iterator<Iterator> const& it,
typename sprout::indexed_iterator<Iterator>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_INDEXED_ITERATOR_HPP

View file

@ -12,7 +12,7 @@
#include <sprout/utility/swap.hpp>
#include <sprout/utility/limited.hpp>
#include <sprout/type_traits/arithmetic_promote.hpp>
#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT
#include <sprout/iterator/operation.hpp>
namespace sprout {
//
@ -55,11 +55,11 @@ namespace sprout {
SPROUT_CONSTEXPR joint_iterator advance_impl(difference_type n) const {
return n >= 0
? is_in_left()
? advance_impl_posite(n, NS_SSCRISK_CEL_OR_SPROUT::distance(current1, last1))
? advance_impl_posite(n, sprout::distance(current1, last1))
: joint_iterator(current1, last1, first2, sprout::next(current2, n))
: first2 == current2
? joint_iterator(sprout::next(current1, n), last1, first2, current2)
: advance_impl_negate(n, -NS_SSCRISK_CEL_OR_SPROUT::distance(first2, current2))
: advance_impl_negate(n, -sprout::distance(first2, current2))
;
}
public:
@ -313,19 +313,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename LIterator, typename RIterator>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::joint_iterator<LIterator, RIterator> >::difference_type
iterator_distance(
sprout::joint_iterator<LIterator, RIterator> first,
sprout::joint_iterator<LIterator, RIterator> last
)
{
return last - first;
}
//
// iterator_next
//
@ -334,15 +321,6 @@ namespace sprout {
iterator_next(sprout::joint_iterator<LIterator, RIterator> const& it) {
return it.next();
}
template<typename LIterator, typename RIterator>
inline SPROUT_CONSTEXPR sprout::joint_iterator<LIterator, RIterator>
iterator_next(
sprout::joint_iterator<LIterator, RIterator> const& it,
typename sprout::joint_iterator<LIterator, RIterator>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -352,15 +330,6 @@ namespace sprout {
iterator_prev(sprout::joint_iterator<LIterator, RIterator> const& it) {
return it.prev();
}
template<typename LIterator, typename RIterator>
inline SPROUT_CONSTEXPR sprout::joint_iterator<LIterator, RIterator>
iterator_prev(
sprout::joint_iterator<LIterator, RIterator> const& it,
typename sprout::joint_iterator<LIterator, RIterator>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_JOINT_ITERATOR_HPP

View file

@ -237,15 +237,6 @@ namespace sprout {
: public std::true_type
{};
//
// iterator_distance
//
template<typename T>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::ptr_index_iterator<T> >::difference_type
iterator_distance(sprout::ptr_index_iterator<T> first, sprout::ptr_index_iterator<T> last) {
return last - first;
}
//
// iterator_next
//
@ -254,15 +245,6 @@ namespace sprout {
iterator_next(sprout::ptr_index_iterator<T> const& it) {
return it.next();
}
template<typename T>
inline SPROUT_CONSTEXPR sprout::ptr_index_iterator<T>
iterator_next(
sprout::ptr_index_iterator<T> const& it,
typename sprout::ptr_index_iterator<T>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -272,15 +254,6 @@ namespace sprout {
iterator_prev(sprout::ptr_index_iterator<T> const& it) {
return it.prev();
}
template<typename T>
inline SPROUT_CONSTEXPR sprout::ptr_index_iterator<T>
iterator_prev(
sprout::ptr_index_iterator<T> const& it,
typename sprout::ptr_index_iterator<T>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_PTR_INDEX_ITERATOR_HPP

View file

@ -187,15 +187,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Iterator>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::reverse_iterator<Iterator> >::difference_type
iterator_distance(sprout::reverse_iterator<Iterator> first, sprout::reverse_iterator<Iterator> last) {
return last - first;
}
//
// iterator_next
//
@ -204,15 +195,6 @@ namespace sprout {
iterator_next(sprout::reverse_iterator<Iterator> const& it) {
return it.next();
}
template<typename Iterator>
inline SPROUT_CONSTEXPR sprout::reverse_iterator<Iterator>
iterator_next(
sprout::reverse_iterator<Iterator> const& it,
typename sprout::reverse_iterator<Iterator>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -222,15 +204,6 @@ namespace sprout {
iterator_prev(sprout::reverse_iterator<Iterator> const& it) {
return it.prev();
}
template<typename Iterator>
inline SPROUT_CONSTEXPR sprout::reverse_iterator<Iterator>
iterator_prev(
sprout::reverse_iterator<Iterator> const& it,
typename sprout::reverse_iterator<Iterator>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_REVERSE_ITERATOR_HPP

View file

@ -201,15 +201,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Value>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::sawtooth_iterator<Value> >::difference_type
iterator_distance(sprout::sawtooth_iterator<Value> first, sprout::sawtooth_iterator<Value> last) {
return last - first;
}
//
// iterator_next
//
@ -218,11 +209,6 @@ namespace sprout {
iterator_next(sprout::sawtooth_iterator<Value> const& it) {
return it.next();
}
template<typename Value>
inline SPROUT_CONSTEXPR sprout::sawtooth_iterator<Value>
iterator_next(sprout::sawtooth_iterator<Value> const& it, typename sprout::sawtooth_iterator<Value>::difference_type n) {
return it + n;
}
//
// iterator_prev
@ -232,11 +218,6 @@ namespace sprout {
iterator_prev(sprout::sawtooth_iterator<Value> const& it) {
return it.prev();
}
template<typename Value>
inline SPROUT_CONSTEXPR sprout::sawtooth_iterator<Value>
iterator_prev(sprout::sawtooth_iterator<Value> const& it, typename sprout::sawtooth_iterator<Value>::difference_type n) {
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_SAWTOOTH_ITERATOR_HPP

View file

@ -210,15 +210,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Value>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::sinusoid_iterator<Value> >::difference_type
iterator_distance(sprout::sinusoid_iterator<Value> first, sprout::sinusoid_iterator<Value> last) {
return last - first;
}
//
// iterator_next
//
@ -227,11 +218,6 @@ namespace sprout {
iterator_next(sprout::sinusoid_iterator<Value> const& it) {
return it.next();
}
template<typename Value>
inline SPROUT_CONSTEXPR sprout::sinusoid_iterator<Value>
iterator_next(sprout::sinusoid_iterator<Value> const& it, typename sprout::sinusoid_iterator<Value>::difference_type n) {
return it + n;
}
//
// iterator_prev
@ -241,11 +227,6 @@ namespace sprout {
iterator_prev(sprout::sinusoid_iterator<Value> const& it) {
return it.prev();
}
template<typename Value>
inline SPROUT_CONSTEXPR sprout::sinusoid_iterator<Value>
iterator_prev(sprout::sinusoid_iterator<Value> const& it, typename sprout::sinusoid_iterator<Value>::difference_type n) {
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_SINUSOID_ITERATOR_HPP

View file

@ -401,15 +401,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Iterator, bool Separated>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::size_enum_iterator<Iterator, Separated> >::difference_type
iterator_distance(sprout::size_enum_iterator<Iterator, Separated> first, sprout::size_enum_iterator<Iterator, Separated> last) {
return last - first;
}
//
// iterator_next
//
@ -418,15 +409,6 @@ namespace sprout {
iterator_next(sprout::size_enum_iterator<Iterator, Separated> const& it) {
return it.next();
}
template<typename Iterator, bool Separated>
inline SPROUT_CONSTEXPR sprout::size_enum_iterator<Iterator, Separated>
iterator_next(
sprout::size_enum_iterator<Iterator, Separated> const& it,
typename sprout::size_enum_iterator<Iterator, Separated>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -436,15 +418,6 @@ namespace sprout {
iterator_prev(sprout::size_enum_iterator<Iterator, Separated> const& it) {
return it.prev();
}
template<typename Iterator, bool Separated>
inline SPROUT_CONSTEXPR sprout::size_enum_iterator<Iterator, Separated>
iterator_prev(
sprout::size_enum_iterator<Iterator, Separated> const& it,
typename sprout::size_enum_iterator<Iterator, Separated>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_SIZE_ENUM_ITERATOR_HPP

View file

@ -211,15 +211,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Value>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::square_iterator<Value> >::difference_type
iterator_distance(sprout::square_iterator<Value> first, sprout::square_iterator<Value> last) {
return last - first;
}
//
// iterator_next
//
@ -228,11 +219,6 @@ namespace sprout {
iterator_next(sprout::square_iterator<Value> const& it) {
return it.next();
}
template<typename Value>
inline SPROUT_CONSTEXPR sprout::square_iterator<Value>
iterator_next(sprout::square_iterator<Value> const& it, typename sprout::square_iterator<Value>::difference_type n) {
return it + n;
}
//
// iterator_prev
@ -242,11 +228,6 @@ namespace sprout {
iterator_prev(sprout::square_iterator<Value> const& it) {
return it.prev();
}
template<typename Value>
inline SPROUT_CONSTEXPR sprout::square_iterator<Value>
iterator_prev(sprout::square_iterator<Value> const& it, typename sprout::square_iterator<Value>::difference_type n) {
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_SQUARE_ITERATOR_HPP

View file

@ -8,7 +8,7 @@
#include <sprout/iterator/prev.hpp>
#include <sprout/iterator/distance.hpp>
#include <sprout/utility/swap.hpp>
#include HDR_ITERATOR_SSCRISK_CEL_OR_SPROUT
#include <sprout/iterator/operation.hpp>
#include HDR_ALGORITHM_SSCRISK_CEL_OR_SPROUT
namespace sprout {
@ -34,12 +34,12 @@ namespace sprout {
typedef typename std::iterator_traits<iterator_type>::reference reference;
private:
static SPROUT_CONSTEXPR iterator_type get_back(iterator_type it, difference_type wid, iterator_type last) {
return sprout::next(it, (NS_SSCRISK_CEL_OR_SPROUT::distance(it, last) - 1) / wid * wid);
return sprout::next(it, (sprout::distance(it, last) - 1) / wid * wid);
}
static SPROUT_CONSTEXPR difference_type next_distance(step_iterator const& it, difference_type n) {
return n >= 0 ? NS_SSCRISK_CEL_OR_SPROUT::min(NS_SSCRISK_CEL_OR_SPROUT::distance(it.current, it.back), n * it.wid)
return n >= 0 ? NS_SSCRISK_CEL_OR_SPROUT::min(sprout::distance(it.current, it.back), n * it.wid)
: it.is_last ? 0
: NS_SSCRISK_CEL_OR_SPROUT::max(-NS_SSCRISK_CEL_OR_SPROUT::distance(it.current, it.back), n * it.wid)
: NS_SSCRISK_CEL_OR_SPROUT::max(-sprout::distance(it.current, it.back), n * it.wid)
;
}
protected:
@ -234,15 +234,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Iterator>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::step_iterator<Iterator> >::difference_type
iterator_distance(sprout::step_iterator<Iterator> first, sprout::step_iterator<Iterator> last) {
return last - first;
}
//
// iterator_next
//
@ -251,15 +242,6 @@ namespace sprout {
iterator_next(sprout::step_iterator<Iterator> const& it) {
return it.next();
}
template<typename Iterator>
inline SPROUT_CONSTEXPR sprout::step_iterator<Iterator>
iterator_next(
sprout::step_iterator<Iterator> const& it,
typename sprout::step_iterator<Iterator>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -269,15 +251,6 @@ namespace sprout {
iterator_prev(sprout::step_iterator<Iterator> const& it) {
return it.prev();
}
template<typename Iterator>
inline SPROUT_CONSTEXPR sprout::step_iterator<Iterator>
iterator_prev(
sprout::step_iterator<Iterator> const& it,
typename sprout::step_iterator<Iterator>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_STEP_ITERATOR_HPP

View file

@ -398,19 +398,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename UnaryOrBinaryFunction, typename LIterator, typename RIterator>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator> >::difference_type
iterator_distance(
sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator> first,
sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator> last
)
{
return last - first;
}
//
// iterator_next
//
@ -419,15 +406,6 @@ namespace sprout {
iterator_next(sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator> const& it) {
return it.next();
}
template<typename UnaryOrBinaryFunction, typename LIterator, typename RIterator>
inline SPROUT_CONSTEXPR sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator>
iterator_next(
sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator> const& it,
typename sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -437,15 +415,6 @@ namespace sprout {
iterator_prev(sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator> const& it) {
return it.prev();
}
template<typename UnaryOrBinaryFunction, typename LIterator, typename RIterator>
inline SPROUT_CONSTEXPR sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator>
iterator_prev(
sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator> const& it,
typename sprout::transform_iterator<UnaryOrBinaryFunction, LIterator, RIterator>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_TRANSFORM_ITERATOR_HPP

View file

@ -225,15 +225,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Value>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::triangle_iterator<Value> >::difference_type
iterator_distance(sprout::triangle_iterator<Value> first, sprout::triangle_iterator<Value> last) {
return last - first;
}
//
// iterator_next
//
@ -242,11 +233,6 @@ namespace sprout {
iterator_next(sprout::triangle_iterator<Value> const& it) {
return it.next();
}
template<typename Value>
inline SPROUT_CONSTEXPR sprout::triangle_iterator<Value>
iterator_next(sprout::triangle_iterator<Value> const& it, typename sprout::triangle_iterator<Value>::difference_type n) {
return it + n;
}
//
// iterator_prev
@ -256,11 +242,6 @@ namespace sprout {
iterator_prev(sprout::triangle_iterator<Value> const& it) {
return it.prev();
}
template<typename Value>
inline SPROUT_CONSTEXPR sprout::triangle_iterator<Value>
iterator_prev(sprout::triangle_iterator<Value> const& it, typename sprout::triangle_iterator<Value>::difference_type n) {
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_TRIANGLE_ITERATOR_HPP

View file

@ -92,6 +92,17 @@ namespace sprout {
struct is_random_access_iterator
: public sprout::is_random_access_iterator_category<typename std::iterator_traits<Iterator>::iterator_category>
{};
//
// is_constant_distance_iterator
//
template<typename Iterator>
struct is_constant_distance_iterator
: public std::integral_constant<
bool,
sprout::is_random_access_iterator<Iterator>::value && !std::is_pointer<Iterator>::value
>
{};
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_TYPE_TRAITS_IS_ITERATOR_HPP

View file

@ -170,15 +170,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename T>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::value_iterator<T> >::difference_type
iterator_distance(sprout::value_iterator<T> first, sprout::value_iterator<T> last) {
return last - first;
}
//
// iterator_next
//
@ -187,11 +178,6 @@ namespace sprout {
iterator_next(sprout::value_iterator<T> const& it) {
return it.next();
}
template<typename T>
inline SPROUT_CONSTEXPR sprout::value_iterator<T>
iterator_next(sprout::value_iterator<T> const& it, typename sprout::value_iterator<T>::difference_type n) {
return it + n;
}
//
// iterator_prev
@ -201,11 +187,6 @@ namespace sprout {
iterator_prev(sprout::value_iterator<T> const& it) {
return it.prev();
}
template<typename T>
inline SPROUT_CONSTEXPR sprout::value_iterator<T>
iterator_prev(sprout::value_iterator<T> const& it, typename sprout::value_iterator<T>::difference_type n) {
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_VALUE_ITERATOR_HPP

View file

@ -198,15 +198,6 @@ namespace sprout {
lhs.swap(rhs);
}
//
// iterator_distance
//
template<typename Iterator, typename T>
inline SPROUT_CONSTEXPR typename std::iterator_traits<sprout::valued_iterator<Iterator, T> >::difference_type
iterator_distance(sprout::valued_iterator<Iterator, T> first, sprout::valued_iterator<Iterator, T> last) {
return last - first;
}
//
// iterator_next
//
@ -215,15 +206,6 @@ namespace sprout {
iterator_next(sprout::valued_iterator<Iterator, T> const& it) {
return it.next();
}
template<typename Iterator, typename T>
inline SPROUT_CONSTEXPR sprout::valued_iterator<Iterator, T>
iterator_next(
sprout::valued_iterator<Iterator, T> const& it,
typename sprout::valued_iterator<Iterator, T>::difference_type n
)
{
return it + n;
}
//
// iterator_prev
@ -233,15 +215,6 @@ namespace sprout {
iterator_prev(sprout::valued_iterator<Iterator, T> const& it) {
return it.prev();
}
template<typename Iterator, typename T>
inline SPROUT_CONSTEXPR sprout::valued_iterator<Iterator, T>
iterator_prev(
sprout::valued_iterator<Iterator, T> const& it,
typename sprout::valued_iterator<Iterator, T>::difference_type n
)
{
return it - n;
}
} // namespace sprout
#endif // #ifndef SPROUT_ITERATOR_VALUED_ITERATOR_HPP