Skip to content

Commit b244cea

Browse files
committed
Optimizations for diffAgainst
1 parent 38816b2 commit b244cea

File tree

2 files changed

+16
-21
lines changed

2 files changed

+16
-21
lines changed

b+tree.js

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -640,14 +640,13 @@ var BTree = /** @class */ (function () {
640640
* @returns true if the step was completed and false if the step would have caused the cursor to move beyond the end of the tree.
641641
*/
642642
BTree.step = function (cursor, stepToNode) {
643-
if (stepToNode === void 0) { stepToNode = false; }
644643
var internalSpine = cursor.internalSpine, levelIndices = cursor.levelIndices, leaf = cursor.leaf;
645-
if (stepToNode || leaf) {
644+
if (stepToNode === true || leaf) {
646645
var levelsLength = levelIndices.length;
647646
// Step to the next node only if:
648647
// - We are explicitly directed to via stepToNode, or
649648
// - There are no key/value pairs left to step to in this leaf
650-
if (stepToNode || levelIndices[levelsLength - 1] === 0) {
649+
if (stepToNode === true || levelIndices[levelsLength - 1] === 0) {
651650
var spineLength = internalSpine.length;
652651
// Root is leaf
653652
if (spineLength === 0)
@@ -656,19 +655,17 @@ var BTree = /** @class */ (function () {
656655
var nodeLevelIndex = spineLength - 1;
657656
var levelIndexWalkBack = nodeLevelIndex;
658657
while (levelIndexWalkBack >= 0) {
659-
var childIndex = levelIndices[levelIndexWalkBack];
660-
if (childIndex > 0) {
658+
if (levelIndices[levelIndexWalkBack] > 0) {
661659
if (levelIndexWalkBack < levelsLength - 1) {
662660
// Remove leaf state from cursor
663661
cursor.leaf = undefined;
664-
levelIndices.splice(levelIndexWalkBack + 1, levelsLength - levelIndexWalkBack);
662+
levelIndices.pop();
665663
}
666-
// If we walked upwards past any internal node, splice them out
664+
// If we walked upwards past any internal node, slice them out
667665
if (levelIndexWalkBack < nodeLevelIndex)
668-
internalSpine.splice(levelIndexWalkBack + 1, spineLength - levelIndexWalkBack);
666+
cursor.internalSpine = internalSpine.slice(0, levelIndexWalkBack + 1);
669667
// Move to new internal node
670-
var nodeIndex = --levelIndices[levelIndexWalkBack];
671-
cursor.currentKey = internalSpine[levelIndexWalkBack][nodeIndex].maxKey();
668+
cursor.currentKey = internalSpine[levelIndexWalkBack][--levelIndices[levelIndexWalkBack]].maxKey();
672669
return true;
673670
}
674671
levelIndexWalkBack--;

b+tree.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -739,14 +739,14 @@ export default class BTree<K=any, V=any> implements ISortedMapF<K,V>, ISortedMap
739739
* @param stepToNode If true, the cursor will be advanced to the next node (skipping values)
740740
* @returns true if the step was completed and false if the step would have caused the cursor to move beyond the end of the tree.
741741
*/
742-
private static step<K, V>(cursor: DiffCursor<K, V>, stepToNode: boolean = false): boolean {
742+
private static step<K, V>(cursor: DiffCursor<K, V>, stepToNode?: boolean): boolean {
743743
const { internalSpine, levelIndices, leaf } = cursor;
744-
if (stepToNode || leaf) {
744+
if (stepToNode === true || leaf) {
745745
const levelsLength = levelIndices.length;
746746
// Step to the next node only if:
747747
// - We are explicitly directed to via stepToNode, or
748748
// - There are no key/value pairs left to step to in this leaf
749-
if (stepToNode || levelIndices[levelsLength - 1] === 0) {
749+
if (stepToNode === true || levelIndices[levelsLength - 1] === 0) {
750750
const spineLength = internalSpine.length;
751751
// Root is leaf
752752
if (spineLength === 0)
@@ -755,19 +755,17 @@ export default class BTree<K=any, V=any> implements ISortedMapF<K,V>, ISortedMap
755755
const nodeLevelIndex = spineLength - 1;
756756
let levelIndexWalkBack = nodeLevelIndex;
757757
while (levelIndexWalkBack >= 0) {
758-
const childIndex = levelIndices[levelIndexWalkBack]
759-
if (childIndex > 0) {
758+
if (levelIndices[levelIndexWalkBack] > 0) {
760759
if (levelIndexWalkBack < levelsLength - 1) {
761760
// Remove leaf state from cursor
762761
cursor.leaf = undefined;
763-
levelIndices.splice(levelIndexWalkBack + 1, levelsLength - levelIndexWalkBack);
762+
levelIndices.pop();
764763
}
765-
// If we walked upwards past any internal node, splice them out
764+
// If we walked upwards past any internal node, slice them out
766765
if (levelIndexWalkBack < nodeLevelIndex)
767-
internalSpine.splice(levelIndexWalkBack + 1, spineLength - levelIndexWalkBack);
766+
cursor.internalSpine = internalSpine.slice(0, levelIndexWalkBack + 1);
768767
// Move to new internal node
769-
const nodeIndex = --levelIndices[levelIndexWalkBack];
770-
cursor.currentKey = internalSpine[levelIndexWalkBack][nodeIndex].maxKey();
768+
cursor.currentKey = internalSpine[levelIndexWalkBack][--levelIndices[levelIndexWalkBack]].maxKey();
771769
return true;
772770
}
773771
levelIndexWalkBack--;
@@ -1680,7 +1678,7 @@ class BNodeInternal<K,V> extends BNode<K,V> {
16801678
* - Leaf is only populated if the cursor points to a KVP. If this is the case, levelIndices.length === internalSpine.length + 1
16811679
* and levelIndices[levelIndices.length - 1] is the index of the value.
16821680
*/
1683-
type DiffCursor<K,V> = { height: number, internalSpine: BNode<K,V>[][], levelIndices: number[], leaf: BNode<K,V> | undefined, currentKey: K };
1681+
type DiffCursor<K,V> = { height: number, internalSpine: BNode<K,V>[][], levelIndices: number[], leaf: BNode<K,V> | undefined, currentKey: K };
16841682

16851683
// Optimization: this array of `undefined`s is used instead of a normal
16861684
// array of values in nodes where `undefined` is the only value.

0 commit comments

Comments
 (0)