Skip to content

Commit

Permalink
split advance_impl for bidirectional iterators
Browse files Browse the repository at this point in the history
Split according to signedness/unsignedness of Distance, as the checks "if (n >= 0)"
and "while (n < 0)" produce type-limits warnings in GCC 4.6-7 when n is unsigned.
  • Loading branch information
joaquintides committed Aug 31, 2021
1 parent 72a7fb1 commit 2f345ff
Showing 1 changed file with 30 additions and 2 deletions.
32 changes: 30 additions & 2 deletions include/boost/iterator/advance.hpp
Expand Up @@ -9,6 +9,7 @@

#include <boost/config.hpp>
#include <boost/iterator/iterator_categories.hpp>
#include <boost/type_traits/is_unsigned.hpp>

namespace boost {
namespace iterators {
Expand All @@ -30,10 +31,24 @@ namespace iterators {

template <typename BidirectionalIterator, typename Distance>
inline BOOST_CXX14_CONSTEXPR void
advance_impl(
advance_bidirectional_impl(
BidirectionalIterator& it
, Distance n
, bidirectional_traversal_tag
, boost::true_type // unsigned distance
)
{
while (n > 0) {
++it;
--n;
}
}

template <typename BidirectionalIterator, typename Distance>
inline BOOST_CXX14_CONSTEXPR void
advance_bidirectional_impl(
BidirectionalIterator& it
, Distance n
, boost::false_type // signed distance
)
{
if (n >= 0) {
Expand All @@ -50,6 +65,19 @@ namespace iterators {
}
}

template <typename BidirectionalIterator, typename Distance>
inline BOOST_CXX14_CONSTEXPR void
advance_impl(
BidirectionalIterator& it
, Distance n
, bidirectional_traversal_tag
)
{
advance_bidirectional_impl(
it, n, typename is_unsigned<Distance>::type()
);
}

template <typename RandomAccessIterator, typename Distance>
inline BOOST_CXX14_CONSTEXPR void
advance_impl(
Expand Down

0 comments on commit 2f345ff

Please sign in to comment.