///////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2006-2014 // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/intrusive for documentation. // ///////////////////////////////////////////////////////////////////////////// #ifndef BOOST_INTRUSIVE_DETAIL_IITERATOR_HPP #define BOOST_INTRUSIVE_DETAIL_IITERATOR_HPP #if defined(_MSC_VER) # pragma once #endif #include #include #include #include #include namespace boost { namespace intrusive { template struct iterator { typedef Category iterator_category; typedef T value_type; typedef Distance difference_type; typedef Pointer pointer; typedef Reference reference; }; template struct iterator_traits { typedef typename Iterator::difference_type difference_type; typedef typename Iterator::value_type value_type; typedef typename Iterator::pointer pointer; typedef typename Iterator::reference reference; typedef typename Iterator::iterator_category iterator_category; }; template struct iterator_traits { typedef std::ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef T& reference; typedef std::random_access_iterator_tag iterator_category; }; template struct iterator_traits { typedef std::ptrdiff_t difference_type; typedef T value_type; typedef const T* pointer; typedef const T& reference; typedef std::random_access_iterator_tag iterator_category; }; template struct value_traits_pointers { typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT (boost::intrusive::detail:: , ValueTraits, value_traits_ptr , typename pointer_traits::template rebind_pointer::type) value_traits_ptr; typedef typename pointer_traits::template rebind_pointer::type const_value_traits_ptr; }; template struct iiterator { typedef ValueTraits value_traits; typedef typename value_traits::node_traits node_traits; typedef typename node_traits::node node; typedef typename node_traits::node_ptr node_ptr; typedef ::boost::intrusive::pointer_traits nodepointer_traits_t; typedef typename nodepointer_traits_t::template rebind_pointer::type void_pointer; typedef typename ValueTraits::value_type value_type; typedef typename ValueTraits::pointer nonconst_pointer; typedef typename ValueTraits::const_pointer yesconst_pointer; typedef typename ::boost::intrusive::pointer_traits ::reference nonconst_reference; typedef typename ::boost::intrusive::pointer_traits ::reference yesconst_reference; typedef typename nodepointer_traits_t::difference_type difference_type; typedef typename detail::if_c ::type pointer; typedef typename detail::if_c ::type reference; typedef iterator < Category , value_type , difference_type , pointer , reference > iterator_traits; typedef typename value_traits_pointers ::value_traits_ptr value_traits_ptr; typedef typename value_traits_pointers ::const_value_traits_ptr const_value_traits_ptr; static const bool stateful_value_traits = detail::is_stateful_value_traits::value; }; template struct iiterator_members { iiterator_members() : nodeptr_()//Value initialization to achieve "null iterators" (N3644) {} iiterator_members(const NodePtr &n_ptr, const StoredPointer &data) : nodeptr_(n_ptr), ptr_(data) {} StoredPointer get_ptr() const { return ptr_; } NodePtr nodeptr_; StoredPointer ptr_; }; template struct iiterator_members { iiterator_members() : nodeptr_()//Value initialization to achieve "null iterators" (N3644) {} iiterator_members(const NodePtr &n_ptr, const StoredPointer &) : nodeptr_(n_ptr) {} StoredPointer get_ptr() const { return StoredPointer(); } NodePtr nodeptr_; }; namespace detail { template inline void advance_impl(InputIt& it, Distance n, const std::input_iterator_tag&) { while(n--) ++it; } template inline void advance_impl(InputIt& it, Distance n, std::forward_iterator_tag &) { while(n--) ++it; } template inline void advance_impl(InputIt& it, Distance n, std::bidirectional_iterator_tag &) { for (; 0 < n; --n) ++it; for (; n < 0; ++n) --it; } template inline void advance_impl(InputIt& it, Distance n, const std::random_access_iterator_tag &) { it += n; } } //namespace detail template inline void iterator_advance(InputIt& it, Distance n) { // increment iterator by offset, arbitrary iterators boost::intrusive::detail::advance_impl(it, n, boost::intrusive::iterator_traits::iterator_category()); } namespace detail{ template inline void distance_impl(InputIt first, InputIt last, Distance& off, const Category &) { while(first != last){ ++off; ++first; } } template inline void distance_impl(InputIt first, InputIt last, Distance& off, const std::random_access_iterator_tag&) { off += last - first; } } //namespace detail template inline typename iterator_traits::difference_type iterator_distance(InputIt first, InputIt last) { typename iterator_traits::difference_type off = 0; boost::intrusive::detail::distance_impl(first, last, off, boost::intrusive::iterator_traits::iterator_category()); return off; } } //namespace intrusive } //namespace boost #endif //BOOST_INTRUSIVE_DETAIL_IITERATOR_HPP