1 /////////////////////////////////////////////////////////////////////////////
2 //
3 // (C) Copyright Ion Gaztanaga  2006-2014
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 //    (See accompanying file LICENSE_1_0.txt or copy at
7 //          http://www.boost.org/LICENSE_1_0.txt)
8 //
9 // See http://www.boost.org/libs/intrusive for documentation.
10 //
11 /////////////////////////////////////////////////////////////////////////////
12 
13 #ifndef BOOST_INTRUSIVE_DETAIL_IITERATOR_HPP
14 #define BOOST_INTRUSIVE_DETAIL_IITERATOR_HPP
15 
16 #ifndef BOOST_CONFIG_HPP
17 #  include <boost/config.hpp>
18 #endif
19 
20 #if defined(BOOST_HAS_PRAGMA_ONCE)
21 #  pragma once
22 #endif
23 
24 #include <boost/intrusive/detail/iterator.hpp>
25 #include <boost/intrusive/pointer_traits.hpp>
26 #include <boost/intrusive/detail/mpl.hpp>
27 #include <boost/intrusive/detail/is_stateful_value_traits.hpp>
28 
29 namespace boost {
30 namespace intrusive {
31 
32 template<class ValueTraits>
33 struct value_traits_pointers
34 {
35    typedef BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT
36       (boost::intrusive::detail::
37       , ValueTraits, value_traits_ptr
38       , typename boost::intrusive::pointer_traits<typename ValueTraits::node_traits::node_ptr>::template
39          rebind_pointer<ValueTraits>::type)   value_traits_ptr;
40 
41    typedef typename boost::intrusive::pointer_traits<value_traits_ptr>::template
42       rebind_pointer<ValueTraits const>::type const_value_traits_ptr;
43 };
44 
45 template<class ValueTraits, bool IsConst, class Category>
46 struct iiterator
47 {
48    typedef ValueTraits                                         value_traits;
49    typedef typename value_traits::node_traits                  node_traits;
50    typedef typename node_traits::node                          node;
51    typedef typename node_traits::node_ptr                      node_ptr;
52    typedef ::boost::intrusive::pointer_traits<node_ptr>        nodepointer_traits_t;
53    typedef typename nodepointer_traits_t::template
54       rebind_pointer<void>::type                               void_pointer;
55    typedef typename ValueTraits::value_type                    value_type;
56    typedef typename ValueTraits::pointer                       nonconst_pointer;
57    typedef typename ValueTraits::const_pointer                 yesconst_pointer;
58    typedef typename ::boost::intrusive::pointer_traits
59       <nonconst_pointer>::reference                            nonconst_reference;
60    typedef typename ::boost::intrusive::pointer_traits
61       <yesconst_pointer>::reference                            yesconst_reference;
62    typedef typename nodepointer_traits_t::difference_type      difference_type;
63    typedef typename detail::if_c
64       <IsConst, yesconst_pointer, nonconst_pointer>::type      pointer;
65    typedef typename detail::if_c
66       <IsConst, yesconst_reference, nonconst_reference>::type  reference;
67    typedef iterator
68          < Category
69          , value_type
70          , difference_type
71          , pointer
72          , reference
73          > iterator_traits;
74    typedef typename value_traits_pointers
75       <ValueTraits>::value_traits_ptr                          value_traits_ptr;
76    typedef typename value_traits_pointers
77       <ValueTraits>::const_value_traits_ptr                    const_value_traits_ptr;
78    static const bool stateful_value_traits =
79       detail::is_stateful_value_traits<value_traits>::value;
80 };
81 
82 template<class NodePtr, class StoredPointer, bool StatefulValueTraits = true>
83 struct iiterator_members
84 {
85 
iiterator_membersboost::intrusive::iiterator_members86    iiterator_members()
87       : nodeptr_()//Value initialization to achieve "null iterators" (N3644)
88    {}
89 
iiterator_membersboost::intrusive::iiterator_members90    iiterator_members(const NodePtr &n_ptr, const StoredPointer &data)
91       :  nodeptr_(n_ptr), ptr_(data)
92    {}
93 
get_ptrboost::intrusive::iiterator_members94    StoredPointer get_ptr() const
95    {  return ptr_;  }
96 
97    NodePtr nodeptr_;
98    StoredPointer ptr_;
99 };
100 
101 template<class NodePtr, class StoredPointer>
102 struct iiterator_members<NodePtr, StoredPointer, false>
103 {
iiterator_membersboost::intrusive::iiterator_members104    iiterator_members()
105       : nodeptr_()//Value initialization to achieve "null iterators" (N3644)
106    {}
107 
iiterator_membersboost::intrusive::iiterator_members108    iiterator_members(const NodePtr &n_ptr, const StoredPointer &)
109       : nodeptr_(n_ptr)
110    {}
111 
get_ptrboost::intrusive::iiterator_members112    StoredPointer get_ptr() const
113    {  return StoredPointer();  }
114 
115    NodePtr nodeptr_;
116 };
117 
118 } //namespace intrusive
119 } //namespace boost
120 
121 #endif //BOOST_INTRUSIVE_DETAIL_IITERATOR_HPP
122