diff --git a/include/boost/iterator/advance.hpp b/include/boost/iterator/advance.hpp index 92af8fbfe..f2b6c722c 100644 --- a/include/boost/iterator/advance.hpp +++ b/include/boost/iterator/advance.hpp @@ -9,6 +9,7 @@ #include #include +#include namespace boost { namespace iterators { @@ -30,10 +31,24 @@ namespace iterators { template 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 + inline BOOST_CXX14_CONSTEXPR void + advance_bidirectional_impl( + BidirectionalIterator& it + , Distance n + , boost::false_type // signed distance ) { if (n >= 0) { @@ -50,6 +65,19 @@ namespace iterators { } } + template + inline BOOST_CXX14_CONSTEXPR void + advance_impl( + BidirectionalIterator& it + , Distance n + , bidirectional_traversal_tag + ) + { + advance_bidirectional_impl( + it, n, typename is_unsigned::type() + ); + } + template inline BOOST_CXX14_CONSTEXPR void advance_impl(