Some more code to the WMArray class
[wmaker-crm.git] / WINGs / array.c
blob54efebd9f3d8f2ae02e0e574c6cc2ac8c7cb48c8
1 /*
2 * Dynamically Resized Array
4 * Authors: Alfredo K. Kojima <kojima@windowmaker.org>
5 * Dan Pascu <dan@windowmaker.org>
7 * This code is released to the Public Domain, but
8 * proper credit is always appreciated :)
9 */
12 #include <stdlib.h>
13 #include <string.h>
15 #include "WUtil.h"
18 #define INITIAL_SIZE 8
19 #define RESIZE_INCREMENT 8
22 typedef struct {
23 void **items; /* the array data */
24 unsigned int length; /* # of items in array */
25 unsigned int allocSize; /* allocated size of array */
26 void (*destructor)(void *item); /* the destructor to free elements */
27 } W_Array;
30 WMArray*
31 WMCreateArray(unsigned initialSize)
33 WMCreateArrayWithDestructor(initialSize, NULL);
37 WMArray*
38 WMCreateArrayWithDestructor(unsigned initialSize, void (*destructor)(void*))
40 WMArray *array;
42 array = wmalloc(sizeof(WMArray));
44 if (initialSize == 0) {
45 initialSize = INITIAL_SIZE;
48 array->items = wmalloc(sizeof(void*) * initialSize);
50 array->length = 0;
51 array->allocSize = initialSize;
52 array->destructor = destructor;
54 return array;
58 void
59 WMEmptyArray(WMArray *array)
61 if (array->destructor) {
62 while (array->length-- > 0) {
63 array->destructor(array->items[array->length]);
66 /*memset(array->items, 0, array->length * sizeof(void*));*/
67 array->length = 0;
71 void
72 WMFreeArray(WMArray *array)
74 WMEmptyArray(array);
75 free(array->items);
76 free(array);
80 int
81 WMReplaceInArray(WMArray *array, unsigned int index, void *data)
83 wassertrv(index > array->length, 0);
85 if (index == array->length)
86 return WMArrayAppend(array, data);
88 if (array->destructor) {
89 array->destructor(array->items[index]);
91 array->items[index] = data;
93 return 1;
97 void*
98 WMGetFromArray(WMArray *array, unsigned int index)
100 if (index < 0 || index >= array->length)
101 return NULL;
103 return array->items[index];
107 int WMArrayAppend(WMArray *array, void *data)
109 if (array->length >= array->allocSize) {
110 array->allocSize += RESIZE_INCREMENT;
111 array->items = realloc(array->items, sizeof(void*)*array->allocSize);
112 sassertrv(array->items != NULL, 0);
114 array->items[array->length++] = data;
116 return 1;
120 int WMArrayInsert(WMArray *array, unsigned index, void *data)
122 sassertrv(index < array->length, 0);
124 if (array->length >= array->allocSize) {
125 array->allocSize += RESIZE_INCREMENT;
126 array->items = realloc(array->items, sizeof(void*)*array->allocSize);
127 sassertrv(array->items != NULL, 0);
129 if (index < array->length-1)
130 memmove(array->items+index+1, array->items+index,
131 sizeof(void*)*(array->length-index));
132 array->items[index] = data;
134 array->length++;
136 return 1;
140 void WMArrayDelete(WMArray *array, unsigned index)
142 sassertr(index < array->length);
144 memmove(array->items+index, array->items+index+1,
145 sizeof(void*)*(array->length-index-1));
147 array->length--;
152 void *WMArrayPop(WMArray *array)
154 void *d = WMArrayGet(array, array->length-1);
156 WMArrayDelete(array, array->length-1);
158 return d;
162 int WMArrayIndex(WMArray *array, void *data)
164 unsigned i;
166 for (i = 0; i < array->length; i++)
167 if (array->items[i] == data)
168 return i;
170 return -1;