summaryrefslogtreecommitdiff
path: root/src/script/api
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2015-04-27 19:28:22 +0000
committerfrosch <frosch@openttd.org>2015-04-27 19:28:22 +0000
commiteb25d9e275a8fe165f52f669696d5be15efd748d (patch)
tree3be70e538b5dcb6bc75514532f13d41e9a39113b /src/script/api
parent2ea4466230234974d5e822bbb824d2deec3cfaa3 (diff)
downloadopenttd-eb25d9e275a8fe165f52f669696d5be15efd748d.tar.xz
(svn r27258) -Fix [FS#6287]: ScriptList::RemoveList failed to remove a list from itself.
Diffstat (limited to 'src/script/api')
-rw-r--r--src/script/api/script_list.cpp22
1 files changed, 14 insertions, 8 deletions
diff --git a/src/script/api/script_list.cpp b/src/script/api/script_list.cpp
index 3ffca3598..bdbc1209b 100644
--- a/src/script/api/script_list.cpp
+++ b/src/script/api/script_list.cpp
@@ -556,6 +556,8 @@ void ScriptList::Sort(SorterType sorter, bool ascending)
void ScriptList::AddList(ScriptList *list)
{
+ if (list == this) return;
+
ScriptListMap *list_items = &list->items;
for (ScriptListMap::iterator iter = list_items->begin(); iter != list_items->end(); iter++) {
this->AddItem((*iter).first);
@@ -565,6 +567,8 @@ void ScriptList::AddList(ScriptList *list)
void ScriptList::SwapList(ScriptList *list)
{
+ if (list == this) return;
+
this->items.swap(list->items);
this->buckets.swap(list->buckets);
Swap(this->sorter, list->sorter);
@@ -694,9 +698,13 @@ void ScriptList::RemoveList(ScriptList *list)
{
this->modifications++;
- ScriptListMap *list_items = &list->items;
- for (ScriptListMap::iterator iter = list_items->begin(); iter != list_items->end(); iter++) {
- this->RemoveItem((*iter).first);
+ if (list == this) {
+ Clear();
+ } else {
+ ScriptListMap *list_items = &list->items;
+ for (ScriptListMap::iterator iter = list_items->begin(); iter != list_items->end(); iter++) {
+ this->RemoveItem((*iter).first);
+ }
}
}
@@ -756,14 +764,12 @@ void ScriptList::KeepBottom(int32 count)
void ScriptList::KeepList(ScriptList *list)
{
+ if (list == this) return;
+
this->modifications++;
ScriptList tmp;
- for (ScriptListMap::iterator iter = this->items.begin(); iter != this->items.end(); iter++) {
- tmp.AddItem((*iter).first);
- tmp.SetValue((*iter).first, (*iter).second);
- }
-
+ tmp.AddList(this);
tmp.RemoveList(list);
this->RemoveList(&tmp);
}