From ac1a08ef4ad2414491b050b374714d7313373c1f Mon Sep 17 00:00:00 2001 From: frosch Date: Sun, 28 Feb 2010 19:53:11 +0000 Subject: (svn r19293) -Fix [FS#3566]: Some methods of AIAbstractList left invalid iterators. --- src/ai/api/ai_abstractlist.cpp | 63 ++++++++---------------------------------- src/ai/api/ai_abstractlist.hpp | 1 + 2 files changed, 13 insertions(+), 51 deletions(-) (limited to 'src/ai') diff --git a/src/ai/api/ai_abstractlist.cpp b/src/ai/api/ai_abstractlist.cpp index 4d5cea3cb..9aeff4fc4 100644 --- a/src/ai/api/ai_abstractlist.cpp +++ b/src/ai/api/ai_abstractlist.cpp @@ -437,8 +437,8 @@ int32 AIAbstractList::Begin() int32 AIAbstractList::Next() { if (this->initialized == false) { - DEBUG(ai, 0, "ERROR: Next() is invalid as Begin() is never called"); - return false; + DEBUG(ai, 0, "Next() is invalid as Begin() is never called"); + return 0; } return this->sorter->Next(); } @@ -451,7 +451,7 @@ bool AIAbstractList::IsEmpty() bool AIAbstractList::HasNext() { if (this->initialized == false) { - DEBUG(ai, 0, "ERROR: HasNext() is invalid as Begin() is never called"); + DEBUG(ai, 0, "HasNext() is invalid as Begin() is never called"); return false; } return this->sorter->HasNext(); @@ -517,6 +517,7 @@ void AIAbstractList::Sort(SorterType sorter, bool ascending) } this->sorter_type = sorter; this->sort_ascending = ascending; + this->initialized = false; } void AIAbstractList::AddList(AIAbstractList *list) @@ -534,12 +535,7 @@ void AIAbstractList::RemoveAboveValue(int32 value) for (AIAbstractListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { next_iter = iter; next_iter++; - if ((*iter).second > value) this->items.erase(iter); - } - - for (AIAbstractListBucket::iterator next_iter, iter = this->buckets.begin(); iter != this->buckets.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).first > value) this->buckets.erase(iter); + if ((*iter).second > value) this->RemoveItem((*iter).first); } } @@ -549,12 +545,7 @@ void AIAbstractList::RemoveBelowValue(int32 value) for (AIAbstractListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { next_iter = iter; next_iter++; - if ((*iter).second < value) this->items.erase(iter); - } - - for (AIAbstractListBucket::iterator next_iter, iter = this->buckets.begin(); iter != this->buckets.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).first < value) this->buckets.erase(iter); + if ((*iter).second < value) this->RemoveItem((*iter).first); } } @@ -564,12 +555,7 @@ void AIAbstractList::RemoveBetweenValue(int32 start, int32 end) for (AIAbstractListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { next_iter = iter; next_iter++; - if ((*iter).second > start && (*iter).second < end) this->items.erase(iter); - } - - for (AIAbstractListBucket::iterator next_iter, iter = this->buckets.begin(); iter != this->buckets.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).first > start && (*iter).first < end) this->buckets.erase(iter); + if ((*iter).second > start && (*iter).second < end) this->RemoveItem((*iter).first); } } @@ -579,12 +565,7 @@ void AIAbstractList::RemoveValue(int32 value) for (AIAbstractListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { next_iter = iter; next_iter++; - if ((*iter).second == value) this->items.erase(iter); - } - - for (AIAbstractListBucket::iterator next_iter, iter = this->buckets.begin(); iter != this->buckets.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).first == value) this->buckets.erase(iter); + if ((*iter).second == value) this->RemoveItem((*iter).first); } } @@ -677,12 +658,7 @@ void AIAbstractList::KeepAboveValue(int32 value) for (AIAbstractListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { next_iter = iter; next_iter++; - if ((*iter).second <= value) this->items.erase(iter); - } - - for (AIAbstractListBucket::iterator next_iter, iter = this->buckets.begin(); iter != this->buckets.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).first <= value) this->buckets.erase(iter); + if ((*iter).second <= value) this->RemoveItem((*iter).first); } } @@ -692,12 +668,7 @@ void AIAbstractList::KeepBelowValue(int32 value) for (AIAbstractListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { next_iter = iter; next_iter++; - if ((*iter).second >= value) this->items.erase(iter); - } - - for (AIAbstractListBucket::iterator next_iter, iter = this->buckets.begin(); iter != this->buckets.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).first >= value) this->buckets.erase(iter); + if ((*iter).second >= value) this->RemoveItem((*iter).first); } } @@ -707,12 +678,7 @@ void AIAbstractList::KeepBetweenValue(int32 start, int32 end) for (AIAbstractListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { next_iter = iter; next_iter++; - if ((*iter).second <= start || (*iter).second >= end) this->items.erase(iter); - } - - for (AIAbstractListBucket::iterator next_iter, iter = this->buckets.begin(); iter != this->buckets.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).first <= start || (*iter).first >= end) this->buckets.erase(iter); + if ((*iter).second <= start || (*iter).second >= end) this->RemoveItem((*iter).first); } } @@ -722,12 +688,7 @@ void AIAbstractList::KeepValue(int32 value) for (AIAbstractListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) { next_iter = iter; next_iter++; - if ((*iter).second != value) this->items.erase(iter); - } - - for (AIAbstractListBucket::iterator next_iter, iter = this->buckets.begin(); iter != this->buckets.end(); iter = next_iter) { - next_iter = iter; next_iter++; - if ((*iter).first != value) this->buckets.erase(iter); + if ((*iter).second != value) this->RemoveItem((*iter).first); } } diff --git a/src/ai/api/ai_abstractlist.hpp b/src/ai/api/ai_abstractlist.hpp index 1fa99c0fa..bf4c9897d 100644 --- a/src/ai/api/ai_abstractlist.hpp +++ b/src/ai/api/ai_abstractlist.hpp @@ -63,6 +63,7 @@ protected: /** * Remove a single item from the list. * @param item the item to remove. If not existing, it is ignored. + * @note Always use this function for removing items. It keeps the iterator valid! */ void RemoveItem(int32 item); -- cgit v1.2.3-54-g00ecf