-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbtree_iterator.h
108 lines (96 loc) · 2.73 KB
/
btree_iterator.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#ifndef BTREE_ITERATOR_H
#define BTREE_ITERATOR_H
#include <iterator>
using namespace std;
template <typename T> class btree;
template <typename T> class const_btree_iterator;
template <typename T> class btree_iterator;
template <typename T>
class btree_iterator{
public:
typedef ptrdiff_t difference_type;
typedef bidirectional_iterator_tag iterator_category;
typedef T value_type;
typedef T* pointer;
typedef T& reference;
friend const_btree_iterator<T>;
friend bool operator==(const btree_iterator<T> lhs, const btree_iterator<T> rhs){
if( lhs._root != rhs._root){
return false;
}
if( lhs._pTree == rhs._pTree && lhs._index == rhs._index){
return true;
}
return false;
}
friend bool operator!=(const btree_iterator<T> lhs, const btree_iterator<T> rhs){
return !(lhs == rhs);
}
reference operator*() const;
pointer operator->() const;
btree_iterator& operator++();
btree_iterator& operator--();
btree_iterator operator++(int);
btree_iterator operator--(int);
// begin();
btree_iterator( btree<T>* root);
// find();
btree_iterator( btree<T>* pTree, size_t index);
private:
bool goLeft();
bool goRight();
btree<T>* _pTree;
btree<T>* _root;
size_t _index;
};
/**
*
* Const iterator
*
*/
template <typename T>
class const_btree_iterator{
public:
typedef ptrdiff_t difference_type;
typedef bidirectional_iterator_tag iterator_category;
typedef T value_type;
typedef const T* pointer;
typedef const T& reference;
friend bool operator==(const const_btree_iterator<T> lhs, const const_btree_iterator<T> rhs){
if( lhs._root != rhs._root){
return false;
}
if( lhs._pTree == rhs._pTree && lhs._index == rhs._index){
return true;
}
return false;
}
friend bool operator!=(const const_btree_iterator<T> lhs, const const_btree_iterator<T> rhs){
return !(lhs == rhs);
}
reference operator*() const;
pointer operator->() const;
const_btree_iterator& operator++();
const_btree_iterator& operator--();
const_btree_iterator operator++(int);
const_btree_iterator operator--(int);
// begin();
const_btree_iterator( const btree<T>* root);
// find();
const_btree_iterator( const btree<T>* pTree, size_t index);
const_btree_iterator( const btree_iterator<T>& it );
private:
bool goLeft();
bool goRight();
const btree<T>* _pTree;
const btree<T>* _root;
size_t _index;
};
/**
* You MUST implement the btree iterators as (an) external class(es) in this file.
* Failure to do so will result in a total mark of 0 for this deliverable.
**/
// iterator related interface stuff here; would be nice if you called your
// iterator class btree_iterator (and possibly const_btree_iterator)
#include "btree_iterator.tem"
#endif