src/ai/api/ai_list.cpp
branchnoai
changeset 9593 012f29f59906
parent 9589 2fbda08db406
child 9664 c5741021bf59
--- a/src/ai/api/ai_list.cpp	Sat Apr 14 20:01:25 2007 +0000
+++ b/src/ai/api/ai_list.cpp	Sat Apr 14 20:17:36 2007 +0000
@@ -1,378 +1,11 @@
-/* $Id$ */
-
-/** @file ai_list.cpp Implementation of AIList */
-
 #include "ai_list.hpp"
 
-/**
- * Base class for any AIList sorter.
- */
-class AIListSorter {
-protected:
-	AIList *list;
-
-public:
-	/**
-	 * Virtual dtor, needed to mute warnings.
-	 */
-	virtual ~AIListSorter() { }
-
-	/**
-	 * Get the first item of the sorter.
-	 */
-	virtual int32 Begin() = 0;
-
-	/**
-	 * Get the next item of the sorter.
-	 */
-	virtual int32 Next() = 0;
-
-	/**
-	 * See if there is a next item of the sorter.
-	 */
-	virtual bool HasNext() = 0;
-};
-
-/**
- * Sort by value, ascending.
- */
-class AIListSorterValueAscending : public AIListSorter {
-private:
-	AIList::AIListBucket::iterator bucket_iter;
-	AIList::AIItemList *bucket_list;
-	AIList::AIItemList::iterator bucket_list_iter;
-
-public:
-	AIListSorterValueAscending(AIList *list)
-	{
-		this->list = list;
-	}
-
-	int32 Begin()
-	{
-		this->bucket_iter = this->list->buckets.begin();
-		this->bucket_list = &(*this->bucket_iter).second;
-		this->bucket_list_iter = this->bucket_list->begin();
-		return *bucket_list_iter;
-	}
-
-	int32 Next()
-	{
-		this->bucket_list_iter++;
-		if (this->bucket_list_iter == this->bucket_list->end()) {
-			this->bucket_iter++;
-			if (this->bucket_iter == this->list->buckets.end()) return 0;
-			this->bucket_list = &(*this->bucket_iter).second;
-			this->bucket_list_iter = this->bucket_list->begin();
-		}
-		return *bucket_list_iter;
-	}
-
-	bool HasNext()
-	{
-		return this->bucket_iter != this->list->buckets.end() && this->bucket_list_iter != this->bucket_list->end();
-	}
-};
-
-/**
- * Sort by value, descending.
- */
-class AIListSorterValueDescending : public AIListSorter {
-private:
-	AIList::AIListBucket::reverse_iterator bucket_iter;
-	AIList::AIItemList *bucket_list;
-	AIList::AIItemList::reverse_iterator bucket_list_iter;
-
-public:
-	AIListSorterValueDescending(AIList *list)
-	{
-		this->list = list;
-	}
-
-	int32 Begin()
-	{
-		this->bucket_iter = this->list->buckets.rbegin();
-		this->bucket_list = &(*this->bucket_iter).second;
-		this->bucket_list_iter = this->bucket_list->rbegin();
-		return *bucket_list_iter;
-	}
-
-	int32 Next()
-	{
-		this->bucket_list_iter++;
-		if (this->bucket_list_iter == this->bucket_list->rend()) {
-			this->bucket_iter++;
-			if (this->bucket_iter == this->list->buckets.rend()) return 0;
-			this->bucket_list = &(*this->bucket_iter).second;
-			this->bucket_list_iter = this->bucket_list->rbegin();
-		}
-		return *bucket_list_iter;
-	}
-
-	bool HasNext()
-	{
-		return this->bucket_iter != this->list->buckets.rend() && this->bucket_list_iter != this->bucket_list->rend();
-	}
-};
-
-/**
- * Sort by item, ascending.
- */
-class AIListSorterItemAscending : public AIListSorter {
-private:
-	AIList::AIListMap::iterator item_iter;
-
-public:
-	AIListSorterItemAscending(AIList *list)
-	{
-		this->list = list;
-	}
-
-	int32 Begin()
-	{
-		this->item_iter = this->list->items.begin();
-		return (*this->item_iter).first;
-	}
-
-	int32 Next()
-	{
-		this->item_iter++;
-		return (*this->item_iter).first;
-	}
-
-	bool HasNext()
-	{
-		return this->item_iter != this->list->items.end();
-	}
-};
-
-/**
- * Sort by item, descending.
- */
-class AIListSorterItemDescending : public AIListSorter {
-private:
-	AIList::AIListMap::reverse_iterator item_iter;
-
-public:
-	AIListSorterItemDescending(AIList *list)
-	{
-		this->list = list;
-	}
-
-	int32 Begin()
-	{
-		this->item_iter = this->list->items.rbegin();
-		return (*this->item_iter).first;
-	}
-
-	int32 Next()
-	{
-		this->item_iter++;
-		return (*this->item_iter).first;
-	}
-
-	bool HasNext()
-	{
-		return this->item_iter != this->list->items.rend();
-	}
-};
-
-
-
-AIList::AIList()
-{
-	/* Default sorter */
-	this->sorter = new AIListSorterValueDescending(this);
-}
-
-AIList::~AIList()
-{
-	delete this->sorter;
-}
-
-bool AIList::HasItem(int32 item)
-{
-	return this->items.count(item) == 1;
-}
-
-void AIList::Clear()
-{
-	this->items.clear();
-	this->buckets.clear();
-}
-
 void AIList::AddItem(int32 item)
 {
-	if (this->HasItem(item)) return;
-
-	this->items[item] = 0;
-	this->buckets[0].insert(item);
+	AIAbstractList::AddItem(item);
 }
 
 void AIList::RemoveItem(int32 item)
 {
-	if (!this->HasItem(item)) return;
-
-	this->buckets[this->GetValue(item)].erase(item);
-	this->items.erase(item);
-}
-
-int32 AIList::Begin()
-{
-	return this->sorter->Begin();
-}
-
-int32 AIList::Next()
-{
-	return this->sorter->Next();
-}
-
-bool AIList::IsEmpty()
-{
-	return this->items.empty();
-}
-
-bool AIList::HasNext()
-{
-	return this->sorter->HasNext();
-}
-
-int32 AIList::Count()
-{
-	return this->items.size();
-}
-
-int32 AIList::GetValue(int32 item)
-{
-	if (!this->HasItem(item)) return 0;
-
-	return this->items[item];
-}
-
-void AIList::SortByItem(bool ascending)
-{
-	delete this->sorter;
-	if (ascending) this->sorter = new AIListSorterItemAscending(this);
-	else           this->sorter = new AIListSorterItemDescending(this);
-}
-
-void AIList::SortByValue(bool ascending)
-{
-	delete this->sorter;
-	if (ascending) this->sorter = new AIListSorterValueAscending(this);
-	else           this->sorter = new AIListSorterValueDescending(this);
-}
-
-void AIList::RemoveAboveValue(int32 value)
-{
-	for (AIListMap::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 (AIListBucket::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);
-	}
-}
-
-void AIList::RemoveBelowValue(int32 value)
-{
-	for (AIListMap::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 (AIListBucket::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);
-	}
+	AIAbstractList::RemoveItem(item);
 }
-
-void AIList::RemoveBetweenValue(int32 start, int32 end)
-{
-	for (AIListMap::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 (AIListBucket::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);
-	}
-}
-
-void AIList::RemoveValue(int32 value)
-{
-	for (AIListMap::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 (AIListBucket::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);
-	}
-}
-
-void AIList::KeepAboveValue(int32 value)
-{
-	for (AIListMap::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 (AIListBucket::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);
-	}
-}
-
-void AIList::KeepBelowValue(int32 value)
-{
-	for (AIListMap::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 (AIListBucket::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);
-	}
-}
-
-void AIList::KeepBetweenValue(int32 start, int32 end)
-{
-	for (AIListMap::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 (AIListBucket::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);
-	}
-}
-
-void AIList::KeepValue(int32 value)
-{
-	for (AIListMap::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 (AIListBucket::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);
-	}
-}
-
-void AIList::Valuate(const AIList::Valuator &proc)
-{
-	this->buckets.clear();
-	for (AIListMap::iterator iter = this->items.begin(); iter != this->items.end(); iter++) {
-		int32 value = proc.Valuate((*iter).first);
-		(*iter).second = value;
-		this->buckets[value].insert((*iter).first);
-	}
-}