From a012539f2c993d061794a7ea282010d76a9ac1aa Mon Sep 17 00:00:00 2001 From: Kostas Kyrimis Date: Sat, 23 Nov 2024 17:21:50 +0100 Subject: [PATCH] fix: remove DenseSet::IteratorBase::TraverseApply (#4170) Signed-off-by: kostas --- src/core/dense_set.cc | 18 ------------------ src/core/dense_set.h | 5 ----- src/core/score_map.cc | 34 ++++++++++++++++++---------------- src/core/string_map.cc | 20 +++++++++++--------- 4 files changed, 29 insertions(+), 48 deletions(-) diff --git a/src/core/dense_set.cc b/src/core/dense_set.cc index 19c0e6fb5..0b8b7479d 100644 --- a/src/core/dense_set.cc +++ b/src/core/dense_set.cc @@ -840,22 +840,4 @@ size_t DenseSet::SizeSlow() { return size_; } -size_t DenseSet::IteratorBase::TraverseApply(DensePtr* ptr, std::function fun) { - size_t links_traversed = 0; - while (ptr->IsLink()) { - DenseLinkKey* link = ptr->AsLink(); - fun(link); - ptr = &link->next; - ++links_traversed; - } - - // The last ptr in the link always returns ptr->IsLink() = false - DCHECK(!ptr->IsEmpty()); - DCHECK(ptr->IsObject()); - fun(ptr); - ++links_traversed; - - return links_traversed; -} - } // namespace dfly diff --git a/src/core/dense_set.h b/src/core/dense_set.h index e04212c7d..1cc5ac135 100644 --- a/src/core/dense_set.h +++ b/src/core/dense_set.h @@ -202,11 +202,6 @@ class DenseSet { void Advance(); - // If ptr is a link, it calls fun on all links in the chain. - // Otherwise it calls it only once on the object. - // ptr must be non empty. - size_t TraverseApply(DensePtr* ptr, std::function fun); - DenseSet* owner_; ChainVectorIterator curr_list_; DensePtr* curr_entry_; diff --git a/src/core/score_map.cc b/src/core/score_map.cc index fa5fc4f39..e32f60595 100644 --- a/src/core/score_map.cc +++ b/src/core/score_map.cc @@ -164,23 +164,25 @@ pair DuplicateEntryIfFragmented(void* obj, float ratio) { } // namespace bool ScoreMap::iterator::ReallocIfNeeded(float ratio, std::function cb) { - bool reallocated = false; - auto body = [ratio, &cb, &reallocated](auto* ptr) { - auto* obj = ptr->GetObject(); - auto [new_obj, duplicate] = DuplicateEntryIfFragmented(obj, ratio); - if (duplicate) { - if (cb) { - cb((sds)obj, (sds)new_obj); - } - sdsfree((sds)obj); - ptr->SetObject(new_obj); + auto* ptr = curr_entry_; + + if (ptr->IsLink()) { + ptr = ptr->AsLink(); + } + + DCHECK(!ptr->IsEmpty()); + DCHECK(ptr->IsObject()); + + auto* obj = ptr->GetObject(); + auto [new_obj, realloced] = DuplicateEntryIfFragmented(obj, ratio); + if (realloced) { + if (cb) { + cb((sds)obj, (sds)new_obj); } - reallocated |= duplicate; - }; - - TraverseApply(curr_entry_, body); - - return reallocated; + sdsfree((sds)obj); + ptr->SetObject(new_obj); + } + return realloced; } } // namespace dfly diff --git a/src/core/string_map.cc b/src/core/string_map.cc index 655cbaae2..8d34d14f6 100644 --- a/src/core/string_map.cc +++ b/src/core/string_map.cc @@ -298,17 +298,19 @@ detail::SdsPair StringMap::iterator::BreakToPair(void* obj) { } bool StringMap::iterator::ReallocIfNeeded(float ratio) { - bool reallocated = false; - auto body = [this, ratio, &reallocated](auto* ptr) { - auto* obj = ptr->GetObject(); - auto [new_obj, realloc] = static_cast(owner_)->ReallocIfNeeded(obj, ratio); - ptr->SetObject(new_obj); - reallocated |= realloc; - }; + auto* ptr = curr_entry_; + if (ptr->IsLink()) { + ptr = ptr->AsLink(); + } - TraverseApply(curr_entry_, body); + DCHECK(!ptr->IsEmpty()); + DCHECK(ptr->IsObject()); - return reallocated; + auto* obj = ptr->GetObject(); + auto [new_obj, realloced] = static_cast(owner_)->ReallocIfNeeded(obj, ratio); + ptr->SetObject(new_obj); + + return realloced; } } // namespace dfly