13 #ifndef STXXL_CONTAINERS_BTREE__ITERATOR_H
14 #define STXXL_CONTAINERS_BTREE__ITERATOR_H
18 #include <stxxl/bits/verbose.h>
21 __STXXL_BEGIN_NAMESPACE
26 template <
class BTreeType>
28 template <
class BTreeType>
30 template <
class BTreeType>
31 class btree_const_iterator;
32 template <
class KeyType_,
class DataType_,
class KeyCmp_,
unsigned LogNElem_,
class BTreeType>
35 template <
class BTreeType>
36 class btree_iterator_base
39 typedef BTreeType btree_type;
40 typedef typename btree_type::leaf_bid_type bid_type;
41 typedef typename btree_type::value_type value_type;
42 typedef typename btree_type::reference reference;
43 typedef typename btree_type::const_reference const_reference;
44 typedef std::bidirectional_iterator_tag iterator_category;
45 typedef typename btree_type::difference_type difference_type;
47 friend class iterator_map<btree_type>;
48 template <
class KeyType_,
class DataType_,
49 class KeyCmp_,
unsigned LogNElem_,
class BTreeType__>
50 friend class normal_leaf;
52 template <
class BTreeType_>
53 friend bool operator == (
const btree_iterator<BTreeType_> & a,
54 const btree_const_iterator<BTreeType_> & b);
55 template <
class BTreeType_>
56 friend bool operator != (
const btree_iterator<BTreeType_> & a,
57 const btree_const_iterator<BTreeType_> & b);
66 STXXL_VERBOSE3(
"btree_iterator_base def construct addr=" <<
this);
74 ) : btree_(btree__), bid(b), pos(p)
76 STXXL_VERBOSE3(
"btree_iterator_base parameter construct addr=" <<
this);
77 btree_->iterator_map_.register_iterator(*
this);
85 btree_iterator_base(
const btree_iterator_base & obj)
87 STXXL_VERBOSE3(
"btree_iterator_base constr from" << (&obj) <<
" to " <<
this);
92 btree_->iterator_map_.register_iterator(*
this);
95 btree_iterator_base & operator = (
const btree_iterator_base & obj)
97 STXXL_VERBOSE3(
"btree_iterator_base copy from" << (&obj) <<
" to " <<
this);
101 btree_->iterator_map_.unregister_iterator(*
this);
107 btree_->iterator_map_.register_iterator(*
this);
112 reference non_const_access()
115 typename btree_type::leaf_type * Leaf = btree_->leaf_cache_.get_node(bid);
117 return (reference)((*Leaf)[pos]);
120 const_reference const_access()
const
123 typename btree_type::leaf_type
const * Leaf = btree_->leaf_cache_.get_const_node(bid);
125 return (reference)((*Leaf)[pos]);
128 bool operator == (
const btree_iterator_base & obj)
const
130 return bid == obj.bid && pos == obj.pos && btree_ == obj.btree_;
133 bool operator != (
const btree_iterator_base & obj)
const
135 return bid != obj.bid || pos != obj.pos || btree_ != obj.btree_;
138 btree_iterator_base & increment()
141 bid_type cur_bid = bid;
142 typename btree_type::leaf_type
const * Leaf = btree_->leaf_cache_.get_const_node(bid,
true);
144 Leaf->increment_iterator(*
this);
145 btree_->leaf_cache_.unfix_node(cur_bid);
149 btree_iterator_base & decrement()
152 bid_type cur_bid = bid;
153 typename btree_type::leaf_type
const * Leaf = btree_->leaf_cache_.get_const_node(bid,
true);
155 Leaf->decrement_iterator(*
this);
156 btree_->leaf_cache_.unfix_node(cur_bid);
161 virtual ~btree_iterator_base()
163 STXXL_VERBOSE3(
"btree_iterator_base deconst " <<
this);
165 btree_->iterator_map_.unregister_iterator(*
this);
169 template <
class BTreeType>
170 class btree_iterator :
public btree_iterator_base<BTreeType>
173 typedef BTreeType btree_type;
174 typedef typename btree_type::leaf_bid_type bid_type;
175 typedef typename btree_type::value_type value_type;
176 typedef typename btree_type::reference reference;
177 typedef typename btree_type::const_reference const_reference;
178 typedef typename btree_type::pointer pointer;
180 template <
class KeyType_,
class DataType_,
181 class KeyCmp_,
unsigned LogNElem_,
class BTreeType__>
182 friend class normal_leaf;
184 using btree_iterator_base<btree_type>::non_const_access;
186 btree_iterator() : btree_iterator_base<btree_type>()
189 btree_iterator(
const btree_iterator & obj) :
190 btree_iterator_base<btree_type>(obj)
193 btree_iterator & operator = (
const btree_iterator & obj)
195 btree_iterator_base<btree_type>::operator = (obj);
199 reference operator * ()
201 return non_const_access();
204 pointer operator -> ()
206 return &(non_const_access());
209 bool operator == (
const btree_iterator & obj)
const
211 return btree_iterator_base<btree_type>::operator == (obj);
214 bool operator != (
const btree_iterator & obj)
const
216 return btree_iterator_base<btree_type>::operator != (obj);
219 btree_iterator & operator ++ ()
221 assert(*
this != btree_iterator_base<btree_type>::btree_->end());
222 btree_iterator_base<btree_type>::increment();
226 btree_iterator & operator -- ()
228 btree_iterator_base<btree_type>::decrement();
232 btree_iterator operator ++ (
int)
234 assert(*
this != btree_iterator_base<btree_type>::btree_->end());
235 btree_iterator result(*
this);
236 btree_iterator_base<btree_type>::increment();
240 btree_iterator operator -- (
int)
242 btree_iterator result(*
this);
243 btree_iterator_base<btree_type>::decrement();
249 btree_type * btree__,
252 ) : btree_iterator_base<btree_type>(btree__, b, p)
256 template <
class BTreeType>
257 class btree_const_iterator :
public btree_iterator_base<BTreeType>
260 typedef btree_iterator<BTreeType> iterator;
262 typedef BTreeType btree_type;
263 typedef typename btree_type::leaf_bid_type bid_type;
264 typedef typename btree_type::value_type value_type;
265 typedef typename btree_type::const_reference reference;
266 typedef typename btree_type::const_pointer pointer;
268 template <
class KeyType_,
class DataType_,
269 class KeyCmp_,
unsigned LogNElem_,
class BTreeType__>
270 friend class normal_leaf;
272 using btree_iterator_base<btree_type>::const_access;
274 btree_const_iterator() : btree_iterator_base<btree_type>()
277 btree_const_iterator(
const btree_const_iterator & obj) :
278 btree_iterator_base<btree_type>(obj)
281 btree_const_iterator(
const iterator & obj) :
282 btree_iterator_base<btree_type>(obj)
285 btree_const_iterator & operator = (
const btree_const_iterator & obj)
287 btree_iterator_base<btree_type>::operator = (obj);
291 reference operator * ()
293 return const_access();
296 pointer operator -> ()
298 return &(const_access());
302 bool operator == (
const iterator & obj)
const
304 return btree_iterator_base<btree_type>::operator == (obj);
307 bool operator != (
const iterator & obj)
const
309 return btree_iterator_base<btree_type>::operator != (obj);
312 bool operator == (
const btree_const_iterator & obj)
const
314 return btree_iterator_base<btree_type>::operator == (obj);
317 bool operator != (
const btree_const_iterator & obj)
const
319 return btree_iterator_base<btree_type>::operator != (obj);
322 btree_const_iterator & operator ++ ()
324 assert(*
this != btree_iterator_base<btree_type>::btree_->end());
325 btree_iterator_base<btree_type>::increment();
329 btree_const_iterator & operator -- ()
331 btree_iterator_base<btree_type>::decrement();
335 btree_const_iterator operator ++ (
int)
337 assert(*
this != btree_iterator_base<btree_type>::btree_->end());
338 btree_const_iterator result(*
this);
339 btree_iterator_base<btree_type>::increment();
343 btree_const_iterator operator -- (
int)
345 btree_const_iterator result(*
this);
346 btree_iterator_base<btree_type>::decrement();
351 btree_const_iterator(
352 btree_type * btree__,
355 ) : btree_iterator_base<btree_type>(btree__, b, p)
359 template <
class BTreeType>
360 inline bool operator == (
const btree_iterator<BTreeType> & a,
361 const btree_const_iterator<BTreeType> & b)
363 return a.btree_iterator_base<BTreeType>::operator == (b);
366 template <
class BTreeType>
367 inline bool operator != (
const btree_iterator<BTreeType> & a,
368 const btree_const_iterator<BTreeType> & b)
370 return a.btree_iterator_base<BTreeType>::operator != (b);
374 __STXXL_END_NAMESPACE