1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-01-04 12:54:20 +01:00

Some more code to the WMArray class

This commit is contained in:
dan
2000-09-15 09:42:22 +00:00
parent e01ef57d4b
commit 9f98db6791
2 changed files with 58 additions and 37 deletions

View File

@@ -486,9 +486,9 @@ void WMResetDataBytesInRange(WMData *aData, WMRange aRange);
void WMSetData(WMData *aData, WMData *anotherData); void WMSetData(WMData *aData, WMData *anotherData);
void WMSetDataFormat(WMData *aData, unsigned format); void WMSetDataFormat(WMData *aData, unsigned format);
unsigned WMGetDataFormat(WMData *aData); unsigned WMGetDataFormat(WMData *aData);
/* Storing data */ /* Storing data */

View File

@@ -20,72 +20,91 @@
typedef struct { typedef struct {
void **items; /* the array data */ void **items; /* the array data */
unsigned length; /* # of items in array */ unsigned int length; /* # of items in array */
unsigned allocSize; /* allocated size of array */ unsigned int allocSize; /* allocated size of array */
void (*destructor)(void *item); /* the destructor to free elements */
} W_Array; } W_Array;
WMArray* WMArray*
WMCreateArray(unsigned initialSize) WMCreateArray(unsigned initialSize)
{ {
Array *a; WMCreateArrayWithDestructor(initialSize, NULL);
}
a = malloc(sizeof(Array));
sassertrv(a!=NULL, NULL); WMArray*
WMCreateArrayWithDestructor(unsigned initialSize, void (*destructor)(void*))
{
WMArray *array;
array = wmalloc(sizeof(WMArray));
if (initialSize == 0) { if (initialSize == 0) {
initialSize = INITIAL_SIZE; initialSize = INITIAL_SIZE;
} }
a->items = malloc(sizeof(void*)*initialSize); array->items = wmalloc(sizeof(void*) * initialSize);
sassertdo(a->items!=NULL,
free(a);
return NULL;
);
a->length = 0;
a->allocSize = initialSize;
return a; array->length = 0;
array->allocSize = initialSize;
array->destructor = destructor;
return array;
} }
void ArrayFree(Array *array) void
WMEmptyArray(WMArray *array)
{ {
if (array->destructor) {
while (array->length-- > 0) {
array->destructor(array->items[array->length]);
}
}
/*memset(array->items, 0, array->length * sizeof(void*));*/
array->length = 0;
}
void
WMFreeArray(WMArray *array)
{
WMEmptyArray(array);
free(array->items); free(array->items);
free(array); free(array);
} }
void ArrayClear(Array *array) int
WMReplaceInArray(WMArray *array, unsigned int index, void *data)
{ {
memset(array->items, 0, array->length*sizeof(void*)); wassertrv(index > array->length, 0);
array->length = 0;
}
int ArraySet(Array *array, unsigned index, void *data)
{
sassertrv(index > array->length, 0);
if (index == array->length) if (index == array->length)
return ArrayAppend(array, data); return WMArrayAppend(array, data);
if (array->destructor) {
array->destructor(array->items[index]);
}
array->items[index] = data; array->items[index] = data;
return 1; return 1;
} }
#if 0 void*
void *ArrayGet(Array *array, unsigned index) WMGetFromArray(WMArray *array, unsigned int index)
{ {
if (index < 0 || index >= array->length)
return NULL;
return array->items[index]; return array->items[index];
} }
#endif
int ArrayAppend(Array *array, void *data) int WMArrayAppend(WMArray *array, void *data)
{ {
if (array->length >= array->allocSize) { if (array->length >= array->allocSize) {
array->allocSize += RESIZE_INCREMENT; array->allocSize += RESIZE_INCREMENT;
@@ -98,7 +117,7 @@ int ArrayAppend(Array *array, void *data)
} }
int ArrayInsert(Array *array, unsigned index, void *data) int WMArrayInsert(WMArray *array, unsigned index, void *data)
{ {
sassertrv(index < array->length, 0); sassertrv(index < array->length, 0);
@@ -118,7 +137,7 @@ int ArrayInsert(Array *array, unsigned index, void *data)
} }
void ArrayDelete(Array *array, unsigned index) void WMArrayDelete(WMArray *array, unsigned index)
{ {
sassertr(index < array->length); sassertr(index < array->length);
@@ -130,17 +149,17 @@ void ArrayDelete(Array *array, unsigned index)
void *ArrayPop(Array *array) void *WMArrayPop(WMArray *array)
{ {
void *d = ArrayGet(array, array->length-1); void *d = WMArrayGet(array, array->length-1);
ArrayDelete(array, array->length-1); WMArrayDelete(array, array->length-1);
return d; return d;
} }
int ArrayIndex(Array *array, void *data) int WMArrayIndex(WMArray *array, void *data)
{ {
unsigned i; unsigned i;
@@ -150,3 +169,5 @@ int ArrayIndex(Array *array, void *data)
return -1; return -1;
} }