
#ifndef __LISTS_H_
#define __LISTS_H_

/** @file lists.h
 *
 * Hlavickovy soubor k seznam.c.
 *
 * Podpurne rutiny pro praci se spojovymi seznamy.
 */

#include <ntddk.h>

// Prototyp funkce volane pri zruseni kazdeho prvku
typedef VOID (*LIST_DESTROY_ITEM_ROUTINE)(PVOID Item);

// Hlava seznamu
typedef struct _LIST
{
  // Odkaz na predchudce a naslednika
  LIST_ENTRY Head;
  // Spinlock pro synchronizaci
  KSPIN_LOCK Lock;
  // Adresa rutiny, ktera bude volana na kazdy prvek pri ruseni seznamu
  LIST_DESTROY_ITEM_ROUTINE DestroyItem;
} LIST, *PLIST;



// Semantika rutin je popsana u jejich implementace

PLIST lListCreate(POOL_TYPE PoolType, LIST_DESTROY_ITEM_ROUTINE DestroyItem);
VOID lListDestroy(PLIST List);
VOID lListDestroyLock(PLIST List);
BOOLEAN lListEmpty(PLIST List);
BOOLEAN lListEmptyLock(PLIST List);
VOID lListTailInsert(PLIST List, PLIST_ENTRY Item);
VOID lListTailInsertLock(PLIST List, PLIST_ENTRY Item);
VOID lListHeadInsert(PLIST List, PLIST_ENTRY Item);
VOID lListHeadInsertLock(PLIST List, PLIST_ENTRY Item);
PLIST_ENTRY lListHeadRemove(PLIST List);
PLIST_ENTRY lListHeadRemoveLock(PLIST List);
PLIST_ENTRY lListTailRemove(PLIST List);
PLIST_ENTRY lListTailRemoveLock(PLIST List);
VOID lListLock(PLIST List, PKLOCK_QUEUE_HANDLE QHandle);
VOID lListUnlock(PLIST List, PKLOCK_QUEUE_HANDLE QHandle);


#endif
