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