
#ifndef __HASH_TABLE_H_
#define __HASH_TABLE_H_

/**
 * @file: hash_table.h
 *
 * Hlavickovy soubor k souboru hash_table.c, ktery implementuje obecnou
 * hashovaci tabulku. Kolize se resi retezenim prvku.
 */

#include <ntddk.h>


/** Prototyp hashovaci funkce
 *
 * Rutina se musi chovat jako hashovaci funkce, tedy napriklad vracet
 * stejne hodnoty hashe pro stejne hodnoty klice.
 *
 * @param Key Klic, ktery je nutne zahashovat.
 *
 * @return Funkce musi vratit integer odpovidajici zahashovane hodnote
 * klice. Neni nutne provadet moduleni na pocet slotu.
 */
typedef ULONG32 (*HASH_FUNCTION) (IN PVOID Key);

/** Prototyp porovnavci funkce. Funkce musi vratit TRUE, pokud objekt
 *  z hashovaci tabulky byl vlozen pod zadanym klicem. 
 *
 *  Implementace hashovaci tabulky nedovoluje duplicity klicu. Porovnavaci
 *  funkce se pouziva pri testu, zda dany objekt jiz v tabulce existuje ci
 *  nikoliv.
 *
 *  @param ObjectInTable Adresa objektu leziciho v hashovaci tabulce.
 *  @param Key Hodnota klice.
 *
 *  @return Funkce musi vratit TRUE, pokud hodnota parametru Key odpovida
 *  hodnote klice, se kterou byl objekt ObjectInTable vlozen do hashovaci
 *  tabulky.
 */
typedef BOOLEAN (*COMPARE_FUNCTION) (IN PVOID ObjectInTable, IN PVOID Key);


/** Tato rutina slouzi k uklidu objektu pri odstranovani hashovaci
 *  tabulky.
 *
 *  Rutina je volana na pouze behem mazani cele hashovaci tabulky na
 *  kazdy objekt, ktery se v ni prave v ten okamzik nachazi.
 *
 * @param Object Objekt, ktery je treba uklidit.
 */
typedef VOID (*FREE_ITEM_FUNCTION) (IN PVOID Object);


// Definice struktry prvku hashovaci tabulky
typedef struct _HASH_ITEM
{
  // Odkaz na naslednika ve spojovem seznamu
  struct _HASH_ITEM *Next;
  // Adresa objektu
  PVOID Object;
} HASH_ITEM, *PHASH_ITEM;


// Struktura hashovaci tabulky
typedef struct _HASH_TABLE
{
  // Pocet slotu
  ULONG32 Size;
  // Adresa hashovaci funkce
  HASH_FUNCTION HashFunction;
  // Porovnavaci funkce
  COMPARE_FUNCTION CompareFunction;
  // Funkce pro uklid objektu pri mazani hashovaci tabulky
  FREE_ITEM_FUNCTION FreeFunction;
  // Zamky reader-writer pro jednotlive sloty
  PERESOURCE Locks;
  // Sloty
  PHASH_ITEM Buckets[1];
} HASH_TABLE, *PHASH_TABLE;

// Vyznam jednotlivych rutin najdete v komentarich u jejich implementace
// v souboru hash_table.c

NTSTATUS HashTableCreate(IN ULONG32 Size, IN HASH_FUNCTION HashFunction, IN COMPARE_FUNCTION CompareFunction, IN FREE_ITEM_FUNCTION FreeFunction, OUT PHASH_TABLE *Table);
VOID HashTableDestroy(IN PHASH_TABLE Table);
NTSTATUS HashTableInsert(IN PHASH_TABLE Table, IN PVOID Object, IN PVOID Key);
PVOID HashTableDelete(IN PHASH_TABLE Table, IN PVOID Key);
PVOID HashTableGet(IN PHASH_TABLE Table, IN PVOID Key);

#endif
