1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #ifndef BOOST_ITERATOR_ADVANCE_HPP
- #define BOOST_ITERATOR_ADVANCE_HPP
- #include <boost/config.hpp>
- #include <boost/detail/workaround.hpp>
- #include <boost/iterator/iterator_categories.hpp>
- namespace boost {
- namespace iterators {
- namespace detail {
- template <typename InputIterator, typename Distance>
- inline BOOST_CXX14_CONSTEXPR void
- advance_impl(
- InputIterator& it
- , Distance n
- , incrementable_traversal_tag
- )
- {
- while (n > 0) {
- ++it;
- --n;
- }
- }
- #if BOOST_WORKAROUND(BOOST_GCC_VERSION, >= 40600)
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wtype-limits"
- #endif
- template <typename BidirectionalIterator, typename Distance>
- inline BOOST_CXX14_CONSTEXPR void
- advance_impl(
- BidirectionalIterator& it
- , Distance n
- , bidirectional_traversal_tag
- )
- {
- if (n >= 0) {
- while (n > 0) {
- ++it;
- --n;
- }
- }
- else {
- while (n < 0) {
- --it;
- ++n;
- }
- }
- }
- #if BOOST_WORKAROUND(BOOST_GCC_VERSION, >= 40600)
- #pragma GCC diagnostic pop
- #endif
- template <typename RandomAccessIterator, typename Distance>
- inline BOOST_CXX14_CONSTEXPR void
- advance_impl(
- RandomAccessIterator& it
- , Distance n
- , random_access_traversal_tag
- )
- {
- it += n;
- }
- }
- namespace advance_adl_barrier {
- template <typename InputIterator, typename Distance>
- inline BOOST_CXX14_CONSTEXPR void
- advance(InputIterator& it, Distance n)
- {
- detail::advance_impl(
- it, n, typename iterator_traversal<InputIterator>::type()
- );
- }
- }
- using namespace advance_adl_barrier;
- }
- using namespace iterators::advance_adl_barrier;
- }
- #endif
|