#include #include #include "WUtil.h" #if 0 typedef struct W_ArrayBag { void **items; int size; int count; int base; int first; int last; } W_ArrayBag; static int getItemCount(WMBag *bag); static int appendBag(WMBag *bag, WMBag *appendedBag); static int putInBag(WMBag *bag, void *item); static int insertInBag(WMBag *bag, int index, void *item); static int removeFromBag(WMBag *bag, void *item); static int deleteFromBag(WMBag *bag, int index); static void* getFromBag(WMBag *bag, int index); static int firstInBag(WMBag *bag, void *item); static int countInBag(WMBag *bag, void *item); static void* replaceInBag(WMBag *bag, int index, void *item); static int sortBag(WMBag *bag, int (*comparer)(const void*, const void*)); static void emptyBag(WMBag *bag); static void freeBag(WMBag *bag); static void mapBag(WMBag *bag, void (*function)(void*, void*), void *data); static int findInBag(WMBag *bag, int (*match)(void*)); static void* first(WMBag *bag, void **ptr); static void* last(WMBag *bag, void **ptr); static void* next(WMBag *bag, void **ptr); static void* previous(WMBag *bag, void **ptr); static void* iteratorAtIndex(WMBag *bag, int index, WMBagIterator *ptr); static int indexForIterator(WMBag *bag, WMBagIterator ptr); static W_BagFunctions arrayFunctions = { getItemCount, appendBag, putInBag, insertInBag, removeFromBag, deleteFromBag, deleteFromBag, getFromBag, firstInBag, countInBag, replaceInBag, sortBag, emptyBag, freeBag, mapBag, findInBag, first, last, next, previous, iteratorAtIndex, indexForIterator }; #define ARRAY ((W_ArrayBag*)bag->data) #define I2O(a, i) ((a)->base + i) WMBag* WMCreateArrayBagWithDestructor(int initialSize, void (*destructor)(void*)) { WMBag *bag; W_ArrayBag *array; int size; assert(0&&"array bag is not working"); bag = wmalloc(sizeof(WMBag)); array = wmalloc(sizeof(W_ArrayBag)); bag->data = array; array->items = wmalloc(sizeof(void*) * size); array->size = size; array->count = 0; array->first = 0; array->last = 0; array->base = 0; bag->func = arrayFunctions; bag->destructor = destructor; return bag; } WMBag* WMCreateArrayBag(int initialSize) { return WMCreateArrayBagWithDestructor(initialSize, NULL); } static int getItemCount(WMBag *bag) { return ARRAY->count; } static int appendBag(WMBag *bag, WMBag *appendedBag) { W_ArrayBag *array = (W_ArrayBag*)appendedBag->data; int ok; int i; for (i = array->first; i <= array->last; i++) { if (array->items[array->base+i]) { ok = putInBag(bag, array->items[array->base+i]); if (!ok) return 0; } } return 1; } static int putInBag(WMBag *bag, void *item) { return insertInBag(bag, ARRAY->last+1, item); } static int insertInBag(WMBag *bag, int index, void *item) { W_ArrayBag *array = ARRAY; if (I2O(array, index) >= array->size) { array->size = WMAX(array->size + 16, I2O(array, index)); array->items = wrealloc(array->items, sizeof(void*) * array->size); memset(array->items + I2O(array, array->last), 0, sizeof(void*) * (array->size - I2O(array, array->last))); } if (index > array->last) { array->last = index; } else if (index >= array->first) { memmove(array->items + I2O(array, index), array->items + (I2O(array, index) + 1), sizeof(void*)); array->last++; } else { memmove(array->items, array->items + (abs(index) - array->base), sizeof(void*) * (abs(index) - array->base)); memset(array->items, 0, sizeof(void*) * (abs(index) - array->base)); array->first = index; array->base = abs(index); } array->items[array->base + index] = item; array->count++; return 1; } static int removeFromBag(WMBag *bag, void *item) { int i; W_ArrayBag *array = ARRAY; for (i = 0; i < array->count; i++) { if (array->items[i] == item) { if (bag->destructor) bag->destructor(array->items[i]); memmove(&array->items[i], &array->items[i + 1], (array->count - i - 1) * sizeof(void*)); array->count--; return 1; } } return 0; } static int deleteFromBag(WMBag *bag, int index) { W_ArrayBag *array = ARRAY; if (index < 0 || index >= array->count) return 0; if (index < array->count-1) { if (bag->destructor) bag->destructor(array->items[index]); memmove(&array->items[index], &array->items[index + 1], (array->count - index - 1) * sizeof(void*)); } array->count--; return 1; } static void* getFromBag(WMBag *bag, int index) { if (index < 0 || index >= ARRAY->count) return NULL; return ARRAY->items[index]; } static int firstInBag(WMBag *bag, void *item) { int j; int count = ARRAY->count; W_ArrayBag *array = ARRAY; for (j = 0; j < count; j++) { if (array->items[j] == item) return j; } return -1; } static int countInBag(WMBag *bag, void *item) { int i, j; int count = ARRAY->count; W_ArrayBag *array = ARRAY; for (j = 0, i = 0; j < count; j++) { if (array->items[j] == item) i++; } return i; } static void* replaceInBag(WMBag *bag, int index, void *item) { void *old; if (index < 0 || index >= ARRAY->count) return NULL; old = ARRAY->items[index]; ARRAY->items[index] = item; return old; } static int sortBag(WMBag *bag, int (*comparer)(const void*, const void*)) { qsort(ARRAY->items, ARRAY->count, sizeof(void*), comparer); return 1; } static void emptyBag(WMBag *bag) { W_ArrayBag *array = ARRAY; if (bag->destructor) { while (--array->count) { bag->destructor(array->items[array->count]); } } ARRAY->count=0; } static void freeBag(WMBag *bag) { emptyBag(bag); wfree(ARRAY->items); wfree(ARRAY); wfree(bag); } static void mapBag(WMBag *bag, void (*function)(void *, void *), void *clientData) { int i; for (i = 0; i < ARRAY->last; i++) { if (ARRAY->items[i]) (*function)(ARRAY->items[i], clientData); } } static int findInBag(WMBag *bag, int (*match)(void*)) { int i; for (i = 0; i < ARRAY->last; i++) { if ((*match)(ARRAY->items[i])) return i; } return -1; } static void* first(WMBag *bag, void **ptr) { *ptr = NULL; if (ARRAY->count == 0) return NULL; *(int**)ptr = 0; return ARRAY->items[0]; } static void* last(WMBag *bag, void **ptr) { *ptr = NULL; if (ARRAY->count == 0) return NULL; *(int*)ptr = ARRAY->count-1; return ARRAY->items[ARRAY->count-1]; } static void* next(WMBag *bag, void **ptr) { if (!*ptr) return NULL; (*(int*)ptr)++; if (*(int*)ptr >= ARRAY->count) { *ptr = NULL; return NULL; } return ARRAY->items[*(int*)ptr]; } static void* previous(WMBag *bag, void **ptr) { if (!*ptr) return NULL; (*(int*)ptr)--; if (*(int*)ptr < 0) { *ptr = NULL; return NULL; } return ARRAY->items[*(int*)ptr]; } static void* iteratorAtIndex(WMBag *bag, int index, WMBagIterator *ptr) { } static int indexForIterator(WMBag *bag, WMBagIterator ptr) { } #endif