mirror of https://github.com/tongzx/nt5src
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.
246 lines
4.9 KiB
246 lines
4.9 KiB
#ifndef __HASHTABLE_CPP
|
|
#define __HASHTABLE_CPP
|
|
|
|
/*
|
|
* Class:
|
|
*
|
|
* WmiAllocator
|
|
*
|
|
* Description:
|
|
*
|
|
* Provides abstraction above heap allocation functions
|
|
*
|
|
* Version:
|
|
*
|
|
* Initial
|
|
*
|
|
* Last Changed:
|
|
*
|
|
* See Source Depot for change history
|
|
*
|
|
*/
|
|
|
|
#if 0
|
|
|
|
#include <precomp.h>
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
|
|
#include <HashTable.h>
|
|
|
|
#endif
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
template <class WmiKey,class WmiElement,ULONG HashSize>
|
|
WmiHashTable <WmiKey,WmiElement,HashSize> :: WmiHashTable (
|
|
|
|
WmiAllocator &a_Allocator
|
|
|
|
) : m_Allocator ( a_Allocator ) , m_Buckets ( NULL )
|
|
{
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
template <class WmiKey,class WmiElement,ULONG HashSize>
|
|
WmiHashTable <WmiKey,WmiElement,HashSize> :: ~WmiHashTable ()
|
|
{
|
|
WmiStatusCode t_StatusCode = UnInitialize () ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
template <class WmiKey,class WmiElement,ULONG HashSize>
|
|
WmiStatusCode WmiHashTable <WmiKey,WmiElement,HashSize> :: Initialize ()
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( ! m_Buckets )
|
|
{
|
|
t_StatusCode = m_Allocator.New (
|
|
|
|
( void ** ) & m_Buckets ,
|
|
sizeof ( WmiBasicTree <WmiKey,WmiElement> ) * HashSize
|
|
) ;
|
|
|
|
if ( t_StatusCode == e_StatusCode_Success )
|
|
{
|
|
for ( ULONG t_Index = 0 ; t_Index < HashSize ; t_Index ++ )
|
|
{
|
|
:: new ( ( void * ) & m_Buckets [ t_Index ] ) WmiBasicTree <WmiKey,WmiElement> ( m_Allocator ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_Buckets = NULL ;
|
|
}
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
template <class WmiKey,class WmiElement,ULONG HashSize>
|
|
WmiStatusCode WmiHashTable <WmiKey,WmiElement,HashSize> :: UnInitialize ()
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Buckets )
|
|
{
|
|
for ( ULONG t_Index = 0 ; t_Index < HashSize ; t_Index ++ )
|
|
{
|
|
m_Buckets [ t_Index ].WmiBasicTree <WmiKey,WmiElement> :: ~WmiBasicTree <WmiKey,WmiElement> () ;
|
|
}
|
|
|
|
t_StatusCode = m_Allocator.Delete (
|
|
|
|
( void * ) m_Buckets
|
|
) ;
|
|
|
|
m_Buckets = NULL;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
template <class WmiKey,class WmiElement,ULONG HashSize>
|
|
WmiStatusCode WmiHashTable <WmiKey,WmiElement,HashSize> :: Insert (
|
|
|
|
const WmiKey &a_Key ,
|
|
const WmiElement &a_Element
|
|
)
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Buckets )
|
|
{
|
|
ULONG t_Hash = Hash ( a_Key ) % HashSize ;
|
|
|
|
WmiBasicTree <WmiKey,WmiElement> *t_Tree = &m_Buckets [ t_Hash ] ;
|
|
|
|
WmiBasicTree <WmiKey,WmiElement> :: Iterator t_Iterator ;
|
|
t_StatusCode = t_Tree->Insert ( a_Key , a_Element ,t_Iterator ) ;
|
|
}
|
|
else
|
|
{
|
|
t_StatusCode = e_StatusCode_NotInitialized ;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
template <class WmiKey,class WmiElement,ULONG HashSize>
|
|
WmiStatusCode WmiHashTable <WmiKey,WmiElement,HashSize> :: Delete (
|
|
|
|
const WmiKey &a_Key
|
|
)
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Buckets )
|
|
{
|
|
ULONG t_Hash = Hash ( a_Key ) % HashSize ;
|
|
|
|
WmiBasicTree <WmiKey,WmiElement> *t_Tree = &m_Buckets [ t_Hash ] ;
|
|
t_StatusCode = t_Tree->Delete ( a_Key ) ;
|
|
}
|
|
else
|
|
{
|
|
t_StatusCode = e_StatusCode_NotInitialized ;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
/******************************************************************************
|
|
*
|
|
* Name:
|
|
*
|
|
*
|
|
* Description:
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
|
|
template <class WmiKey,class WmiElement,ULONG HashSize>
|
|
WmiStatusCode WmiHashTable <WmiKey,WmiElement,HashSize> :: Find (
|
|
|
|
const WmiKey &a_Key ,
|
|
WmiElement &a_Element
|
|
)
|
|
{
|
|
WmiStatusCode t_StatusCode = e_StatusCode_Success ;
|
|
|
|
if ( m_Buckets )
|
|
{
|
|
ULONG t_Hash = Hash ( a_Key ) % HashSize ;
|
|
|
|
WmiBasicTree <WmiKey,WmiElement> *t_Tree = &m_Buckets [ t_Hash ] ;
|
|
|
|
WmiBasicTree <WmiKey,WmiElement> :: Iterator a_Iterator ;
|
|
t_StatusCode = t_Tree->Find ( a_Key , a_Iterator ) ;
|
|
a_Element = a_Iterator.GetElement () ;
|
|
}
|
|
else
|
|
{
|
|
t_StatusCode = e_StatusCode_NotInitialized ;
|
|
}
|
|
|
|
return t_StatusCode ;
|
|
}
|
|
|
|
#endif __HASHTABLE_CPP
|