diff --git a/ConflictSet.cpp b/ConflictSet.cpp index bfc5374..ef73503 100644 --- a/ConflictSet.cpp +++ b/ConflictSet.cpp @@ -3202,59 +3202,72 @@ void addWriteRange(Node *&root, std::span begin, Node **useAsRoot = insert(&root, begin.subspan(0, lcp), writeVersion, tls, impl); + begin = begin.subspan(lcp, begin.size() - lcp); + end = end.subspan(lcp, end.size() - lcp); - int consumed = lcp; - - begin = begin.subspan(consumed, begin.size() - consumed); - end = end.subspan(consumed, end.size() - consumed); - - auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl); - - const bool insertedBegin = !beginNode->entryPresent; - - addKey(beginNode); - beginNode->entryPresent = true; - - if (insertedBegin) { - ++tls->accum.entries_inserted; - auto *p = nextLogical(beginNode); - beginNode->entry.rangeVersion = - p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero); + if (beginIsPrefix) { + auto *beginNode = *useAsRoot; + addKey(beginNode); + if (!beginNode->entryPresent) { + ++tls->accum.entries_inserted; + auto *p = nextLogical(beginNode); + beginNode->entry.rangeVersion = + p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero); + beginNode->entryPresent = true; + } beginNode->entry.pointVersion = writeVersion; - } - assert(writeVersion >= beginNode->entry.pointVersion); - beginNode->entry.pointVersion = writeVersion; - auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl); - - const bool insertedEnd = !endNode->entryPresent; - - addKey(endNode); - endNode->entryPresent = true; - - if (insertedEnd) { - ++tls->accum.entries_inserted; - auto *p = nextLogical(endNode); - endNode->entry.pointVersion = - p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero); - if (beginIsPrefix) { + auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl); + addKey(endNode); + if (!endNode->entryPresent) { + ++tls->accum.entries_inserted; + auto *p = nextLogical(endNode); + endNode->entry.pointVersion = + p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero); // beginNode may have been invalidated when inserting end beginNode = *useAsRoot; - assert(beginNode->entryPresent); + endNode->entryPresent = true; } - } - endNode->entry.rangeVersion = writeVersion; + endNode->entry.rangeVersion = writeVersion; + + for (beginNode = nextLogical(beginNode); beginNode != endNode; + beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) { + } + + // Inserting end trashed endNode's maxVersion. Fix that + fixupMaxVersion(endNode, impl, tls); + } else /*!beginIsPrefix*/ { + auto *beginNode = *insert(useAsRoot, begin, writeVersion, tls, impl); + addKey(beginNode); + if (!beginNode->entryPresent) { + ++tls->accum.entries_inserted; + auto *p = nextLogical(beginNode); + beginNode->entry.rangeVersion = + p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero); + beginNode->entryPresent = true; + } + beginNode->entry.pointVersion = writeVersion; + + auto *endNode = *insert(useAsRoot, end, writeVersion, tls, impl); + addKey(endNode); + if (!endNode->entryPresent) { + ++tls->accum.entries_inserted; + auto *p = nextLogical(endNode); + endNode->entry.pointVersion = + p == nullptr ? tls->zero : std::max(p->entry.rangeVersion, tls->zero); + endNode->entryPresent = true; + } + endNode->entry.rangeVersion = writeVersion; - if (!beginIsPrefix) { eraseBetween(*useAsRoot, begin[0] + 1, end[0], tls); - } - for (beginNode = nextLogical(beginNode); beginNode != endNode; - beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) { - } + for (beginNode = nextLogical(beginNode); beginNode != endNode; + beginNode = erase(beginNode, tls, impl, /*logical*/ true, endNode)) { + } - // Inserting end trashed endNode's maxVersion. Fix that - fixupMaxVersion(endNode, impl, tls); + // Inserting end trashed endNode's maxVersion. Fix that + fixupMaxVersion(endNode, impl, tls); + } } Node *firstGeqPhysical(Node *n, const std::span key) {