29
29
#include < memory>
30
30
31
31
#define BLOCKSIZE 4096
32
- #define T 255
32
+ #define T 255
33
33
#define LEAF 0x0001
34
34
#define ONDISK 0x0002
35
35
@@ -104,16 +104,11 @@ namespace alg {
104
104
*/
105
105
int32_t search (node x, int32_t k) {
106
106
int32_t i = 0 ;
107
- while (i<x->n && ( k > x->key [i]) ) i++;
107
+ while (i<x->n && k > x->key [i]) i++;
108
108
109
109
if (i<x->n && k == x->key [i]) {
110
110
return i;
111
111
} else if (x->flag & LEAF) {
112
- int c;
113
- for (c=0 ;c<x->n ;c++) {
114
- printf (" %d " , x->key [c]);
115
- }
116
- printf (" [%d]\n " , x->key [i]);
117
112
return -1 ;
118
113
} else {
119
114
std::auto_ptr<node_t > xi (READ (x, i));
@@ -156,7 +151,11 @@ namespace alg {
156
151
*/
157
152
void * allocate_node () {
158
153
node x = (node)malloc (sizeof (node_t ));
159
- memset (x, 0 , sizeof (node_t ));
154
+ x->n = 0 ;
155
+ x->offset = 0 ;
156
+ x->flag = 0 ;
157
+ memset (x->key , 0 , sizeof (x->key ));
158
+ memset (x->c , 0 , sizeof (x->c ));
160
159
return x;
161
160
}
162
161
@@ -166,7 +165,11 @@ namespace alg {
166
165
void split_child (node x, int32_t i) {
167
166
std::auto_ptr<node_t > z ((node)allocate_node ());
168
167
std::auto_ptr<node_t > y (READ (x, i));
168
+ z->flag &= ~LEAF;
169
169
z->flag |= (y->flag & LEAF);
170
+ printf (" leafz:%x\n " , z->flag );
171
+ printf (" leafy:%x\n " , y->flag );
172
+ printf (" leafx:%x offset:%x\n " , x->flag , x->offset );
170
173
z->n = T - 1 ;
171
174
172
175
int32_t j;
@@ -185,8 +188,10 @@ namespace alg {
185
188
WRITE (z.get ());
186
189
187
190
for (j=x->n ;j>=i+1 ;j--) {
188
- x->c [j+1 ] = x->c [j]; // right shift
191
+ x->c [j+1 ] = x->c [j]; // shift
189
192
}
193
+
194
+ // save z
190
195
x->c [i+1 ] = z->offset ;
191
196
192
197
for (j=x->n -1 ;j>=i;j--) {
0 commit comments