blob: b42a2fae1ca744f089dfd255b26a48d8de88ed07 [file] [log] [blame]
#ifndef _LISTS_H_
#define _LISTS_H_
#define LIST_START -1 /* Handy Constants that substitute for item positions */
#define LIST_END 0 /* END_OF_LIST means one past current length of list when */
/* inserting. Otherwise it refers the last item in the list. */
typedef struct
{
void *ptr;
unsigned int size;
} HandleRecord;
typedef void **Handle;
typedef int (*CompareFunction)(void *data1, void *data2) ;
typedef struct ListStructTag
{
int signature; /* debugging aid */
int percentIncrease; /* %of current size to increase by when list is out of space */
int minNumItemsIncrease; /* fixed number of items to increase by when list is out of space */
int listSize; /* number of items than can fit in the currently allocated memory */
int itemSize; /* the size of each item in the list (same for every item) */
int numItems; /* number of items currently in the list */
unsigned char itemList[1]; /* resizable array of list elements */
} ListStruct;
typedef struct ListStructTag **list_t; /* The list abstract data type */
typedef int ( * ListApplicationFunc)(int index, void *ptrToItem, void *callbackData);
/* Basic List Operations */
list_t ListCreate(int elementSize);
int ListNumItems(list_t list);
int ListInsertItem(list_t list, void *ptrToItem, int itemPosition);
int ListInsertItems(list_t list, void *ptrToItems, int firstItemPosition, int numItemsToInsert);
void ListDispose(list_t list);
void *ListGetPtrToItem(list_t list, int itemPosition);
void ListRemoveItem(list_t list, void *itemDestination, int itemPosition);
void ListRemoveItems(list_t list, void *itemsDestination, int firstItemPosition, int numItemsToRemove);
#if 0 /* rarely ever used; kept here for reference just in case ... */
void ListDisposePtrList(list_t list);
void ListGetItem(list_t list, void *itemDestination, int itemPosition);
void ListReplaceItem(list_t list, void *ptrToItem, int itemPosition);
void ListRemoveItem(list_t list, void *itemDestination, int itemPosition);
void ListGetItems(list_t list, void *itemsDestination, int firstItemPosition, int numItemsToGet);
void ListReplaceItems(list_t list, void *ptrToItems, int firstItemPosition, int numItemsToReplace);
void ListRemoveItems(list_t list, void *itemsDestination, int firstItemPosition, int numItemsToRemove);
list_t ListCopy(list_t originalList);
int ListAppend(list_t list1, list_t list2);
void ListClear(list_t list);
int ListEqual(list_t list1, list_t list2);
int ListInsertInOrder(list_t list, void *ptrToItem, CompareFunction compareFunction);
void *ListGetDataPtr(list_t list);
int ListApplyToEach(list_t list, int ascending, ListApplicationFunc funcToApply, void *callbackData);
/* List Searching and Sorting */
int ListFindItem(list_t list, void *ptrToItem, int startingPosition, CompareFunction compareFunction);
void ListRemoveDuplicates(list_t list, CompareFunction compareFunction);
int ListBinSearch(list_t list, void *itemPtr, CompareFunction compareFunction);
void ListQuickSort(list_t list, CompareFunction compareFunction);
void ListHeapSort(list_t list, CompareFunction compareFunction);
void ListInsertionSort(list_t list, CompareFunction compareFunction);
int ListIsSorted(list_t list, CompareFunction compareFunction);
/* Advanced List Functions */
void ListSetAllocationPolicy(list_t list, int minItemsPerAlloc, int percentIncreasePerAlloc);
void ListCompact(list_t list);
int ListPreAllocate(list_t list, int numItems);
int ListGetItemSize(list_t list);
int GetIntListFromParmInfo(va_list parmInfo, int numIntegers, list_t *integerList);
int ListInsertAfterItem(list_t list, void *ptrToItem, void *ptrToItemToInsertAfter, CompareFunction compareFunction);
int ListInsertBeforeItem(list_t list, void *ptrToItem, void *ptrToItemToInsertBefore, CompareFunction compareFunction);
#endif /* 0 */
#endif /* _LISTS_H_ */