138 lines
3.7 KiB
C
138 lines
3.7 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1999, Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
sample\hashtable.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
The file contains the header for hashtable.c.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _HASH_TABLE_H_
|
||
|
#define _HASH_TABLE_H_
|
||
|
|
||
|
|
||
|
typedef VOID (*PVOID_FUNCTION)
|
||
|
(PLIST_ENTRY pleEntry);
|
||
|
|
||
|
typedef PVOID_FUNCTION PDISPLAY_FUNCTION;
|
||
|
|
||
|
typedef PVOID_FUNCTION PFREE_FUNCTION;
|
||
|
|
||
|
typedef ULONG (*PHASH_FUNCTION)
|
||
|
(PLIST_ENTRY pleEntry);
|
||
|
|
||
|
// < 0 KeyEntry less than TableEntry
|
||
|
// 0 KeyEntry identical TableEntry
|
||
|
// > 0 KeyEntry more than TableEntry
|
||
|
typedef LONG (*PCOMPARE_FUNCTION)
|
||
|
(PLIST_ENTRY pleTableEntry,
|
||
|
PLIST_ENTRY pleKeyEntry);
|
||
|
|
||
|
typedef struct _HASH_TABLE
|
||
|
{
|
||
|
ULONG ulNumBuckets; // # buckets in hash table
|
||
|
ULONG ulNumEntries; // # entries in hash table
|
||
|
|
||
|
PDISPLAY_FUNCTION pfnDisplay; // display an entry (optional)
|
||
|
PFREE_FUNCTION pfnFree; // free an entry
|
||
|
PHASH_FUNCTION pfnHash; // hash an entry
|
||
|
PCOMPARE_FUNCTION pfnCompare; // compare two entries
|
||
|
|
||
|
PLIST_ENTRY pleBuckets; // the buckets
|
||
|
} HASH_TABLE, *PHASH_TABLE;
|
||
|
|
||
|
|
||
|
|
||
|
// Create the hash table
|
||
|
DWORD
|
||
|
HT_Create(
|
||
|
IN HANDLE hHeap,
|
||
|
IN ULONG ulNumBuckets,
|
||
|
IN PDISPLAY_FUNCTION pfnDisplay OPTIONAL,
|
||
|
IN PFREE_FUNCTION pfnFree,
|
||
|
IN PHASH_FUNCTION pfnHash,
|
||
|
IN PCOMPARE_FUNCTION pfnCompare,
|
||
|
OUT PHASH_TABLE *pphtHashTable);
|
||
|
|
||
|
// Destroy the hash table
|
||
|
DWORD
|
||
|
HT_Destroy(
|
||
|
IN HANDLE hHeap,
|
||
|
IN PHASH_TABLE phtTable);
|
||
|
|
||
|
// Clean hash table by destroying all entries
|
||
|
DWORD
|
||
|
HT_Cleanup(
|
||
|
IN PHASH_TABLE phtHashTable);
|
||
|
|
||
|
// Display all entries in the hash table
|
||
|
#define HT_Display(phtHashTable) \
|
||
|
{ \
|
||
|
if (phtHashTable) \
|
||
|
HT_MapCar(phtHashTable, phtHashTable->pfnDisplay); \
|
||
|
}
|
||
|
|
||
|
// # entries in the hash table
|
||
|
#define HT_Size(phtHashTable) \
|
||
|
( \
|
||
|
phtHashTable->ulNumEntries \
|
||
|
)
|
||
|
|
||
|
// Is hash table empty?
|
||
|
#define HT_IsEmpty(phtHashTable) \
|
||
|
( \
|
||
|
HT_Size(phtHashTable) is 0 \
|
||
|
)
|
||
|
|
||
|
// Inserts an entry in the hash table
|
||
|
DWORD
|
||
|
HT_InsertEntry(
|
||
|
IN PHASH_TABLE phtHashTable,
|
||
|
IN PLIST_ENTRY pleEntry);
|
||
|
|
||
|
// Gets the hash table entry with the given key
|
||
|
DWORD
|
||
|
HT_GetEntry(
|
||
|
IN PHASH_TABLE phtHashTable,
|
||
|
IN PLIST_ENTRY pleKey,
|
||
|
OUT PLIST_ENTRY *ppleEntry);
|
||
|
|
||
|
// Delete an entry from the hash table
|
||
|
DWORD
|
||
|
HT_DeleteEntry(
|
||
|
IN PHASH_TABLE phtHashTable,
|
||
|
IN PLIST_ENTRY pleKey,
|
||
|
OUT PLIST_ENTRY *ppleEntry);
|
||
|
|
||
|
// Remove this entry from the hash table
|
||
|
#define HT_RemoveEntry(phtHashTable, pleEntry) \
|
||
|
( \
|
||
|
RemoveEntryList(pleEntry) \
|
||
|
phtHashTable->ulNumEntries--; \
|
||
|
)
|
||
|
|
||
|
DWORD
|
||
|
HT_DeleteEntry(
|
||
|
IN PHASH_TABLE phtHashTable,
|
||
|
IN PLIST_ENTRY pleKey,
|
||
|
OUT PLIST_ENTRY *ppleEntry);
|
||
|
|
||
|
// Is key present in the hash table?
|
||
|
BOOL
|
||
|
HT_IsPresentEntry(
|
||
|
IN PHASH_TABLE phtHashTable,
|
||
|
IN PLIST_ENTRY pleKey);
|
||
|
|
||
|
// Apply the specified function to all entries in the hash table
|
||
|
DWORD
|
||
|
HT_MapCar(
|
||
|
IN PHASH_TABLE phtHashTable,
|
||
|
IN PVOID_FUNCTION pfnVoidFunction);
|
||
|
|
||
|
#endif // _HASH_TABLE_H_
|