亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? solarhashtable.h

?? 奇跡世界公用文件源代碼,研究網絡游戲的朋友可以研究下
?? H
字號:
// SolarHashTable.h: interface for the SolarHashTable class.
// Hash Table Class version 1.0
// source code created by Min-Wook Kim (taiyo@webzen.co.kr)
// 2004-7-29
// 
//-------------------------------------------------------------------
// History.
// 2004-07-27 : HashTable class was created with MemoryPool
// 2004-07-29 : added m_dwBucketKey
// 2004-12-21 : change class name, CHashTable to SolarHashTable
// 2005-04-26 : added class < KeyType=DWORD >
// 2005-08-08 : added find() method for iterator class 
//-------------------------------------------------------------------
// example)
//
// SolarHashTable<TTT> * hashTable = new SolarHashTable<TTT>;
// hashTable->Initialize(100);
// hashTable->RemoveAll();
// delete hashTable;

// caution) duplicated loop ( duplicated GetNext() traveling ) is bad usage
////////////////////////////////////////////////////////////////////////////

#ifndef __SOLAR_HASH_TABLE_H__
#define __SOLAR_HASH_TABLE_H__

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#include "MemoryPoolFactory.h"

using namespace util;

namespace util
{

template <class T, class KeyType=DWORD >
class SolarHashTable
{	
	class HashBucket;

	class HashList
	{
	public:
		HashList *		pNext;
		HashList *		pPrv;
		HashBucket *	pBucket;
	};

	class HashBucket
	{
	public:
		KeyType			dwKey;
		T				TData;
		HashList *		pList;		// 傈眉 滾哦府膠飄
		HashBucket *	pNext;		// 悼老 虐藹闌 啊瘤綽 滾哦府膠飄俊 措茄 Next
		HashBucket *	pPrv;
		void SetData(T pvoid, KeyType key) { TData = pvoid;dwKey = key; pNext = NULL; pPrv = NULL; }
	};

	BOOL				m_bInited;
protected:
	DWORD				m_dwDataNum;
	DWORD				m_dwMaxBucketNum;
	HashBucket **		m_ppBucketTable;

	/// for iterator
	HashList *			m_pListTail;
	HashList * 			m_pListHead;
	HashList *			m_pListCur;
	
	/// for bucket iterator
	HashBucket *		m_pCurBucket;
	HashBucket*			m_pLastBucket;
	KeyType				m_dwBucketKey;

	// memorypool
	CMemoryPoolFactory<HashBucket>	* m_pHashBucketPool;
	CMemoryPoolFactory<HashList>	* m_pHashListPool;

public:

	SolarHashTable()
	{
		m_dwDataNum			= 0;
		m_dwMaxBucketNum	= 0;
		m_ppBucketTable		= NULL;
		m_pListHead			= NULL;
		m_pListTail			= NULL;
		m_pListCur			= NULL;
		m_pCurBucket		= NULL;
		m_pHashListPool		= NULL;
		m_pHashBucketPool	= NULL;
		m_bInited			= FALSE;
	}

	SolarHashTable( DWORD dwMaxBucketNum )
	{
		m_dwDataNum			= 0;
		m_dwMaxBucketNum	= 0;
		m_ppBucketTable		= NULL;
		m_pListHead			= NULL;
		m_pListTail			= NULL;
		m_pListCur			= NULL;
		m_pCurBucket		= NULL;
		m_pHashListPool		= NULL;
		m_pHashBucketPool	= NULL;
		m_bInited			= FALSE;

		Initialize( dwMaxBucketNum );
	}
	
	virtual ~SolarHashTable()
	{
		RemoveAll();
		if (m_ppBucketTable)
		{
			delete [] m_ppBucketTable;
			m_ppBucketTable = NULL;
		}
		
		if(m_pHashListPool)
		{
			m_pHashListPool->Release();
			delete m_pHashListPool;
			m_pHashListPool = NULL;
		}
		if( m_pHashBucketPool )
		{
			m_pHashBucketPool->Release();
			delete m_pHashBucketPool;
			m_pHashBucketPool = NULL;
		}
	}
	
	inline KeyType		GetDataNum() { return m_dwDataNum; }
	BOOL				Initialize(DWORD dwMaxBucketNum)
	{
		if( m_bInited ) return FALSE;

		ASSERT( NULL == m_pHashBucketPool );
		ASSERT( NULL == m_pHashListPool );
		m_dwDataNum			= 0;
		m_dwMaxBucketNum	= dwMaxBucketNum;
		m_ppBucketTable		= NULL;
		m_pListHead			= NULL;
		m_pListTail			= NULL;
		m_pListCur			= NULL;
		m_pCurBucket		= NULL;
		
		m_pHashBucketPool	= new CMemoryPoolFactory<HashBucket>;
		m_pHashListPool		= new CMemoryPoolFactory<HashList>;
		m_pHashBucketPool->Initialize( dwMaxBucketNum, dwMaxBucketNum/2+1 );
		m_pHashListPool->Initialize( dwMaxBucketNum, dwMaxBucketNum/2+1 );
		
		m_ppBucketTable = new HashBucket *[m_dwMaxBucketNum];
		
		if( !m_ppBucketTable )
			return FALSE;
		
		memset(m_ppBucketTable, 0, sizeof(HashBucket *) * m_dwMaxBucketNum);
		m_bInited			= TRUE;
		return TRUE;
		
	}
	/// don't check for the same key
	BOOL				Add(T TData, KeyType dwKey)
	{
		KeyType index = dwKey % m_dwMaxBucketNum;
		
		HashBucket *	cur = NULL;
		HashBucket *	prv = NULL;
		//HashBucket *	next = NULL;
		
		
		if (!m_ppBucketTable[index])
		{
			
			m_ppBucketTable[index] = m_pHashBucketPool->Alloc();
			m_ppBucketTable[index]->SetData( TData, dwKey );
			m_ppBucketTable[index]->pList = addList(m_ppBucketTable[index]);

		}
		else 
		{
			cur = m_ppBucketTable[index];
			while (cur)
			{
				prv = cur;
				cur = cur->pNext;
			}
			cur = prv->pNext = m_pHashBucketPool->Alloc();
			cur->SetData( TData, dwKey );
			cur->pPrv = prv;
			cur->pList = addList(cur);
			
		}
		m_dwDataNum++;
		
		return TRUE;
	}
	
	T					GetData(KeyType dwKey)
	{
		KeyType index = dwKey % m_dwMaxBucketNum;
		
		HashBucket* pBucket = m_ppBucketTable[index];
		
		while(pBucket)
		{
			if (pBucket->dwKey == dwKey)
			{
				return pBucket->TData;
			}
			pBucket = pBucket->pNext;
		}
		return NULL;
		
	}
	
	T					GetHeadData() { if( !m_pListHead ) return NULL; return m_pListHead->pBucket->TData;	}
	T					GetTailData() { if( !m_pListTail ) return NULL; return m_pListTail->pBucket->TData;	}
	
	/// Iterate List
	inline void			SetFirst() { m_pListCur = m_pListHead; }
	T			 		GetNext()
	{
		if (m_pListCur)
		{
			const T& TData = m_pListCur->pBucket->TData;
			m_pListCur = m_pListCur->pNext;
			return TData;
		}

		return NULL;		
	}

	inline void			SetLast() { m_pListCur = m_pListTail;	}
	T			 		GetPrev()
	{
		if (m_pListCur)
		{
			const T& TData = m_pListCur->pBucket->TData;
			m_pListCur = m_pListCur->pPrv;
			return TData;
		}

		return NULL;		
	}


	
	/// Iterate Bucket Chain List
	void				SetBucketFirst(KeyType dwKey)
	{
		KeyType index = dwKey % m_dwMaxBucketNum;			
		m_dwBucketKey = dwKey;
		m_pCurBucket = m_ppBucketTable[index];
		m_pLastBucket = NULL;
	}		
	T					GetBucketNext()
	{
		while(m_pCurBucket)
		{
			if (m_pCurBucket->dwKey == m_dwBucketKey)
			{
				T	TData = m_pCurBucket->TData;
				m_pLastBucket = m_pCurBucket;
				m_pCurBucket = m_pCurBucket->pNext;
				return TData;
			}
			m_pCurBucket = m_pCurBucket->pNext;
		}
		return NULL;
	}
	void				RemoveCurBucketData()
	{
		KeyType dwIndex = m_dwBucketKey%m_dwMaxBucketNum;
		HashBucket*	cur = m_pLastBucket;
		HashBucket*	prv = NULL;
		HashBucket*	next = NULL;

		prv = cur->pPrv;
		next = cur->pNext;
		if (!prv)
			m_ppBucketTable[dwIndex] = next;
		else 
			prv->pNext = next;

		if (next)
			next->pPrv = prv;

		removeList(cur->pList);
		m_pHashBucketPool->Free(cur);
		cur = NULL;
		--m_dwDataNum;
	}

	
	/// delete bucket, list for (dwKey)
	void				Remove(KeyType dwKey)
	{
		KeyType dwIndex = dwKey % m_dwMaxBucketNum;
		
		HashBucket*	cur = m_ppBucketTable[dwIndex];
		HashBucket*	prv = NULL;
		HashBucket*	next = NULL;
		
		while (cur)
		{
			if (cur->dwKey == dwKey)
			{
				prv = cur->pPrv;
				next = cur->pNext;

				if(cur == m_pCurBucket)			/// for iterator sync
					m_pCurBucket = next;

				if (!prv)
					m_ppBucketTable[dwIndex] = next;
				else 
					prv->pNext = next;
				
				if (next)
					next->pPrv = prv;
				
				removeList(cur->pList);
				m_pHashBucketPool->Free(cur);//delete cur;
				cur = NULL;
				--m_dwDataNum;
				return;
			}
			cur = cur->pNext;
		}
	}

	T					RemoveHead()
	{
		HashList*	cur = m_pListHead;
		if( !cur ) return NULL;
		m_pListHead = m_pListHead->pNext;
		T data = cur->pBucket->TData;

		m_pHashBucketPool->Free(cur->pBucket);	//delete cur->pBucket;
		m_pHashListPool->Free(cur);				//delete cur;

		--m_dwDataNum;

		return data;
	}
	/// delete all of Bucket, List Node
	void				RemoveAll()
	{
		HashList*	cur = m_pListHead;
		HashList*	next = NULL;
		
		while (cur)
		{
			next = cur->pNext;
			m_pHashBucketPool->Free(cur->pBucket);	//delete cur->pBucket;
			m_pHashListPool->Free(cur);				//delete cur;
			cur = next;
		}
		m_dwDataNum = 0;
		m_pListHead = NULL;
		
		if(m_ppBucketTable)
			memset(m_ppBucketTable, 0, sizeof(HashBucket *) * m_dwMaxBucketNum);
	}
	
	//------------------------------------------------------------------------------
	// iterator 
	//------------------------------------------------------------------------------
	class iterator
	{
		friend class SolarHashTable;
		HashList * _current;

	public:
		iterator():_current(NULL){}
		iterator( const iterator & itr ):_current(itr._current){}
		~iterator(){}

		iterator & operator++()
		{
			if( _current ) _current = _current->pNext;
			return *this;
		}
		iterator & operator++( int i )
		{
			if( _current ) _current = _current->pNext;
			return *this;
		}
		iterator & operator--()
		{
			if( _current ) _current = _current->pPrv;
			return *this;
		}
		iterator & operator--( int i )
		{
			if( _current ) _current = _current->pPrv;
			return *this;
		}

		BOOL operator!=( iterator & it )
		{
			return ( it._current != _current );
		}
		BOOL operator==( iterator & it )
		{
			return ( it._current == _current );
		}
		T operator*()
		{
			if( _current ) return _current->pBucket->TData;
			return NULL;
		}
	};

	iterator find( KeyType dwKey )
	{
		KeyType index = dwKey % m_dwMaxBucketNum;

		HashBucket* pBucket = m_ppBucketTable[index];

		while(pBucket)
		{
			if (pBucket->dwKey == dwKey)
			{
				break;
			}
			pBucket = pBucket->pNext;
		}
		iterator it;
		if( pBucket )
			it._current = pBucket->pList;
		else
			it._current = NULL;
		return it;
	}

	iterator begin()
	{
		iterator it;
		it._current = m_pListHead;
		return it;
	}
	iterator end()
	{
		iterator it;
		it._current = NULL;
		return it;
	}

	void erase( iterator & it )
	{
		Remove( it._current->pBucket->dwKey );
	}
	void clear()
	{
		RemoveAll();
		ASSERT( 0 == GetDataNum() );
	}
	
protected:
	HashList *				addList(HashBucket * pBucket)
	{
		HashList*	cur = NULL;
		//HashList*	prv = NULL;
		//HashList*	next = NULL;
		
		if (!m_pListHead)
		{
			m_pListCur = m_pListHead = m_pHashListPool->Alloc();
			m_pListCur->pPrv	= NULL;
			m_pListCur->pNext	= NULL;
			
			m_pListTail = m_pListCur;
			m_pListCur->pBucket = pBucket;
			pBucket->pList = m_pListHead;
			return m_pListHead;
		}
		//else
		{
			cur = m_pListTail->pNext = m_pHashListPool->Alloc();
			cur->pNext	= NULL;
			cur->pPrv	= m_pListTail;
			m_pListTail = cur;
			cur->pBucket = pBucket;
			pBucket->pList = cur;
			return cur;
		}
		//return NULL;
	}
	void				removeList(HashList * pList)
	{
		
	//	HashList*	cur = pList;
		HashList*	prv = pList->pPrv;
		HashList*	next = pList->pNext;
		
		
		if(pList == m_pListCur)		/// for iterator sync
			m_pListCur = next;
		
		if (prv)
			prv->pNext = next;
		else 
			m_pListHead = next;
		
		if (next)
			next->pPrv = prv;
		else
			m_pListTail = prv;
		
		m_pHashListPool->Free(pList);//delete pList;
		pList = NULL;
		
	}
	
};


} /// namespace util




#endif //__SOLAR_HASH_TABLE_H__

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级日韩在线| 精品91自产拍在线观看一区| 99re视频精品| 日韩一区二区三区视频| 亚洲视频图片小说| 国产在线精品视频| 欧美日本一区二区三区四区| 中文字幕中文乱码欧美一区二区| 日本不卡视频在线观看| 91亚洲大成网污www| 2023国产一二三区日本精品2022| 午夜精品福利久久久| 99精品欧美一区| 国产午夜精品久久久久久免费视| 天堂在线亚洲视频| 欧美日韩一区中文字幕| 亚洲日本电影在线| av电影天堂一区二区在线| 久久先锋影音av鲁色资源| 日本一不卡视频| 欧美放荡的少妇| 亚洲一线二线三线视频| 91香蕉国产在线观看软件| 精品国产精品网麻豆系列| 日韩av网站在线观看| 欧美日本韩国一区二区三区视频| 一区二区三区欧美视频| 99久久夜色精品国产网站| 国产精品国产三级国产普通话蜜臀| 精品一区二区久久| 久久综合久色欧美综合狠狠| 九一久久久久久| 2020国产成人综合网| 国产综合久久久久久久久久久久| 日韩欧美国产综合一区 | 中文字幕av在线一区二区三区| 日韩高清一区二区| 日韩精品一区在线| 国产在线播放一区| 国产精品免费久久| 99久久国产综合精品女不卡| 综合在线观看色| 欧美亚洲另类激情小说| 午夜日韩在线电影| 精品久久久久久无| 国产激情91久久精品导航| 久久亚洲精品国产精品紫薇| 国产精品一卡二卡| 日韩伦理免费电影| 欧美高清你懂得| 国产自产v一区二区三区c| 国产清纯在线一区二区www| 不卡一区二区中文字幕| 夜夜操天天操亚洲| 日韩视频123| 成人动漫一区二区在线| 一区二区三区免费看视频| 欧美日韩一二区| 精品在线观看免费| 最新国产成人在线观看| 欧美日韩国产一二三| 国内精品久久久久影院薰衣草| 欧美激情一区二区三区| 在线观看国产日韩| 国精产品一区一区三区mba视频 | 亚洲婷婷在线视频| 欧美男男青年gay1069videost| 久久成人羞羞网站| 亚洲欧美日韩国产一区二区三区| 欧美日韩免费高清一区色橹橹 | 99国产精品久| 日本va欧美va瓶| 亚洲国产精品久久不卡毛片 | 色视频一区二区| 久久超碰97人人做人人爱| 国产精品国产三级国产三级人妇| 欧美日韩激情一区二区| 国产精品系列在线播放| 五月激情六月综合| 成人欧美一区二区三区小说| 欧美放荡的少妇| 99精品久久99久久久久| 美女诱惑一区二区| 亚洲高清一区二区三区| 欧美国产日韩亚洲一区| 884aa四虎影成人精品一区| 成人性生交大片免费看中文| 免费久久99精品国产| 亚洲柠檬福利资源导航| 国产欧美一区二区三区网站 | 亚洲福利电影网| 国产精品天天摸av网| 日韩午夜电影av| 色先锋资源久久综合| 国产 欧美在线| 国产一区二区主播在线| 人人狠狠综合久久亚洲| 亚洲成av人片一区二区梦乃| 一区免费观看视频| 国产欧美日韩不卡| 久久久不卡影院| 91精品国产综合久久婷婷香蕉| 91欧美一区二区| 99久久婷婷国产综合精品| 国产精品一区二区在线观看不卡| 免费在线看成人av| 日产精品久久久久久久性色| 亚洲一区电影777| 亚洲色图视频网站| ...中文天堂在线一区| 国产精品视频一区二区三区不卡| 久久久久久一级片| 久久免费视频色| 国产日韩在线不卡| 国产无一区二区| 国产精品人成在线观看免费| 久久久精品天堂| 国产精品美女久久久久久久久| 国产日韩欧美在线一区| 国产午夜一区二区三区| 国产精品免费视频观看| 最新日韩av在线| 亚洲综合久久久| 日韩精品五月天| 国产综合色精品一区二区三区| 国产一区二区三区综合| 国产精品911| 不卡av免费在线观看| 色婷婷av一区| 欧美精品一卡二卡| 精品免费视频一区二区| 国产日韩欧美高清在线| 最新不卡av在线| 日韩av一区二区在线影视| 看电视剧不卡顿的网站| 国产精品99久久久久久久vr| 99久久99精品久久久久久| 欧美亚洲国产bt| 久久尤物电影视频在线观看| 欧美激情综合五月色丁香| 亚洲天堂2016| 美美哒免费高清在线观看视频一区二区| 久久99国产乱子伦精品免费| 国产91丝袜在线观看| 欧美午夜免费电影| 久久在线观看免费| 亚洲美腿欧美偷拍| 久久99热这里只有精品| 成人av在线一区二区三区| 欧美日韩情趣电影| 久久综合色天天久久综合图片| 自拍偷拍欧美精品| 精品午夜久久福利影院| 一本一本久久a久久精品综合麻豆| 欧美日韩夫妻久久| 欧美激情一区二区| 青草av.久久免费一区| 岛国一区二区在线观看| 欧美高清你懂得| 亚洲欧洲一区二区在线播放| 日韩激情一二三区| 成人av一区二区三区| 欧美人妖巨大在线| 中文字幕一区二区三区在线不卡| 日本视频在线一区| 色欧美乱欧美15图片| 久久综合久久综合亚洲| 午夜视频一区二区三区| 91片在线免费观看| 国产亚洲精品超碰| 精品一区中文字幕| 欧美日韩视频一区二区| 一区在线观看免费| 国产不卡一区视频| 精品国产人成亚洲区| 亚洲综合男人的天堂| 99久久国产综合色|国产精品| 精品久久久久久亚洲综合网| 亚洲成av人片在线观看无码| 不卡视频一二三| 日本一区二区免费在线| 国产精品影视在线| 日韩欧美亚洲国产另类| 亚洲gay无套男同| 色一情一伦一子一伦一区| 国产精品国产三级国产aⅴ入口 | 欧美v亚洲v综合ⅴ国产v| 亚洲综合视频网| 91在线看国产| 中文字幕制服丝袜成人av| 国产精品一区二区三区四区| 精品国产电影一区二区| 麻豆精品一二三| 欧美本精品男人aⅴ天堂| 麻豆91在线播放| 欧美mv日韩mv国产网站| 美国三级日本三级久久99| 日韩欧美成人午夜| 极品少妇一区二区| 久久婷婷成人综合色|