⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uihash.cpp

📁 空战游戏flacon源码
💻 CPP
字号:
#include <windows.h>
#include "uihash.h"

UI_Hash::UI_Hash()
{
	TableSize_=0;
	Table_=NULL;

	Callback_=NULL;
}

UI_Hash::~UI_Hash()
{
	if(TableSize_ || Table_)
		Cleanup();
}

void UI_Hash::Setup(unsigned long Size)
{
	unsigned short i;
	TableSize_=Size;

	Table_=new UI_HASHROOT[TableSize_];
	for(i=0;i<TableSize_;i++)
		Table_[i].Root_=NULL;
}

void UI_Hash::Cleanup()
{
	unsigned long i;
	UI_HASHNODE *cur,*prev;

	if(TableSize_ || Table_)
	{
		for(i=0;i<TableSize_;i++)
		{
			cur=Table_[i].Root_;
			while(cur)
			{
				prev=cur;
				cur=cur->Next;
				if(Callback_)
					(*Callback_)(prev->Record);
				else
					delete prev->Record;
				delete prev;
			}
		}
		delete Table_;
		Table_=NULL;
		TableSize_=0;
	}
}

void *UI_Hash::Find(unsigned long ID)
{
	unsigned long idx;
	UI_HASHNODE *cur;

	if(!TableSize_ || !Table_) return(NULL);

	idx=ID % TableSize_;
	cur=Table_[idx].Root_;
	while(cur)
	{
		if(cur->ID == ID)
		{
			return(cur->Record);
		}
		cur=cur->Next;
	}
	return(NULL);
}

void UI_Hash::Add(unsigned long ID,void *rec)
{
	unsigned long idx;
	UI_HASHNODE *cur,*newhash;

	if(!TableSize_ || !Table_ || !rec) return;

	if(Find(ID)) return;

	newhash=new UI_HASHNODE;
	newhash->ID=ID;
	newhash->Record=rec;
	newhash->Next=NULL;

	idx=ID % TableSize_;

	if(!Table_[idx].Root_)
	{
		Table_[idx].Root_=newhash;
	}
	else
	{
		cur=Table_[idx].Root_;
		while(cur->Next)
			cur=cur->Next;
		cur->Next=newhash;
	}
}

void UI_Hash::Remove(unsigned long ID)
{
	unsigned long idx;
	UI_HASHNODE *cur,*prev;

	if(!TableSize_ || !Table_) return;

	idx=ID % TableSize_;

	if(!Table_[idx].Root_) return;

	Table_[idx].Root_;
	if(Table_[idx].Root_->ID == ID)
	{
		prev=Table_[idx].Root_;
		Table_[idx].Root_=Table_[idx].Root_->Next;
		if(Callback_)
			(*Callback_)(prev->Record);
		else
			delete prev->Record;
		delete prev;
	}
	else
	{
		cur=Table_[idx].Root_;
		while(cur->Next)
		{
			if(cur->Next->ID == ID)
			{
				prev=cur->Next;
				cur->Next=cur->Next->Next;
				if(Callback_)
					(*Callback_)(prev->Record);
				else
					delete prev->Record;
				delete prev;
				return;
			}
			cur=cur->Next;
		}
	}
}

void *UI_Hash::GetFirst(UI_HASHNODE **current,unsigned long *curidx)
{
	UI_HASHNODE *cur;

	*curidx=0;
	*current=NULL;

	cur=Table_[*curidx].Root_;
	while(!cur && *curidx < (TableSize_-1))
	{
		(*curidx)++;
		cur=Table_[*curidx].Root_;
	}
	if(*curidx < TableSize_)
	{
		*current=cur;
		if(cur)
			return(cur->Record);
	}
	*current=NULL;
	return(NULL);
}

void *UI_Hash::GetNext(UI_HASHNODE **current,unsigned long *curidx)
{
	UI_HASHNODE *cur;

	if(!*current)
		return(NULL);

	cur=(*current)->Next;
	while(!cur && *curidx < (TableSize_-1))
	{
		(*curidx)++;
		cur=Table_[*curidx].Root_;
	}
	*current=cur;
	if(cur)
		return(cur->Record);
	return(NULL);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -