From 37f972145eb1c60b79b77163112f2a72a3f40b1f Mon Sep 17 00:00:00 2001 From: Andrew Noyes Date: Fri, 24 May 2024 14:23:32 -0700 Subject: [PATCH] Re-use search implementation in insert --- VersionedMap.cpp | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/VersionedMap.cpp b/VersionedMap.cpp index 3229b78..6fe6e27 100644 --- a/VersionedMap.cpp +++ b/VersionedMap.cpp @@ -587,18 +587,18 @@ struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl { int len; }; + // Initialize finger to the insertion path of `key`. If `key` is not present, + // then the finger ends on a null entry. template void search(Key key, T root, int64_t version, Finger &finger) const { // Prevent integer promotion etc static_assert(std::is_same_v); + finger.clear(); - if (root == 0) { - return; - } + bool ignored; finger.push(root, ignored); - // Initialize finger to the search path of `key` for (;;) { auto n = finger.backNode(); if (n == 0) { @@ -617,27 +617,9 @@ struct __attribute__((__visibility__("hidden"))) VersionedMap::Impl { // Otherwise it's the end of a range mutation at `latestVersion`. // `finger` becomes the search path of `key` void insert(Key key, std::optional val, Finger &finger) { - bool ignored; - finger.clear(); - finger.push(latestRoot, ignored); - bool inserted; - // Initialize finger to the search path of `key` - for (;;) { - auto n = finger.backNode(); - if (n == 0) { - inserted = true; - break; - } - auto c = key <=> mm.base[n]; - if (c == 0) { - // No duplicates - inserted = false; - break; - } - finger.push(child(n, c > 0, latestVersion), - c > 0); - } + search(key, latestRoot, latestVersion, finger); + const bool inserted = finger.backNode() == 0; int64_t pointVersion, rangeVersion; if (val.has_value()) {