1
0
mirror of https://github.com/OpenTTD/OpenTTD synced 2026-01-16 17:02:37 +01:00

Codechange: [Script] Reduce code duplication in ScriptList filtering (#14931)

This commit is contained in:
Loïc Guilloux
2025-12-17 15:35:53 +01:00
committed by GitHub
parent 938c3de640
commit 9a47f53db0
2 changed files with 22 additions and 61 deletions

View File

@@ -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)

View File

@@ -154,6 +154,17 @@ protected:
*/
void CopyList(const ScriptList *list);
template <class ValueFilter>
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<SQInteger> ScriptItemList; ///< The list of items inside the bucket
typedef std::map<SQInteger, ScriptItemList> ScriptListBucket; ///< The bucket list per value