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 :)
18 #define INITIAL_SIZE 8
19 #define RESIZE_INCREMENT 8
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 */
31 WMCreateArray(unsigned initialSize
)
33 WMCreateArrayWithDestructor(initialSize
, NULL
);
38 WMCreateArrayWithDestructor(unsigned initialSize
, void (*destructor
)(void*))
42 array
= wmalloc(sizeof(WMArray
));
44 if (initialSize
== 0) {
45 initialSize
= INITIAL_SIZE
;
48 array
->items
= wmalloc(sizeof(void*) * initialSize
);
51 array
->allocSize
= initialSize
;
52 array
->destructor
= destructor
;
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*));*/
72 WMFreeArray(WMArray
*array
)
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
;
98 WMGetFromArray(WMArray
*array
, unsigned int index
)
100 if (index
< 0 || index
>= array
->length
)
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
;
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
;
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));
152 void *WMArrayPop(WMArray
*array
)
154 void *d
= WMArrayGet(array
, array
->length
-1);
156 WMArrayDelete(array
, array
->length
-1);
162 int WMArrayIndex(WMArray
*array
, void *data
)
166 for (i
= 0; i
< array
->length
; i
++)
167 if (array
->items
[i
] == data
)