Source code of Windows XP (NT5)
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

#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