diff --git a/ConflictSet.cpp b/ConflictSet.cpp index 8eba726..5d11e62 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -1808,13 +1808,15 @@ void eraseBetween(Node **inTree, Node16 *n, int begin, int end, } n->numChildren = nodeOut - n->children; - if (n->numChildren == 0) { - auto *newNode = tls->allocate(n->partialKeyLen); + if (n->numChildren > Node3::kMaxNodes) { + // nop + } else if (n->numChildren > 0) { + auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); tls->release(n); *inTree = newNode; - } else if (n->numChildren <= Node3::kMaxNodes) { - auto *newNode = tls->allocate(n->partialKeyLen); + } else { + auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); tls->release(n); *inTree = newNode; @@ -1850,18 +1852,20 @@ void eraseBetween(Node **inTree, Node48 *n, int begin, int end, } n->numChildren = n->nextFree; - if (n->numChildren == 0) { - auto *newNode = tls->allocate(n->partialKeyLen); + if (n->numChildren > Node16::kMaxNodes) { + // nop + } else if (n->numChildren > Node3::kMaxNodes) { + auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); tls->release(n); *inTree = newNode; - } else if (n->numChildren <= Node3::kMaxNodes) { + } else if (n->numChildren > 0) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); tls->release(n); *inTree = newNode; - } else if (n->numChildren <= Node16::kMaxNodes) { - auto *newNode = tls->allocate(n->partialKeyLen); + } else { + auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); tls->release(n); *inTree = newNode; @@ -1870,38 +1874,32 @@ void eraseBetween(Node **inTree, Node48 *n, int begin, int end, void eraseBetween(Node **inTree, Node256 *n, int begin, int end, WriteContext *tls) { - const unsigned shiftUpperBound = end - begin; - const unsigned shiftAmount = begin; - auto inBounds = [&](unsigned c) { return c - shiftAmount < shiftUpperBound; }; - n->numChildren = 0; - BitSet newBitSet{}; - n->bitSet.forEachSet([&](int i) { - if (inBounds(i)) { - eraseTree(std::exchange(n->children[i], nullptr), tls); - } else { - ++n->numChildren; - newBitSet.set(i); - } - }); - n->bitSet = newBitSet; - // Don't need to update childMaxVersion or maxOfMax because of monotonicity - if (n->numChildren == 0) { - auto *newNode = tls->allocate(n->partialKeyLen); + for (int i = n->bitSet.firstSetGeq(begin); i >= 0 && i < end; + i = n->bitSet.firstSetGeq(i)) { + assert(n->children[i] != nullptr); + eraseTree(std::exchange(n->children[i], nullptr), tls); + n->bitSet.reset(i); + --n->numChildren; + } + if (n->numChildren > Node48::kMaxNodes) { + // nop + } else if (n->numChildren > Node16::kMaxNodes) { + auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); tls->release(n); *inTree = newNode; - } else if (n->numChildren <= Node3::kMaxNodes) { - auto *newNode = tls->allocate(n->partialKeyLen); - newNode->copyChildrenAndKeyFrom(*n); - tls->release(n); - *inTree = newNode; - } else if (n->numChildren <= Node16::kMaxNodes) { + } else if (n->numChildren > Node3::kMaxNodes) { auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); tls->release(n); *inTree = newNode; - } else if (n->numChildren <= Node48::kMaxNodes) { - auto *newNode = tls->allocate(n->partialKeyLen); + } else if (n->numChildren > 0) { + auto *newNode = tls->allocate(n->partialKeyLen); + newNode->copyChildrenAndKeyFrom(*n); + tls->release(n); + *inTree = newNode; + } else { + auto *newNode = tls->allocate(n->partialKeyLen); newNode->copyChildrenAndKeyFrom(*n); tls->release(n); *inTree = newNode;