123 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| //
 | |
| // (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
 | |
| 
 | |
| #ifndef BOOST_CONFIG_HPP
 | |
| #  include <boost/config.hpp>
 | |
| #endif
 | |
| 
 | |
| #if defined(BOOST_HAS_PRAGMA_ONCE)
 | |
| #  pragma once
 | |
| #endif
 | |
| 
 | |
| #include <boost/intrusive/detail/workaround.hpp>
 | |
| #include <boost/intrusive/detail/iterator.hpp>
 | |
| #include <boost/intrusive/pointer_traits.hpp>
 | |
| #include <boost/intrusive/detail/mpl.hpp>
 | |
| #include <boost/intrusive/detail/is_stateful_value_traits.hpp>
 | |
| 
 | |
| namespace boost {
 | |
| namespace intrusive {
 | |
| 
 | |
| template<class ValueTraits>
 | |
| struct value_traits_pointers
 | |
| {
 | |
|    typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT
 | |
|       (boost::intrusive::detail::
 | |
|       , ValueTraits, value_traits_ptr
 | |
|       , typename boost::intrusive::pointer_traits<typename ValueTraits::node_traits::node_ptr>::template
 | |
|          rebind_pointer<ValueTraits>::type)   value_traits_ptr;
 | |
| 
 | |
|    typedef typename boost::intrusive::pointer_traits<value_traits_ptr>::template
 | |
|       rebind_pointer<ValueTraits const>::type const_value_traits_ptr;
 | |
| };
 | |
| 
 | |
| template<class ValueTraits, bool IsConst, class Category>
 | |
| 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<node_ptr>        nodepointer_traits_t;
 | |
|    typedef typename nodepointer_traits_t::template
 | |
|       rebind_pointer<void>::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
 | |
|       <nonconst_pointer>::reference                            nonconst_reference;
 | |
|    typedef typename ::boost::intrusive::pointer_traits
 | |
|       <yesconst_pointer>::reference                            yesconst_reference;
 | |
|    typedef typename nodepointer_traits_t::difference_type      difference_type;
 | |
|    typedef typename detail::if_c
 | |
|       <IsConst, yesconst_pointer, nonconst_pointer>::type      pointer;
 | |
|    typedef typename detail::if_c
 | |
|       <IsConst, yesconst_reference, nonconst_reference>::type  reference;
 | |
|    typedef iterator
 | |
|          < Category
 | |
|          , value_type
 | |
|          , difference_type
 | |
|          , pointer
 | |
|          , reference
 | |
|          > iterator_type;
 | |
|    typedef typename value_traits_pointers
 | |
|       <ValueTraits>::value_traits_ptr                          value_traits_ptr;
 | |
|    typedef typename value_traits_pointers
 | |
|       <ValueTraits>::const_value_traits_ptr                    const_value_traits_ptr;
 | |
|    static const bool stateful_value_traits =
 | |
|       detail::is_stateful_value_traits<value_traits>::value;
 | |
| };
 | |
| 
 | |
| template<class NodePtr, class StoredPointer, bool StatefulValueTraits = true>
 | |
| struct iiterator_members
 | |
| {
 | |
| 
 | |
|    BOOST_INTRUSIVE_FORCEINLINE iiterator_members()
 | |
|       : nodeptr_()//Value initialization to achieve "null iterators" (N3644)
 | |
|    {}
 | |
| 
 | |
|    BOOST_INTRUSIVE_FORCEINLINE iiterator_members(const NodePtr &n_ptr, const StoredPointer &data)
 | |
|       :  nodeptr_(n_ptr), ptr_(data)
 | |
|    {}
 | |
| 
 | |
|    BOOST_INTRUSIVE_FORCEINLINE StoredPointer get_ptr() const
 | |
|    {  return ptr_;  }
 | |
| 
 | |
|    NodePtr nodeptr_;
 | |
|    StoredPointer ptr_;
 | |
| };
 | |
| 
 | |
| template<class NodePtr, class StoredPointer>
 | |
| struct iiterator_members<NodePtr, StoredPointer, false>
 | |
| {
 | |
|    BOOST_INTRUSIVE_FORCEINLINE iiterator_members()
 | |
|       : nodeptr_()//Value initialization to achieve "null iterators" (N3644)
 | |
|    {}
 | |
| 
 | |
|    BOOST_INTRUSIVE_FORCEINLINE iiterator_members(const NodePtr &n_ptr, const StoredPointer &)
 | |
|       : nodeptr_(n_ptr)
 | |
|    {}
 | |
| 
 | |
|    BOOST_INTRUSIVE_FORCEINLINE StoredPointer get_ptr() const
 | |
|    {  return StoredPointer();  }
 | |
| 
 | |
|    NodePtr nodeptr_;
 | |
| };
 | |
| 
 | |
| } //namespace intrusive
 | |
| } //namespace boost
 | |
| 
 | |
| #endif //BOOST_INTRUSIVE_DETAIL_IITERATOR_HPP
 | 
