Skip to content
Snippets Groups Projects
lists.h 3.98 KiB
Newer Older
  • Learn to ignore specific revisions
  • Wolfgang Denk's avatar
    Wolfgang Denk committed
    #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 */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    				/* inserting. Otherwise it refers the last item in the list. */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    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 ... */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    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 */
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    #endif	/* _LISTS_H_ */