source-engine/utils/shadercompile/utlnodehash.h

94 lines
1.7 KiB
C
Raw Permalink Normal View History

2020-04-23 00:56:21 +08:00
//========= 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