Added zdd_forlargest(). Improved cycle_test.
[zddfun.git] / darray.c
blob1f64f0038fe49a214dd01da1db68c5afa8922192
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include "darray.h"
6 #define NDEBUG
7 #include <assert.h>
9 enum {
10 max_init = 8
13 void darray_init(darray_ptr a)
15 a->max = max_init;
16 a->count = 0;
17 a->item = malloc(sizeof(typ_t) * a->max);
20 darray_ptr darray_new()
22 darray_ptr res = malloc(sizeof(darray_t));
23 darray_init(res);
24 return res;
27 void darray_remove_all(darray_ptr a)
29 a->max = max_init;
30 a->count = 0;
31 free(a->item);
32 a->item = malloc(sizeof(typ_t) * a->max);
35 typ_t darray_remove_last(darray_ptr a)
37 assert(a->count > 0);
38 a->count--;
39 return(a->item[a->count]);
42 void darray_realloc(darray_ptr a, int size)
44 a->max = size;
45 a->item = realloc(a->item, sizeof(typ_t) * a->max);
48 void darray_append(darray_ptr a, typ_t p)
50 if (a->count == a->max) {
51 if (!a->max) a->max = max_init;
52 else a->max *= 2;
53 a->item = realloc(a->item, sizeof(typ_t) * a->max);
55 a->item[a->count] = p;
56 a->count++;
59 int darray_index_of(darray_ptr a, typ_t p)
61 int i;
62 for (i=0; i<a->count; i++) {
63 if (a->item[i] == p) return i;
65 return -1;
68 void darray_clear(darray_t a)
70 free(a->item);
71 a->max = 0;
72 a->count = 0;
75 void darray_remove_index(darray_ptr a, int n)
77 assert(a->count >= n-1);
78 a->count--;
79 memmove(a->item + n, a->item + n + 1, sizeof(typ_t) * (a->count - n));
82 void darray_remove(darray_ptr a, typ_t p)
84 int i;
85 for (i=0; i<a->count; i++) {
86 if (a->item[i] == p) {
87 darray_remove_index(a, i);
88 return;
91 assert(0);
94 int darray_index_of_test(darray_ptr a, int (*test)(typ_t))
96 int i;
97 for (i = 0; i < a->count; i++) if (test(a->item[i])) return i;
98 return -1;
101 typ_t darray_at_test(darray_ptr a, int (*test)(typ_t))
103 int i;
104 for (i = 0; i < a->count; i++) {
105 typ_t p = a->item[i];
106 if (test(p)) return p;
108 return NULL;
111 void darray_remove_test(darray_ptr a, int (*test)(typ_t))
113 int i;
114 while ((i = darray_index_of_test(a, test) >= 0)) {
115 darray_remove_index(a, i);
119 void darray_swap(darray_ptr a, int i, int j)
121 typ_t tmp = a->item[j];
122 a->item[j] = a->item[i];
123 a->item[i] = tmp;
126 void darray_copy(darray_ptr dst, darray_ptr src)
128 darray_realloc(dst, src->count);
129 memcpy(dst->item, src->item, src->count * sizeof(typ_t));
130 dst->count = src->count;
133 void darray_forall(darray_t a, void (*func)(typ_t))
135 typ_t *item = a->item;
136 const typ_t *end = item + a->count;
137 while (item != end) {
138 func(*item);
139 item++;
143 void darray_qsort(darray_t a, int (*compar)(const void *, const void *)) {
144 qsort(a->item, a->count, sizeof(void *), compar);