Chris@102: ///////////////////////////////////////////////////////////////////////////// Chris@102: // Chris@102: // (C) Copyright Ion Gaztanaga 2014-2014 Chris@102: // Chris@102: // Distributed under the Boost Software License, Version 1.0. Chris@102: // (See accompanying file LICENSE_1_0.txt or copy at Chris@102: // http://www.boost.org/LICENSE_1_0.txt) Chris@102: // Chris@102: // See http://www.boost.org/libs/intrusive for documentation. Chris@102: // Chris@102: ///////////////////////////////////////////////////////////////////////////// Chris@102: Chris@102: #ifndef BOOST_INTRUSIVE_DETAIL_ITERATOR_HPP Chris@102: #define BOOST_INTRUSIVE_DETAIL_ITERATOR_HPP Chris@102: Chris@102: #ifndef BOOST_CONFIG_HPP Chris@102: # include Chris@102: #endif Chris@102: Chris@102: #if defined(BOOST_HAS_PRAGMA_ONCE) Chris@102: # pragma once Chris@102: #endif Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: namespace boost { Chris@102: namespace intrusive { Chris@102: Chris@102: using boost::movelib::iterator_traits; Chris@102: Chris@102: //////////////////// Chris@102: // iterator Chris@102: //////////////////// Chris@102: template Chris@102: struct iterator Chris@102: { Chris@102: typedef Category iterator_category; Chris@102: typedef T value_type; Chris@102: typedef Distance difference_type; Chris@102: typedef Pointer pointer; Chris@102: typedef Reference reference; Chris@102: }; Chris@102: Chris@102: //////////////////////////////////////// Chris@102: // iterator_[dis|en]able_if_tag Chris@102: //////////////////////////////////////// Chris@102: template Chris@102: struct iterator_enable_if_tag Chris@102: : ::boost::move_detail::enable_if_c Chris@102: < ::boost::move_detail::is_same Chris@102: < typename boost::intrusive::iterator_traits::iterator_category Chris@102: , Tag Chris@102: >::value Chris@102: , R> Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct iterator_disable_if_tag Chris@102: : ::boost::move_detail::enable_if_c Chris@102: < !::boost::move_detail::is_same Chris@102: < typename boost::intrusive::iterator_traits::iterator_category Chris@102: , Tag Chris@102: >::value Chris@102: , R> Chris@102: {}; Chris@102: Chris@102: //////////////////////////////////////// Chris@102: // iterator_[dis|en]able_if_tag_difference_type Chris@102: //////////////////////////////////////// Chris@102: template Chris@102: struct iterator_enable_if_tag_difference_type Chris@102: : iterator_enable_if_tag::difference_type> Chris@102: {}; Chris@102: Chris@102: template Chris@102: struct iterator_disable_if_tag_difference_type Chris@102: : iterator_disable_if_tag::difference_type> Chris@102: {}; Chris@102: Chris@102: //////////////////// Chris@102: // advance Chris@102: //////////////////// Chris@102: template inline Chris@102: typename iterator_enable_if_tag::type Chris@102: iterator_advance(InputIt& it, Distance n) Chris@102: { Chris@102: while(n--) Chris@102: ++it; Chris@102: } Chris@102: Chris@102: template inline Chris@102: typename iterator_enable_if_tag::type Chris@102: iterator_advance(InputIt& it, Distance n) Chris@102: { Chris@102: while(n--) Chris@102: ++it; Chris@102: } Chris@102: Chris@102: template inline Chris@102: typename iterator_enable_if_tag::type Chris@102: iterator_advance(InputIt& it, Distance n) Chris@102: { Chris@102: for (; 0 < n; --n) Chris@102: ++it; Chris@102: for (; n < 0; ++n) Chris@102: --it; Chris@102: } Chris@102: Chris@102: template inline Chris@102: typename iterator_enable_if_tag::type Chris@102: iterator_advance(InputIt& it, Distance n) Chris@102: { Chris@102: it += n; Chris@102: } Chris@102: Chris@102: //////////////////// Chris@102: // distance Chris@102: //////////////////// Chris@102: template inline Chris@102: typename iterator_disable_if_tag_difference_type Chris@102: ::type Chris@102: iterator_distance(InputIt first, InputIt last) Chris@102: { Chris@102: typename iterator_traits::difference_type off = 0; Chris@102: while(first != last){ Chris@102: ++off; Chris@102: ++first; Chris@102: } Chris@102: return off; Chris@102: } Chris@102: Chris@102: template inline Chris@102: typename iterator_enable_if_tag_difference_type Chris@102: ::type Chris@102: iterator_distance(InputIt first, InputIt last) Chris@102: { Chris@102: typename iterator_traits::difference_type off = last - first; Chris@102: return off; Chris@102: } Chris@102: Chris@102: } //namespace intrusive Chris@102: } //namespace boost Chris@102: Chris@102: #endif //BOOST_INTRUSIVE_DETAIL_ITERATOR_HPP