You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
1.7 KiB
94 lines
1.7 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: hashed intrusive linked list.
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//
|
||
|
// Serialization/unserialization buffer
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef UTLNODEHASH_H
|
||
|
#define UTLNODEHASH_H
|
||
|
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include "tier1/utlmemory.h"
|
||
|
#include "tier1/byteswap.h"
|
||
|
#include "tier1/utlintrusivelist.h"
|
||
|
|
||
|
#include <stdarg.h>
|
||
|
|
||
|
// to use this class, your list node class must have a Key() function defined which returns an
|
||
|
// integer type. May add this class to main utl tier when i'm happy w/ it.
|
||
|
template<class T, int HASHSIZE = 7907, class K = int > class CUtlNodeHash
|
||
|
{
|
||
|
|
||
|
int m_nNumNodes;
|
||
|
|
||
|
public:
|
||
|
|
||
|
CUtlIntrusiveDList<T> m_HashChains[HASHSIZE];
|
||
|
|
||
|
CUtlNodeHash( void )
|
||
|
{
|
||
|
m_nNumNodes = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
T *FindByKey(K nMatchKey, int *pChainNumber = NULL)
|
||
|
{
|
||
|
unsigned int nChain=(unsigned int) nMatchKey ;
|
||
|
nChain %= HASHSIZE;
|
||
|
if ( pChainNumber )
|
||
|
*( pChainNumber ) = nChain;
|
||
|
for( T * pNode = m_HashChains[ nChain ].m_pHead; pNode; pNode = pNode->m_pNext )
|
||
|
if ( pNode->Key() == nMatchKey )
|
||
|
return pNode;
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
void Add( T * pNode )
|
||
|
{
|
||
|
unsigned int nChain=(unsigned int) pNode->Key();
|
||
|
nChain %= HASHSIZE;
|
||
|
m_HashChains[ nChain ].AddToHead( pNode );
|
||
|
m_nNumNodes++;
|
||
|
}
|
||
|
|
||
|
|
||
|
void Purge( void )
|
||
|
{
|
||
|
m_nNumNodes = 0;
|
||
|
// delete all nodes
|
||
|
for( int i=0; i < HASHSIZE; i++)
|
||
|
m_HashChains[i].Purge();
|
||
|
}
|
||
|
|
||
|
int Count( void ) const
|
||
|
{
|
||
|
return m_nNumNodes;
|
||
|
}
|
||
|
|
||
|
void DeleteByKey( K nMatchKey )
|
||
|
{
|
||
|
int nChain;
|
||
|
T *pSearch = FindByKey( nMatchKey, &nChain );
|
||
|
if ( pSearch )
|
||
|
{
|
||
|
m_HashChains[ nChain ].RemoveNode( pSearch );
|
||
|
m_nNumNodes--;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
~CUtlNodeHash( void )
|
||
|
{
|
||
|
// delete all lists
|
||
|
Purge();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif
|