1
0
Fork 0

(svn r26741) -Revert (r26736): reverse_iterators are invalidated when the element next to them is erased (not the element they are pointing to), which makes them unsuitable for ScriptList.

release/1.5
frosch 2014-08-16 20:37:33 +00:00
parent fcb9d433f5
commit c775ffe530
1 changed files with 21 additions and 15 deletions

View File

@ -151,9 +151,9 @@ public:
*/ */
class ScriptListSorterValueDescending : public ScriptListSorter { class ScriptListSorterValueDescending : public ScriptListSorter {
private: private:
ScriptList::ScriptListBucket::reverse_iterator bucket_iter; ///< The iterator over the list to find the buckets. ScriptList::ScriptListBucket::iterator bucket_iter; ///< The iterator over the list to find the buckets.
ScriptList::ScriptItemList *bucket_list; ///< The current bucket list we're iterator over. ScriptList::ScriptItemList *bucket_list; ///< The current bucket list we're iterator over.
ScriptList::ScriptItemList::reverse_iterator bucket_list_iter; ///< The iterator over the bucket list. ScriptList::ScriptItemList::iterator bucket_list_iter; ///< The iterator over the bucket list.
public: public:
/** /**
@ -172,11 +172,13 @@ public:
this->has_no_more_items = false; this->has_no_more_items = false;
/* Go to the end of the bucket-list */ /* Go to the end of the bucket-list */
this->bucket_iter = this->list->buckets.rbegin(); this->bucket_iter = this->list->buckets.begin();
for (size_t i = this->list->buckets.size(); i > 1; i--) this->bucket_iter++;
this->bucket_list = &(*this->bucket_iter).second; this->bucket_list = &(*this->bucket_iter).second;
/* Go to the end of the items in the bucket */ /* Go to the end of the items in the bucket */
this->bucket_list_iter = this->bucket_list->rbegin(); this->bucket_list_iter = this->bucket_list->begin();
for (size_t i = this->bucket_list->size(); i > 1; i--) this->bucket_list_iter++;
this->item_next = *this->bucket_list_iter; this->item_next = *this->bucket_list_iter;
int32 item_current = this->item_next; int32 item_current = this->item_next;
@ -201,15 +203,18 @@ public:
return; return;
} }
this->bucket_list_iter++; if (this->bucket_list_iter == this->bucket_list->begin()) {
if (this->bucket_list_iter == this->bucket_list->rend()) { if (this->bucket_iter == this->list->buckets.begin()) {
this->bucket_iter++;
if (this->bucket_iter == this->list->buckets.rend()) {
this->bucket_list = NULL; this->bucket_list = NULL;
return; return;
} }
this->bucket_iter--;
this->bucket_list = &(*this->bucket_iter).second; this->bucket_list = &(*this->bucket_iter).second;
this->bucket_list_iter = this->bucket_list->rbegin(); /* Go to the end of the items in the bucket */
this->bucket_list_iter = this->bucket_list->begin();
for (size_t i = this->bucket_list->size(); i > 1; i--) this->bucket_list_iter++;
} else {
this->bucket_list_iter--;
} }
this->item_next = *this->bucket_list_iter; this->item_next = *this->bucket_list_iter;
} }
@ -310,7 +315,7 @@ public:
*/ */
class ScriptListSorterItemDescending : public ScriptListSorter { class ScriptListSorterItemDescending : public ScriptListSorter {
private: private:
ScriptList::ScriptListMap::reverse_iterator item_iter; ///< The iterator over the items in the map. ScriptList::ScriptListMap::iterator item_iter; ///< The iterator over the items in the map.
public: public:
/** /**
@ -328,7 +333,8 @@ public:
if (this->list->items.empty()) return 0; if (this->list->items.empty()) return 0;
this->has_no_more_items = false; this->has_no_more_items = false;
this->item_iter = this->list->items.rbegin(); this->item_iter = this->list->items.begin();
for (size_t i = this->list->items.size(); i > 1; i--) this->item_iter++;
this->item_next = (*this->item_iter).first; this->item_next = (*this->item_iter).first;
int32 item_current = this->item_next; int32 item_current = this->item_next;
@ -346,12 +352,12 @@ public:
*/ */
void FindNext() void FindNext()
{ {
if (this->item_iter == this->list->items.rend()) { if (this->item_iter == this->list->items.end()) {
this->has_no_more_items = true; this->has_no_more_items = true;
return; return;
} }
this->item_iter++; this->item_iter--;
if (this->item_iter != this->list->items.rend()) item_next = (*this->item_iter).first; if (this->item_iter != this->list->items.end()) item_next = (*this->item_iter).first;
} }
int32 Next() int32 Next()