@@ -18,36 +18,36 @@
/**
* Base class for any ScriptList sorter.
*/
class ScriptListSorter {
protected:
ScriptList *list; ///< The list that's being sorted.
bool has_no_more_items; ///< Whether we have more items to iterate over.
int32 item_next; ///< The next item we will show.
int64 item_next; ///< The next item we will show.
public:
* Virtual dtor, needed to mute warnings.
virtual ~ScriptListSorter() { }
* Get the first item of the sorter.
virtual int32 Begin() = 0;
virtual int64 Begin() = 0;
* Stop iterating a sorter.
virtual void End() = 0;
* Get the next item of the sorter.
virtual int32 Next() = 0;
virtual int64 Next() = 0;
* See if the sorter has reached the end.
bool IsEnd()
{
@@ -88,23 +88,23 @@ public:
ScriptListSorterValueAscending(ScriptList *list)
this->list = list;
this->End();
}
int32 Begin()
int64 Begin()
if (this->list->buckets.empty()) return 0;
this->has_no_more_items = false;
this->bucket_iter = this->list->buckets.begin();
this->bucket_list = &(*this->bucket_iter).second;
this->bucket_list_iter = this->bucket_list->begin();
this->item_next = *this->bucket_list_iter;
int32 item_current = this->item_next;
int64 item_current = this->item_next;
FindNext();
return item_current;
void End()
@@ -133,17 +133,17 @@ public:
int32 Next()
int64 Next()
if (this->IsEnd()) return 0;
void Remove(int item)
@@ -177,13 +177,13 @@ public:
ScriptListSorterValueDescending(ScriptList *list)
/* Go to the end of the bucket-list */
this->bucket_iter = this->list->buckets.end();
@@ -192,13 +192,13 @@ public:
/* Go to the end of the items in the bucket */
this->bucket_list_iter = this->bucket_list->end();
--this->bucket_list_iter;
@@ -230,17 +230,17 @@ public:
} else {
this->bucket_list_iter--;
@@ -269,21 +269,21 @@ public:
ScriptListSorterItemAscending(ScriptList *list)
if (this->list->items.empty()) return 0;
this->item_iter = this->list->items.begin();
this->item_next = (*this->item_iter).first;
@@ -300,17 +300,17 @@ public:
return;
this->item_iter++;
if (this->item_iter != this->list->items.end()) item_next = (*this->item_iter).first;
@@ -342,22 +342,22 @@ public:
ScriptListSorterItemDescending(ScriptList *list)
this->item_iter = this->list->items.end();
--this->item_iter;
@@ -379,17 +379,17 @@ public:
this->item_iter--;
@@ -417,13 +417,13 @@ ScriptList::ScriptList()
ScriptList::~ScriptList()
delete this->sorter;
bool ScriptList::HasItem(int32 item)
bool ScriptList::HasItem(int64 item)
return this->items.count(item) == 1;
void ScriptList::Clear()
@@ -431,45 +431,45 @@ void ScriptList::Clear()
this->items.clear();
this->buckets.clear();
this->sorter->End();
void ScriptList::AddItem(int32 item, int32 value)
void ScriptList::AddItem(int64 item, int64 value)
this->modifications++;
if (this->HasItem(item)) return;
this->items[item] = 0;
this->buckets[0].insert(item);
this->SetValue(item, value);
void ScriptList::RemoveItem(int32 item)
void ScriptList::RemoveItem(int64 item)
if (!this->HasItem(item)) return;
int32 value = this->GetValue(item);
int64 value = this->GetValue(item);
this->sorter->Remove(item);
this->buckets[value].erase(item);
if (this->buckets[value].empty()) this->buckets.erase(value);
this->items.erase(item);
int32 ScriptList::Begin()
int64 ScriptList::Begin()
this->initialized = true;
return this->sorter->Begin();
int32 ScriptList::Next()
int64 ScriptList::Next()
if (this->initialized == false) {
DEBUG(script, 0, "Next() is invalid as Begin() is never called");
return 0;
return this->sorter->Next();
@@ -491,26 +491,26 @@ bool ScriptList::IsEnd()
int32 ScriptList::Count()
return (int32)this->items.size();
int32 ScriptList::GetValue(int32 item)
int64 ScriptList::GetValue(int64 item)
if (!this->HasItem(item)) return 0;
return this->items[item];
bool ScriptList::SetValue(int32 item, int32 value)
bool ScriptList::SetValue(int64 item, int64 value)
if (!this->HasItem(item)) return false;
int32 value_old = this->GetValue(item);
int64 value_old = this->GetValue(item);
if (value_old == value) return true;
this->buckets[value_old].erase(item);
if (this->buckets[value_old].empty()) this->buckets.erase(value_old);
this->items[item] = value;
@@ -570,43 +570,43 @@ void ScriptList::SwapList(ScriptList *li
Swap(this->initialized, list->initialized);
Swap(this->modifications, list->modifications);
this->sorter->Retarget(this);
list->sorter->Retarget(list);
void ScriptList::RemoveAboveValue(int32 value)
void ScriptList::RemoveAboveValue(int64 value)
for (ScriptListMap::iterator next_iter, iter = this->items.begin(); iter != this->items.end(); iter = next_iter) {
next_iter = iter; next_iter++;
if ((*iter).second > value) this->RemoveItem((*iter).first);
void ScriptList::RemoveBelowValue(int32 value)
void ScriptList::RemoveBelowValue(int64 value)
if ((*iter).second < value) this->RemoveItem((*iter).first);
void ScriptList::RemoveBetweenValue(int32 start, int32 end)
void ScriptList::RemoveBetweenValue(int64 start, int64 end)
if ((*iter).second > start && (*iter).second < end) this->RemoveItem((*iter).first);
void ScriptList::RemoveValue(int32 value)
void ScriptList::RemoveValue(int64 value)
if ((*iter).second == value) this->RemoveItem((*iter).first);
@@ -694,43 +694,43 @@ void ScriptList::RemoveList(ScriptList *
ScriptListMap *list_items = &list->items;
for (ScriptListMap::iterator iter = list_items->begin(); iter != list_items->end(); iter++) {
this->RemoveItem((*iter).first);
void ScriptList::KeepAboveValue(int32 value)
void ScriptList::KeepAboveValue(int64 value)
if ((*iter).second <= value) this->RemoveItem((*iter).first);
void ScriptList::KeepBelowValue(int32 value)
void ScriptList::KeepBelowValue(int64 value)
if ((*iter).second >= value) this->RemoveItem((*iter).first);
void ScriptList::KeepBetweenValue(int32 start, int32 end)
void ScriptList::KeepBetweenValue(int64 start, int64 end)
if ((*iter).second <= start || (*iter).second >= end) this->RemoveItem((*iter).first);
void ScriptList::KeepValue(int32 value)
void ScriptList::KeepValue(int64 value)
if ((*iter).second != value) this->RemoveItem((*iter).first);
@@ -41,15 +41,15 @@ private:
SorterType sorter_type; ///< Sorting type
bool sort_ascending; ///< Whether to sort ascending or descending
bool initialized; ///< Whether an iteration has been started
int modifications; ///< Number of modification that has been done. To prevent changing data while valuating.
typedef std::set<int32> ScriptItemList; ///< The list of items inside the bucket
typedef std::map<int32, ScriptItemList> ScriptListBucket; ///< The bucket list per value
typedef std::map<int32, int32> ScriptListMap; ///< List per item
typedef std::set<int64> ScriptItemList; ///< The list of items inside the bucket
typedef std::map<int64, ScriptItemList> ScriptListBucket; ///< The bucket list per value
typedef std::map<int64, int64> ScriptListMap; ///< List per item
ScriptListMap items; ///< The items in the list
ScriptListBucket buckets; ///< The items in the list, sorted by value
ScriptList();
~ScriptList();
@@ -57,48 +57,48 @@ public:
#ifdef DOXYGEN_API
* Add a single item to the list.
* @param item the item to add. Should be unique, otherwise it is ignored.
* @param value the value to assign.
void AddItem(int32 item, int32 value);
void AddItem(int64 item, int64 value);
#else
void AddItem(int32 item, int32 value = 0);
void AddItem(int64 item, int64 value = 0);
#endif /* DOXYGEN_API */
* Remove a single item from the list.
* @param item the item to remove. If not existing, it is ignored.
void RemoveItem(int32 item);
void RemoveItem(int64 item);
* Clear the list, making Count() returning 0 and IsEmpty() returning true.
void Clear();
* Check if an item is in the list.
* @param item the item to check for.
* @return true if the item is in the list.
bool HasItem(int32 item);
bool HasItem(int64 item);
* Go to the beginning of the list and return the item. To get the value use list.GetValue(list.Begin()).
* @return the first item.
* @note returns 0 if beyond end-of-list. Use IsEnd() to check for end-of-list.
int32 Begin();
int64 Begin();
* Go to the next item in the list and return the item. To get the value use list.GetValue(list.Next()).
* @return the next item.
int32 Next();
int64 Next();
* Check if a list is empty.
* @return true if the list is empty.
bool IsEmpty();
@@ -118,23 +118,23 @@ public:
* Get the value that belongs to this item.
* @param item the item to get the value from
* @return the value that belongs to this item.
int32 GetValue(int32 item);
int64 GetValue(int64 item);
* Set a value of an item directly.
* @param item the item to set the value for.
* @param value the value to give to the item
* @return true if we could set the item to value, false otherwise.
* @note Changing values of items while looping through a list might cause
* entries to be skipped. Be very careful with such operations.
bool SetValue(int32 item, int32 value);
bool SetValue(int64 item, int64 value);
* Sort this list by the given sorter and direction.
* @param sorter the type of sorter to use
* @param ascending if true, lowest value is on top, else at bottom.
* @note the current item stays at the same place.
@@ -159,32 +159,32 @@ public:
void SwapList(ScriptList *list);
* Removes all items with a higher value than 'value'.
* @param value the value above which all items are removed.
void RemoveAboveValue(int32 value);
void RemoveAboveValue(int64 value);
* Removes all items with a lower value than 'value'.
* @param value the value below which all items are removed.
void RemoveBelowValue(int32 value);
void RemoveBelowValue(int64 value);
* Removes all items with a value above start and below end.
* @param start the lower bound of the to be removed values (exclusive).
* @param end the upper bound of the to be removed values (exclusive).
void RemoveBetweenValue(int32 start, int32 end);
void RemoveBetweenValue(int64 start, int64 end);
* Remove all items with this value.
* @param value the value to remove.
void RemoveValue(int32 value);
void RemoveValue(int64 value);
* Remove the first count items.
* @param count the amount of items to remove.
void RemoveTop(int32 count);
@@ -203,32 +203,32 @@ public:
void RemoveList(ScriptList *list);
* Keep all items with a higher value than 'value'.
* @param value the value above which all items are kept.
void KeepAboveValue(int32 value);
void KeepAboveValue(int64 value);
* Keep all items with a lower value than 'value'.
* @param value the value below which all items are kept.
void KeepBelowValue(int32 value);
void KeepBelowValue(int64 value);
* Keep all items with a value above start and below end.
* @param start the lower bound of the to be kept values (exclusive).
* @param end the upper bound of the to be kept values (exclusive).
void KeepBetweenValue(int32 start, int32 end);
void KeepBetweenValue(int64 start, int64 end);
* Keep all items with this value.
* @param value the value to keep.
void KeepValue(int32 value);
void KeepValue(int64 value);
* Keep the first count items, i.e. remove everything except the first count items.
* @param count the amount of items to keep.
void KeepTop(int32 count);
Status change: