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

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

?? tmap.h

?? TFixedAlloc類是一個非常不錯的使用與Linux和windows跨平臺的內存分配工具
?? H
字號:
#ifndef __TMap_H__
#define __TMap_H__
//#include "TypeDef.h"
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include "TPlex.h" //Define class TPlex

#define MAX_HASHKEY_LEN		40

template< class ARG_KEY >
inline TUINT HashKey( ARG_KEY key )
{
	// default identity hash - works for most primitive values
	return ((TUINT)(void*)(TDWORD)key) >> 4;
}

template< class TYPE, class ARG_TYPE >
TBOOL CompareElements( const TYPE * pElement1, const ARG_TYPE * pElement2 )
{
	return *pElement1 == *pElement2;
}

//****************************************** TMap -> ***********************************************//
//
template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>
class TMap  
{
protected:
	// Association
	struct CAssoc
	{
		CAssoc * pNext;
		TUINT nHashValue;	// needed for efficient iteration
		KEY key;
		VALUE value;
	};
public:
// Construction
	TMap(int nBlockSize = 10);
	virtual ~TMap();

// Attributes
	// number of elements
	int GetCount() const;
	TBOOL IsEmpty() const;

	// Lookup
	TBOOL Lookup( ARG_KEY key,VALUE& rValue ) const;

// Operations
	// Lookup and add if not there
	VALUE& operator[]( ARG_KEY key );

	// add a new (key,value) pair
	void SetAt( ARG_KEY key,ARG_VALUE newValue );

	// removing existing (key,?) pair
	TBOOL RemoveKey( ARG_KEY key );    //待查???
	void RemoveAll();

	// iterating all (key,value) pairs
	TPOSITION GetStartPosition() const;
	void GetNextAssoc( TPOSITION& rNextPosition,KEY& rKey,VALUE& rValue ) const;

	// advanced features for derived classes
	TUINT GetHashTableSize() const;
	void InitHashTable( TUINT hashSize,TBOOL bAllocNow = TTRUE );

// Implementation
protected:
	CAssoc ** m_pHashTable;
	TUINT m_nHashTableSize;
	int m_nCount;
	CAssoc * m_pFreeList;
	struct TPlex * m_pBlocks;
	int m_nBlockSize;

	CAssoc * NewAssoc();
	void FreeAssoc( CAssoc * );
	CAssoc * GetAssocAt( ARG_KEY,TUINT& ) const;

	//void Serialize( CArchive& );

};
// TMap<KEY, ARG_KEY, VALUE, ARG_VALUE> in-of-line functions
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
inline int TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::GetCount() const
	{ return m_nCount; }
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
inline TBOOL TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::IsEmpty() const
	{ return m_nCount == 0; }
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
inline void TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::SetAt( ARG_KEY key, ARG_VALUE newValue )
	{ (*this)[ key ] = newValue; }
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
inline TPOSITION TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::GetStartPosition() const
	{ return (m_nCount == 0) ? TNULL : TBEFORE_START_POSITION; }
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
inline TUINT TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::GetHashTableSize() const
	{ return m_nHashTableSize; }
// TMap<KEY, ARG_KEY, VALUE, ARG_VALUE> out-of-line functions
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::TMap( int nBlockSize )
{
	assert( nBlockSize>0 );

	m_pHashTable = TNULL;
	m_nHashTableSize = 17;	//default size
	m_nCount = 0;
	m_pFreeList = TNULL;
	m_pBlocks = TNULL;
	m_nBlockSize = nBlockSize;
}

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::~TMap()
{
	RemoveAll();
	assert( m_nCount==0 );
}

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
TBOOL TMap< KEY, ARG_KEY, VALUE, ARG_VALUE>::Lookup( ARG_KEY key, VALUE& rValue ) const
{
	//ASSERT_VALID( this );
	TUINT nHash;
	CAssoc * pAssoc = GetAssocAt( key,nHash );
	if( pAssoc==TNULL )
		return TFALSE; // not in map
	rValue = pAssoc->value;
	return TTRUE;
}

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
VALUE& TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::operator[]( ARG_KEY key )
{
	//ASSERT_VALID( this );

	TUINT nHash;
	CAssoc * pAssoc;
	if( (pAssoc=GetAssocAt(key,nHash))==TNULL )
	{
		if( m_pHashTable==TNULL )
			InitHashTable( m_nHashTableSize );

		// it doesn't exist ,add a new Association
		pAssoc = NewAssoc();
		pAssoc->nHashValue = nHash;
		pAssoc->key = key;
		// 'pAssoc->value' is a constructed object , nothing more

		// put into hash table
		pAssoc->pNext = m_pHashTable[nHash];
		m_pHashTable[nHash] = pAssoc;
	}
	return pAssoc->value;	// return new reference
}

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
TBOOL TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::RemoveKey( ARG_KEY key )	// remove key - return TRUE if removed
{
	//ASSERT_VALID( this );
	if( m_pHashTable==TNULL )
		return TFALSE;	// nothing in the table

	CAssoc ** ppAssocPrev;
	ppAssocPrev = &m_pHashTable[ HashKey<ARG_KEY>(key) % m_nHashTableSize ];

	CAssoc * pAssoc;
	for( pAssoc = *ppAssocPrev; pAssoc!=TNULL; pAssoc = pAssoc->pNext )
	{
		if( CompareElements(&pAssoc->key,&key) ) 
		{
			// remove it
			*ppAssocPrev = pAssoc->pNext;	//remove from list
			FreeAssoc( pAssoc );
			return TTRUE;
		}
		ppAssocPrev = & pAssoc->pNext;
	}
	return TFALSE;	// not found
}

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
void TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::RemoveAll()
{
	//ASSERT_VALID( this );
	if( m_pHashTable!=TNULL )
	{
		// destroy elements (values and keys)
		for( TUINT nHash=0; nHash < m_nHashTableSize; nHash++ )
		{
			CAssoc * pAssoc;
			for( pAssoc = m_pHashTable[nHash]; pAssoc!=TNULL; pAssoc = pAssoc->pNext )  
			{
				//DestructElements<VALUE>(&pAssoc->value, 1);
				//DestructElements<KEY>(&pAssoc->key, 1);
			}
		}
	}
	// free hash table
	delete [] m_pHashTable;
	m_pHashTable = TNULL;

	m_nCount = 0;
	m_pFreeList = TNULL;
	m_pBlocks->FreeDataChain();
	m_pBlocks = TNULL;
}

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
void TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::GetNextAssoc( TPOSITION& rNextPosition,KEY& rKey, VALUE& rValue ) const
{
	//ASSERT_VALID( this );
	assert( m_pHashTable!=TNULL );	//never call on empty map
	
	CAssoc * pAssocRet = (CAssoc *)rNextPosition;
	assert( pAssocRet!=TNULL );

	if( pAssocRet==(CAssoc *)TBEFORE_START_POSITION )
	{
		// find the first association
		for( TUINT nBucket = 0; nBucket < m_nHashTableSize; nBucket++ )
			if( (pAssocRet = m_pHashTable[nBucket]) != TNULL )
				break;
		assert( pAssocRet != TNULL );	// must find something
	}

	// find next association
	CAssoc * pAssocNext;
	if( (pAssocNext = pAssocRet->pNext) == TNULL )
	{
		// go to next bucket
		for( TUINT nBucket = pAssocRet->nHashValue+1; nBucket<m_nHashTableSize; nBucket++ )
			if( (pAssocNext=m_pHashTable[nBucket]) != TNULL )
				break;
	}
	
	rNextPosition = (TPOSITION) pAssocNext;

	//fill in return data
	rKey = pAssocRet->key;
	rValue = pAssocRet->value;
}

// Used to force allocation of a hash table or to override the default
//   hash table size of (which is fairly small)
template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
void TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::InitHashTable( TUINT nHashSize, TBOOL bAllocNow )
{
	//ASSERT_VALID( this );
	assert( m_nCount==0 );
	assert( nHashSize>0 );

	if( m_pHashTable!=TNULL )
	{
		// free hash table
		delete [] m_pHashTable;
		m_pHashTable = TNULL;
	}

	if( bAllocNow )
	{
		m_pHashTable = new CAssoc*[nHashSize];
		memset( m_pHashTable,0,sizeof(CAssoc *)*nHashSize );
	}
	m_nHashTableSize = nHashSize;
}

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::CAssoc*
TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::NewAssoc()
{
	if( m_pFreeList==TNULL )
	{
		// add another block
		TPlex * newBlock = TPlex::Create( m_pBlocks,m_nBlockSize,sizeof(TMap::CAssoc) );
		// chain them into free list
		TMap::CAssoc * pAssoc = (TMap::CAssoc *)newBlock->data();
		// free in reverse order to make it easier to debug
		pAssoc += m_nBlockSize - 1;
		for( int i = m_nBlockSize-1; i>=0; i--,pAssoc-- )
		{
			pAssoc->pNext = m_pFreeList;
			m_pFreeList = pAssoc;
		}
	}
	assert( m_pFreeList!=TNULL ); //we must have something

	TMap::CAssoc * pAssoc = m_pFreeList;
	m_pFreeList = m_pFreeList->pNext;
	m_nCount ++;
	assert( m_nCount>0 );	//make sure we don't overflow
	//ConstructElements<KEY>(&pAssoc->key, 1);
	//ConstructElements<VALUE>(&pAssoc->value, 1);   // special construct values
	return pAssoc;
}

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
void TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::FreeAssoc( TMap::CAssoc* pAssoc )
{
	//DestructElements<VALUE>(&pAssoc->value, 1);
	//DestructElements<KEY>(&pAssoc->key, 1);
	pAssoc->pNext = m_pFreeList;
	m_pFreeList = pAssoc;
	m_nCount--;
	assert( m_nCount>=0 );	// make sure we don't underflow

	// if no more elements, cleanup completely
	if( m_nCount==0 )
		RemoveAll();
}

template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >
TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::CAssoc*
TMap< KEY, ARG_KEY, VALUE, ARG_VALUE >::GetAssocAt( ARG_KEY key, TUINT& nHash ) const // find association (or return TNULL)
{
	nHash = HashKey<ARG_KEY>(key) % m_nHashTableSize;

	if( m_pHashTable==TNULL )
		return TNULL;
	// see if it exists
	CAssoc * pAssoc;
	for( pAssoc = m_pHashTable[nHash]; pAssoc!=TNULL; pAssoc=pAssoc->pNext )
	{
		if( CompareElements(&pAssoc->key,&key) )
			return pAssoc;
	}
	return TNULL;
}
//
//****************************************** <- TMap ***********************************************//
//**************************************************************************************************//
//****************************************** TMapStringToPtr -> ***********************************************//
//
class TMapStringToPtr
{
public:
	struct CAssoc
	{
		CAssoc * pNext;
		TUINT nHashValue;
		char key[MAX_HASHKEY_LEN];
		void * value;
	};
public:
	TMapStringToPtr();
	TMapStringToPtr( int nBlockSize );
	virtual ~TMapStringToPtr();

	int GetCount() const;
	TBOOL IsEmpty() const;

	TBOOL Lookup( TLPCSTR key,void *& rValue ) const;
	TBOOL LookupKey( TLPCSTR key,TLPCSTR & rkey ) const;

	void *& operator[]( TLPCSTR key );

	void SetAt( TLPCSTR key,void * newValue );

	TBOOL RemoveKey( TLPCSTR key );
	void RemoveAll();

	TPOSITION GetStartPosition() const;
	void GetNextAssoc( TPOSITION & rNextPosition,char *& rKey,void *& rValue) const;


	TUINT GetHashTableSize() const;
	void InitHashTable( TUINT hashSize,TBOOL bAllocNow = TTRUE );

	TUINT HashKey( TLPCSTR key ) const;

protected:
	CAssoc ** m_pHashTable;
	TUINT m_nHashTableSize;
	int m_nCount;
	CAssoc * m_pFreeList;
	struct TPlex * m_pBlocks;
	int m_nBlockSize;

	CAssoc * NewAssoc();
	void FreeAssoc( CAssoc * );
	CAssoc * GetAssocAt( TLPCSTR ,TUINT & ) const;

protected:
	typedef char * BASE_KEY;
	typedef TLPCSTR BASE_ARG_KEY;
	typedef void * BASE_VALUE;
	typedef void * BASE_ARG_VALUE;
};
// TMapStringToPtr in-of-line functions
inline int TMapStringToPtr::GetCount() const
{
	return m_nCount;
}
inline TBOOL TMapStringToPtr::IsEmpty() const
{
	return m_nCount==0;
}
inline void TMapStringToPtr::SetAt( TLPCSTR key,void * newValue )
{
	(*this)[key] = newValue;
}
inline TPOSITION TMapStringToPtr::GetStartPosition() const
{
	return (m_nCount==0) ? TNULL : TBEFORE_START_POSITION;
}
inline TUINT TMapStringToPtr::GetHashTableSize() const
{
	return m_nHashTableSize;
}
//
//****************************************** <- TMapStringToPtr ***********************************************//
//*************************************************************************************************************//
//****************************************** TTypedPtrMap -> ***********************************************//
//
template< class BASE_CLASS, class KEY, class VALUE >
class TTypedPtrMap : public BASE_CLASS
{
public:
// construction
	TTypedPtrMap( int nBlockSize = 10 )
		: BASE_CLASS( nBlockSize ) {};

	// Lookup
	//ZBOOL Lookup(ZLPCSTR key, VALUE& rValue) const
	//	{ return BASE_CLASS::Lookup(key, (BASE_CLASS::BASE_VALUE&)rValue); }

	TBOOL Lookup( TLPCSTR key,VALUE & rValue ) const
	{
		return BASE_CLASS::Lookup(key,(void *&)rValue);
	}

	// Lookup and add if not there
	VALUE& operator[]( TLPCSTR key )
	{
		return (VALUE&)BASE_CLASS::operator[]( key );
	}

	// add a new key( key,value) pair
	void SetAt( KEY key,VALUE newValue )
	{
		return BASE_CLASS::SetAt(key,newValue);
	}

	//removing existing(key ,?) pair
	TBOOL RemoveKey( KEY key )
	{
		return BASE_CLASS::RemoveKey( key );
	}

	// iteration
	//void GetNextAssoc( TPOSITION& rPosition, KEY& rKey, VALUE& rValue) const
	//	{ BASE_CLASS::GetNextAssoc(rPosition, (char*&)rKey,
	//		(BASE_CLASS::BASE_VALUE&)rValue); }

	void GetNextAssoc( TPOSITION& rPosition,KEY& rKey,VALUE& rValue) const
	{
		BASE_CLASS::GetNextAssoc( rPosition, (char*&)rKey,(void*&)rValue);
	}
};
//
//****************************************** <- TTypedPtrMap ***********************************************//
#endif //__TMap_H__



















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区免费看| 91精品国产aⅴ一区二区| 欧美日韩精品是欧美日韩精品| 欧美电影免费提供在线观看| 中文字幕一区二区视频| 日本aⅴ免费视频一区二区三区| 成人黄色软件下载| 欧美一二三四在线| 夜夜嗨av一区二区三区四季av | 亚洲国产日产av| 国产成a人无v码亚洲福利| 制服视频三区第一页精品| 亚洲欧美日韩国产另类专区| 国产一区福利在线| 欧美一级专区免费大片| 亚洲一级在线观看| 在线一区二区三区| 亚洲猫色日本管| 不卡区在线中文字幕| 欧美国产欧美亚州国产日韩mv天天看完整 | 欧美视频精品在线观看| 日韩伦理电影网| 成人亚洲精品久久久久软件| 精品伦理精品一区| 麻豆国产精品777777在线| 欧美日韩一区二区三区免费看| 亚洲色图在线播放| 91同城在线观看| 亚洲欧美一区二区视频| 成人激情电影免费在线观看| 国产女主播在线一区二区| 国内久久精品视频| 久久综合久久99| 国产一区二区三区久久久| 欧美mv日韩mv| 国产精品亚洲人在线观看| 精品免费视频.| 国内成人自拍视频| 久久精品欧美日韩| 成人自拍视频在线| 亚洲色图一区二区三区| 色综合天天做天天爱| 亚洲女人的天堂| 91精彩视频在线观看| 亚洲午夜精品网| 3751色影院一区二区三区| 日韩国产欧美三级| 久久综合九色欧美综合狠狠| 国产一区二区美女诱惑| 国产精品日韩成人| 欧美自拍偷拍一区| 青青草成人在线观看| 精品久久久久久久久久久院品网| 精品一区二区免费在线观看| 久久精品视频在线免费观看| 成人黄色国产精品网站大全在线免费观看| 国产精品卡一卡二| 欧美日韩国产在线播放网站| 免费成人你懂的| 国产女同性恋一区二区| 色老头久久综合| 蜜桃久久久久久久| 日韩一区中文字幕| 欧美猛男男办公室激情| 国产自产高清不卡| 依依成人综合视频| 精品福利一区二区三区| 不卡在线视频中文字幕| 午夜成人免费电影| 欧美激情一区二区在线| 色婷婷精品大视频在线蜜桃视频| 日本怡春院一区二区| 国产精品你懂的在线| 51精品久久久久久久蜜臀| 成人h动漫精品一区二| 日韩一区欧美二区| 中文字幕一区二| 精品成a人在线观看| 色综合久久88色综合天天免费| 蓝色福利精品导航| 亚洲图片一区二区| 欧美国产综合色视频| 欧美三电影在线| 成a人片国产精品| 经典三级一区二区| 亚洲电影在线播放| 欧美国产精品v| 日韩视频一区二区三区在线播放 | 亚洲高清免费视频| 亚洲综合在线观看视频| 欧美色视频在线| 高清久久久久久| 免费在线欧美视频| 亚洲一区二区三区中文字幕| 久久午夜老司机| 91精品国产综合久久婷婷香蕉| 国产成人av影院| 极品少妇一区二区三区精品视频| 亚洲1区2区3区4区| 亚洲精品ww久久久久久p站| 久久久久久97三级| 久久先锋影音av鲁色资源网| 91精品国产全国免费观看| 日本高清免费不卡视频| 成人精品免费网站| 国产成人av网站| 国产成人无遮挡在线视频| 精品影院一区二区久久久| 日韩vs国产vs欧美| 日韩福利电影在线观看| 亚洲午夜精品网| 丝瓜av网站精品一区二区| 亚洲女子a中天字幕| 中文字幕中文字幕一区| 国产精品国产三级国产aⅴ原创 | 久久精品国产精品亚洲综合| 亚洲va国产天堂va久久en| 亚洲一区二区欧美激情| 亚洲综合另类小说| 亚洲国产成人高清精品| 亚洲国产日韩一区二区| 亚洲国产美国国产综合一区二区| 亚洲在线免费播放| 日韩福利电影在线观看| 久久精品久久99精品久久| 国产成人综合亚洲91猫咪| 丰满少妇久久久久久久| 成人av片在线观看| 91九色最新地址| 欧美精品日日鲁夜夜添| 日韩免费电影一区| 久久久国产一区二区三区四区小说| 久久久久久毛片| 中文字幕在线观看一区二区| 亚洲精品一二三| 日本欧美在线观看| 高清av一区二区| 欧美最猛性xxxxx直播| 91 com成人网| 久久美女艺术照精彩视频福利播放| 国产欧美一区二区在线观看| 亚洲免费伊人电影| 秋霞午夜av一区二区三区| 国产麻豆欧美日韩一区| 99v久久综合狠狠综合久久| 欧美在线观看视频在线| 成人午夜av在线| 91国产成人在线| 91网址在线看| 久久夜色精品国产噜噜av| 国产女人18毛片水真多成人如厕| 国产欧美一区在线| 亚洲丝袜美腿综合| 久久国产尿小便嘘嘘尿| 国产成人av一区二区三区在线 | 亚洲国产日日夜夜| 日韩**一区毛片| 国产精品123| 国产·精品毛片| 884aa四虎影成人精品一区| 日韩免费一区二区| 亚洲欧洲日韩av| 日韩高清中文字幕一区| 波多野结衣亚洲| 337p亚洲精品色噜噜噜| 久久精品亚洲精品国产欧美| 日韩一区欧美二区| 粉嫩在线一区二区三区视频| 日本乱人伦一区| 久久男人中文字幕资源站| 一区二区三区国产豹纹内裤在线| 日本午夜一区二区| 成人免费视频视频在线观看免费| 成人综合激情网| 久久综合久久综合久久| 一区二区日韩av| 紧缚捆绑精品一区二区| 欧美精品在线视频| 国产精品美女一区二区三区| 午夜精品久久久久久久久久| 国产美女一区二区三区| 色国产综合视频| 一区二区成人在线| 91美女片黄在线| 精品国产百合女同互慰| 亚洲国产视频一区二区| 一本到一区二区三区| 久久久亚洲精品石原莉奈| 亚洲成人免费在线| av电影天堂一区二区在线| 久久亚洲精华国产精华液| 日本欧美在线观看| 欧美伊人精品成人久久综合97| 欧美成人福利视频| 免费成人结看片| 欧美电影一区二区| 亚洲一区二区三区美女| 欧美三级电影精品| 一区二区三区中文字幕在线观看| 国产福利一区在线|