| #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_ */ |