From 9a47f53db0dad395fe357ef3fc2be401d180a99d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Guilloux?= Date: Wed, 17 Dec 2025 15:35:53 +0100 Subject: [PATCH] Codechange: [Script] Reduce code duplication in ScriptList filtering (#14931) --- src/script/api/script_list.cpp | 72 ++++++---------------------------- src/script/api/script_list.hpp | 11 ++++++ 2 files changed, 22 insertions(+), 61 deletions(-) diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp index f01f596bf4..ec7c58e4a6 100644 --- a/src/script/api/script_list.cpp +++ b/src/script/api/script_list.cpp @@ -667,42 +667,22 @@ void ScriptList::SwapList(ScriptList *list) void ScriptList::RemoveAboveValue(SQInteger value) { - this->modifications++; - - for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = std::next(iter); - if (iter->second > value) this->RemoveItem(iter->first); - } + this->RemoveItems([&](const SQInteger &, const SQInteger &v) { return v > value; }); } void ScriptList::RemoveBelowValue(SQInteger value) { - this->modifications++; - - for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = std::next(iter); - if (iter->second < value) this->RemoveItem(iter->first); - } + this->RemoveItems([&](const SQInteger &, const SQInteger &v) { return v < value; }); } void ScriptList::RemoveBetweenValue(SQInteger start, SQInteger end) { - this->modifications++; - - for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = std::next(iter); - if (iter->second > start && iter->second < end) this->RemoveItem(iter->first); - } + this->RemoveItems([&](const SQInteger &, const SQInteger &v) { return v > start && v < end; }); } void ScriptList::RemoveValue(SQInteger value) { - this->modifications++; - - for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = std::next(iter); - if (iter->second == value) this->RemoveItem(iter->first); - } + this->RemoveItems([&](const SQInteger &, const SQInteger &v) { return v == value; }); } void ScriptList::RemoveTop(SQInteger count) @@ -781,55 +761,31 @@ void ScriptList::RemoveBottom(SQInteger count) void ScriptList::RemoveList(ScriptList *list) { - this->modifications++; - if (list == this) { this->Clear(); - } else { - for (const auto &item : list->items) { - this->RemoveItem(item.first); - } + return; } + this->RemoveItems([&](const SQInteger &k, const SQInteger &) { return list->HasItem(k); }); } void ScriptList::KeepAboveValue(SQInteger value) { - this->modifications++; - - for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = std::next(iter); - if (iter->second <= value) this->RemoveItem(iter->first); - } + this->RemoveItems([&](const SQInteger &, const SQInteger &v) { return v <= value; }); } void ScriptList::KeepBelowValue(SQInteger value) { - this->modifications++; - - for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = std::next(iter); - if (iter->second >= value) this->RemoveItem(iter->first); - } + this->RemoveItems([&](const SQInteger &, const SQInteger &v) { return v >= value; }); } void ScriptList::KeepBetweenValue(SQInteger start, SQInteger end) { - this->modifications++; - - for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = std::next(iter); - if (iter->second <= start || iter->second >= end) this->RemoveItem(iter->first); - } + this->RemoveItems([&](const SQInteger &, const SQInteger &v) { return v <= start && v >= end; }); } void ScriptList::KeepValue(SQInteger value) { - this->modifications++; - - for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { - next_iter = std::next(iter); - if (iter->second != value) this->RemoveItem(iter->first); - } + this->RemoveItems([&](const SQInteger &, const SQInteger &v) { return v != value; }); } void ScriptList::KeepTop(SQInteger count) @@ -849,13 +805,7 @@ void ScriptList::KeepBottom(SQInteger count) void ScriptList::KeepList(ScriptList *list) { if (list == this) return; - - this->modifications++; - - ScriptList tmp; - tmp.AddList(this); - tmp.RemoveList(list); - this->RemoveList(&tmp); + this->RemoveItems([&](const SQInteger &k, const SQInteger &) { return !list->HasItem(k); }); } SQInteger ScriptList::_get(HSQUIRRELVM vm) diff --git a/src/script/api/script_list.hpp b/src/script/api/script_list.hpp index 2794a0ed33..ef8b56ff0c 100644 --- a/src/script/api/script_list.hpp +++ b/src/script/api/script_list.hpp @@ -154,6 +154,17 @@ protected: */ void CopyList(const ScriptList *list); + template + void RemoveItems(ValueFilter value_filter) + { + this->modifications++; + + for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { + next_iter = std::next(iter); + if (value_filter(iter->first, iter->second)) this->RemoveItem(iter->first); + } + } + public: typedef std::set ScriptItemList; ///< The list of items inside the bucket typedef std::map ScriptListBucket; ///< The bucket list per value