WMArray class is almost ready.
[wmaker-crm.git] / WINGs / array.c
blobcdfdfe3f85f7ef9cda14a57ceeb0b9dc99d88f0e
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 void*
81 WMReplaceInArray(WMArray *array, unsigned int index, void *data)
83 void *old;
85 wassertrv(index > array->length, 0);
87 if (index == array->length) {
88 WMArrayAppend(array, data);
89 return NULL;
92 old = array->items[index];
93 array->items[index] = data;
95 return old;
99 void*
100 WMGetArrayElement(WMArray *array, unsigned int index)
102 if (index >= array->length)
103 return NULL;
105 return array->items[index];
109 #if 0
111 WMAppendToArray(WMArray *array, void *data)
113 if (array->length >= array->allocSize) {
114 array->allocSize += RESIZE_INCREMENT;
115 array->items = wrealloc(array->items, sizeof(void*)*array->allocSize);
117 array->items[array->length++] = data;
119 return 1;
121 #endif
125 WMInsertInArray(WMArray *array, unsigned index, void *data)
127 wassertrv(index <= array->length, 0);
129 if (array->length >= array->allocSize) {
130 array->allocSize += RESIZE_INCREMENT;
131 array->items = wrealloc(array->items, sizeof(void*)*array->allocSize);
133 if (index < array->length)
134 memmove(array->items+index+1, array->items+index,
135 sizeof(void*)*(array->length-index));
136 array->items[index] = data;
138 array->length++;
140 return 1;
145 WMAppendToArray(WMArray *array, void *data)
147 return WMInsertInArray(array, array->length, data);
151 static void
152 removeFromArray(WMArray *array, unsigned index)
154 /*wassertr(index < array->length);*/
156 memmove(array->items+index, array->items+index+1,
157 sizeof(void*)*(array->length-index-1));
159 array->length--;
163 void
164 WMDeleteFromArray(WMArray *array, unsigned index)
166 wassertr(index < array->length);
168 if (array->destructor) {
169 array->destructor(array->items[index]);
172 removeFromArray(array, index);
176 void*
177 WMArrayPop(WMArray *array)
179 void *last = array->items[length-1];
181 removeFromArray(array, array->length-1);
183 return last;
188 WMIndexForArrayElement(WMArray *array, void *data)
190 unsigned i;
192 for (i = 0; i < array->length; i++)
193 if (array->items[i] == data)
194 return i;
196 return -1;