Chris@102
|
1 /////////////////////////////////////////////////////////////////////////////
|
Chris@102
|
2 //
|
Chris@102
|
3 // (C) Copyright Ion Gaztanaga 2007-2013
|
Chris@102
|
4 //
|
Chris@102
|
5 // Distributed under the Boost Software License, Version 1.0.
|
Chris@102
|
6 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@102
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@102
|
8 //
|
Chris@102
|
9 // See http://www.boost.org/libs/intrusive for documentation.
|
Chris@102
|
10 //
|
Chris@102
|
11 /////////////////////////////////////////////////////////////////////////////
|
Chris@102
|
12
|
Chris@102
|
13 #ifndef BOOST_INTRUSIVE_TREE_ITERATOR_HPP
|
Chris@102
|
14 #define BOOST_INTRUSIVE_TREE_ITERATOR_HPP
|
Chris@102
|
15
|
Chris@102
|
16 #ifndef BOOST_CONFIG_HPP
|
Chris@102
|
17 # include <boost/config.hpp>
|
Chris@102
|
18 #endif
|
Chris@102
|
19
|
Chris@102
|
20 #if defined(BOOST_HAS_PRAGMA_ONCE)
|
Chris@102
|
21 # pragma once
|
Chris@102
|
22 #endif
|
Chris@102
|
23
|
Chris@102
|
24 #include <boost/intrusive/detail/config_begin.hpp>
|
Chris@102
|
25 #include <boost/intrusive/detail/std_fwd.hpp>
|
Chris@102
|
26 #include <boost/intrusive/detail/iiterator.hpp>
|
Chris@102
|
27 #include <boost/intrusive/detail/bstree_algorithms_base.hpp>
|
Chris@102
|
28
|
Chris@102
|
29 namespace boost {
|
Chris@102
|
30 namespace intrusive {
|
Chris@102
|
31
|
Chris@102
|
32 /////////////////////////////////////////////////////////////////////////////
|
Chris@102
|
33 // //
|
Chris@102
|
34 // Implementation of the tree iterator //
|
Chris@102
|
35 // //
|
Chris@102
|
36 /////////////////////////////////////////////////////////////////////////////
|
Chris@102
|
37
|
Chris@102
|
38 // tree_iterator provides some basic functions for a
|
Chris@102
|
39 // node oriented bidirectional iterator:
|
Chris@102
|
40 template<class ValueTraits, bool IsConst>
|
Chris@102
|
41 class tree_iterator
|
Chris@102
|
42 {
|
Chris@102
|
43 protected:
|
Chris@102
|
44 typedef iiterator< ValueTraits, IsConst
|
Chris@102
|
45 , std::bidirectional_iterator_tag> types_t;
|
Chris@102
|
46
|
Chris@102
|
47 typedef ValueTraits value_traits;
|
Chris@102
|
48 typedef typename types_t::node_traits node_traits;
|
Chris@102
|
49
|
Chris@102
|
50 typedef typename types_t::node node;
|
Chris@102
|
51 typedef typename types_t::node_ptr node_ptr;
|
Chris@102
|
52 typedef typename types_t::const_value_traits_ptr const_value_traits_ptr;
|
Chris@102
|
53 typedef bstree_algorithms_base<node_traits> node_algorithms;
|
Chris@102
|
54
|
Chris@102
|
55 static const bool stateful_value_traits = types_t::stateful_value_traits;
|
Chris@102
|
56
|
Chris@102
|
57 void unspecified_bool_type_func() const {}
|
Chris@102
|
58 typedef void (tree_iterator::*unspecified_bool_type)() const;
|
Chris@102
|
59
|
Chris@102
|
60 public:
|
Chris@102
|
61 typedef typename types_t::iterator_traits::difference_type difference_type;
|
Chris@102
|
62 typedef typename types_t::iterator_traits::value_type value_type;
|
Chris@102
|
63 typedef typename types_t::iterator_traits::pointer pointer;
|
Chris@102
|
64 typedef typename types_t::iterator_traits::reference reference;
|
Chris@102
|
65 typedef typename types_t::iterator_traits::iterator_category iterator_category;
|
Chris@102
|
66
|
Chris@102
|
67 tree_iterator()
|
Chris@102
|
68 {}
|
Chris@102
|
69
|
Chris@102
|
70 explicit tree_iterator(const node_ptr & nodeptr, const const_value_traits_ptr &traits_ptr)
|
Chris@102
|
71 : members_(nodeptr, traits_ptr)
|
Chris@102
|
72 {}
|
Chris@102
|
73
|
Chris@102
|
74 tree_iterator(tree_iterator<value_traits, false> const& other)
|
Chris@102
|
75 : members_(other.pointed_node(), other.get_value_traits())
|
Chris@102
|
76 {}
|
Chris@102
|
77
|
Chris@102
|
78 const node_ptr &pointed_node() const
|
Chris@102
|
79 { return members_.nodeptr_; }
|
Chris@102
|
80
|
Chris@102
|
81 tree_iterator &operator=(const node_ptr &nodeptr)
|
Chris@102
|
82 { members_.nodeptr_ = nodeptr; return static_cast<tree_iterator&>(*this); }
|
Chris@102
|
83
|
Chris@102
|
84 public:
|
Chris@102
|
85 tree_iterator& operator++()
|
Chris@102
|
86 {
|
Chris@102
|
87 members_.nodeptr_ = node_algorithms::next_node(members_.nodeptr_);
|
Chris@102
|
88 return static_cast<tree_iterator&> (*this);
|
Chris@102
|
89 }
|
Chris@102
|
90
|
Chris@102
|
91 tree_iterator operator++(int)
|
Chris@102
|
92 {
|
Chris@102
|
93 tree_iterator result (*this);
|
Chris@102
|
94 members_.nodeptr_ = node_algorithms::next_node(members_.nodeptr_);
|
Chris@102
|
95 return result;
|
Chris@102
|
96 }
|
Chris@102
|
97
|
Chris@102
|
98 tree_iterator& operator--()
|
Chris@102
|
99 {
|
Chris@102
|
100 members_.nodeptr_ = node_algorithms::prev_node(members_.nodeptr_);
|
Chris@102
|
101 return static_cast<tree_iterator&> (*this);
|
Chris@102
|
102 }
|
Chris@102
|
103
|
Chris@102
|
104 tree_iterator operator--(int)
|
Chris@102
|
105 {
|
Chris@102
|
106 tree_iterator result (*this);
|
Chris@102
|
107 members_.nodeptr_ = node_algorithms::prev_node(members_.nodeptr_);
|
Chris@102
|
108 return result;
|
Chris@102
|
109 }
|
Chris@102
|
110
|
Chris@102
|
111 void go_left()
|
Chris@102
|
112 { members_.nodeptr_ = node_traits::get_left(members_.nodeptr_); }
|
Chris@102
|
113
|
Chris@102
|
114 void go_right()
|
Chris@102
|
115 { members_.nodeptr_ = node_traits::get_right(members_.nodeptr_); }
|
Chris@102
|
116
|
Chris@102
|
117 void go_parent()
|
Chris@102
|
118 { members_.nodeptr_ = node_traits::get_parent(members_.nodeptr_); }
|
Chris@102
|
119
|
Chris@102
|
120 operator unspecified_bool_type() const
|
Chris@102
|
121 { return members_.nodeptr_ ? &tree_iterator::unspecified_bool_type_func : 0; }
|
Chris@102
|
122
|
Chris@102
|
123 bool operator! () const
|
Chris@102
|
124 { return !members_.nodeptr_; }
|
Chris@102
|
125
|
Chris@102
|
126 friend bool operator== (const tree_iterator& l, const tree_iterator& r)
|
Chris@102
|
127 { return l.pointed_node() == r.pointed_node(); }
|
Chris@102
|
128
|
Chris@102
|
129 friend bool operator!= (const tree_iterator& l, const tree_iterator& r)
|
Chris@102
|
130 { return !(l == r); }
|
Chris@102
|
131
|
Chris@102
|
132 reference operator*() const
|
Chris@102
|
133 { return *operator->(); }
|
Chris@102
|
134
|
Chris@102
|
135 pointer operator->() const
|
Chris@102
|
136 { return this->operator_arrow(detail::bool_<stateful_value_traits>()); }
|
Chris@102
|
137
|
Chris@102
|
138 const_value_traits_ptr get_value_traits() const
|
Chris@102
|
139 { return members_.get_ptr(); }
|
Chris@102
|
140
|
Chris@102
|
141 tree_iterator end_iterator_from_it() const
|
Chris@102
|
142 {
|
Chris@102
|
143 return tree_iterator(node_algorithms::get_header(this->pointed_node()), this->get_value_traits());
|
Chris@102
|
144 }
|
Chris@102
|
145
|
Chris@102
|
146 tree_iterator<value_traits, false> unconst() const
|
Chris@102
|
147 { return tree_iterator<value_traits, false>(this->pointed_node(), this->get_value_traits()); }
|
Chris@102
|
148
|
Chris@102
|
149 private:
|
Chris@102
|
150 pointer operator_arrow(detail::false_) const
|
Chris@102
|
151 { return ValueTraits::to_value_ptr(members_.nodeptr_); }
|
Chris@102
|
152
|
Chris@102
|
153 pointer operator_arrow(detail::true_) const
|
Chris@102
|
154 { return this->get_value_traits()->to_value_ptr(members_.nodeptr_); }
|
Chris@102
|
155
|
Chris@102
|
156 iiterator_members<node_ptr, const_value_traits_ptr, stateful_value_traits> members_;
|
Chris@102
|
157 };
|
Chris@102
|
158
|
Chris@102
|
159 } //namespace intrusive
|
Chris@102
|
160 } //namespace boost
|
Chris@102
|
161
|
Chris@102
|
162 #include <boost/intrusive/detail/config_end.hpp>
|
Chris@102
|
163
|
Chris@102
|
164 #endif //BOOST_INTRUSIVE_TREE_ITERATOR_HPP
|