/
tree_node_iterator.cpp
110 lines (94 loc) · 2.5 KB
/
tree_node_iterator.cpp
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
109
/*
Copyright 2004, Richard Cole
This file is part of Griff.
Griff is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your
option) any later version.
Griff is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with Griff; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "tree_node_iterator.h"
#include "tree_node_factory.h"
#include "payload.h"
#include "tree_keys.h"
#include <iostream>
using namespace std;
TreeNodeIterator::TreeNodeIterator(
TreeNodePtr a_node, mmap_file *a_mp)
:
mp(a_mp),
payload_st(0, 0)
{
init(a_node);
};
void TreeNodeIterator::init(TreeNodePtr a_node)
{
node = a_node;
if ( ! a_node.is_null() ) {
while (
node.ptr(mp)->_payload.is_null() &&
(
!node.ptr(mp)->right().is_null() ||
!node.ptr(mp)->right_thread().is_null()
)
)
{
if ( node.ptr(mp)->is_threaded_right() ) {
node = node.ptr(mp)->right_thread();
}
else {
node = node.ptr(mp)->right();
}
}
if ( ! node.ptr(mp)->_payload.is_null() ) {
payload_st.init(
node.ptr(mp)->_payload.ptr(mp),
mmap_getkey(mp, PAYLOAD_SIZE_KEY)
);
decode_interval(payload_st, curr_interval);
assign_eq(curr_tuple, curr_interval.start);
}
else {
cerr << "Internal Error" << endl;
}
}
};
void TreeNodeIterator::next()
{
if ( cmp(curr_tuple, curr_interval.end) < 0 ) {
plus_equals_one(curr_tuple);
}
else {
decode_interval(payload_st, curr_interval);
if ( ::is_null(curr_interval.start) || payload_st.overflow ) {
if ( ! node.ptr(mp)->right().is_null() ) {
TreeNodePtr curr = node.ptr(mp)->right();
while ( ! curr.ptr(mp)->left().is_null() ) curr = curr.ptr(mp)->left();
init(curr);
}
else if ( ! node.ptr(mp)->right_thread().is_null() ) {
init(node.ptr(mp)->right_thread());
}
else {
init(TreeNodePtr::null());
}
}
else {
assign_eq(curr_tuple, curr_interval.start);
};
}
}
void TreeNodeIterator::prev()
{
cerr << "Not implemented yet." << endl;
};
Tuple const& TreeNodeIterator::val()
{
return curr_tuple;
};