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:
@@ -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 */
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user