@@ -190,29 +190,49 @@ class BTreeBase {
190190 * @return true if a match was found, false if not
191191 */
192192 bool findNext (T& val) {
193- btree_node_t <T, N> node;
194- uint64_t offset;
195-
196- int i = findNearest (val, node, offset);
197- if (i > 0 )
198- i--;
193+ btree_node_t <T, N> node = getRootNode ();
194+ uint64_t offset = getRootOffset ();
195+ bool found = false ;
196+ T best;
199197
200198 while (true ) {
201- if (i < node.header .nElements && compare (node.elements [i], val) >= 0 ) {
202- // Found a valid next value (either equal or next greater)
203- val = node.elements [i];
204- return true ;
199+ int low = 0 ;
200+ int high = node.header .nElements - 1 ;
201+ int midIdx = -1 ;
202+
203+ while (low <= high) {
204+ int mid = (low + high) / 2 ;
205+ int c = compare (node.elements [mid], val);
206+ if (c < 0 ) {
207+ low = mid + 1 ;
208+ } else if (c == 0 ) {
209+ val = node.elements [mid];
210+ return true ;
211+ } else {
212+ midIdx = mid;
213+ high = mid - 1 ;
214+ }
215+ }
216+
217+ if (midIdx != -1 ) {
218+ if (!found || compare (node.elements [midIdx], best) < 0 ) {
219+ best = node.elements [midIdx];
220+ found = true ;
221+ }
205222 }
206223
207- // If this node has no children, there is no next element
208224 if (node.header .nChildren == 0 )
209- return false ;
225+ break ;
210226
211- // Go to the next child
212- offset = node.header .childOffsets [i];
227+ offset = node.header .childOffsets [low];
213228 node = getNode (offset);
214- i = 0 ;
215229 }
230+
231+ if (found) {
232+ val = best;
233+ return true ;
234+ }
235+ return false ;
216236 }
217237
218238 /* *
@@ -279,11 +299,11 @@ class BTreeBase {
279299 int c = compare (node.elements [mid], val);
280300
281301 if (c < 0 )
282- high = mid - 1 ;
302+ low = mid + 1 ;
283303 else if (c == 0 ) {
284304 return mid;
285305 } else
286- low = mid + 1 ;
306+ high = mid - 1 ;
287307 }
288308
289309 if (node.header .nChildren == 0 )
@@ -323,18 +343,18 @@ class BTreeBase {
323343 overwriteNode (offset, node);
324344
325345 } else {
326- btree_node_t <T, N> child = getNode (node.childOffsets [i]);
346+ btree_node_t <T, N> child = getNode (node.header . childOffsets [i]);
327347
328348 if (child.header .nElements == N) {
329349 uint64_t newChildOffset;
330- btree_node_t <T, N> newChild = splitChild (node, child, node.childOffsets [i], newChildOffset);
350+ btree_node_t <T, N> newChild = splitChild (node, child, node.header . childOffsets [i], newChildOffset);
331351 if (compare (node.elements [i], element) <= 0 ) {
332352 child = newChild;
333353 i++;
334354 }
335355 }
336356
337- insertNonFull (child, node.childOffsets [i], element);
357+ insertNonFull (child, node.header . childOffsets [i], element);
338358 }
339359
340360 }
@@ -452,7 +472,7 @@ class BTreeBase {
452472 int scanNode (const btree_node_t <T, N>& node, const T& element) {
453473 int i = 0 ;
454474 for (; i < node.header .nElements ; i++) {
455- if (compare (node.elements [i], element) < = 0 )
475+ if (compare (node.elements [i], element) > = 0 )
456476 break ;
457477 }
458478
0 commit comments