1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include "pbc_memory.h"
5 #include "darray.h"
6 
7 #define NDEBUG
8 #include <assert.h>
9 
10 enum {
11     max_init = 8
12 };
13 
darray_init(darray_ptr a)14 void darray_init(darray_ptr a)
15 {
16     a->max = max_init;
17     a->count = 0;
18     a->item = pbc_malloc(sizeof(void *) * a->max);
19 }
20 
darray_new(void)21 darray_ptr darray_new(void)
22 {
23     darray_ptr res = pbc_malloc(sizeof(darray_t));
24     darray_init(res);
25     return res;
26 }
27 
darray_remove_all(darray_ptr a)28 void darray_remove_all(darray_ptr a)
29 {
30     a->max = max_init;
31     a->count = 0;
32     pbc_free(a->item);
33     a->item = pbc_malloc(sizeof(void *) * a->max);
34 }
35 
darray_remove_last(darray_ptr a)36 void darray_remove_last(darray_ptr a)
37 {
38     assert(a->count > 0);
39     a->count--;
40 }
41 
darray_realloc(darray_ptr a,int size)42 static void darray_realloc(darray_ptr a, int size)
43 {
44     a->max = size;
45     a->item = pbc_realloc(a->item, sizeof(void *) * a->max);
46 }
47 
darray_append(darray_ptr a,void * p)48 void darray_append(darray_ptr a, void *p)
49 {
50     if (a->count == a->max) {
51         if (!a->max) a->max = max_init;
52         else a->max *= 2;
53         a->item = pbc_realloc(a->item, sizeof(void *) * a->max);
54     }
55     a->item[a->count] = p;
56     a->count++;
57 }
58 
darray_index_of(darray_ptr a,void * p)59 int darray_index_of(darray_ptr a, void *p)
60 {
61     int i;
62     for (i=0; i<a->count; i++) {
63         if (a->item[i] == p) return i;
64     }
65     return -1;
66 }
67 
darray_clear(darray_t a)68 void darray_clear(darray_t a)
69 {
70     pbc_free(a->item);
71     a->max = 0;
72     a->count = 0;
73 }
74 
darray_free(darray_ptr a)75 void darray_free(darray_ptr a) {
76   darray_clear(a);
77   pbc_free(a);
78 }
79 
darray_remove_index(darray_ptr a,int n)80 void darray_remove_index(darray_ptr a, int n)
81 {
82     assert(a->count >= n-1);
83     a->count--;
84     memmove(&a->item[n], &a->item[n+1], sizeof(void *) * (a->count - n));
85 }
86 
darray_remove(darray_ptr a,void * p)87 void darray_remove(darray_ptr a, void *p)
88 {
89     int i;
90     for (i=0; i<a->count; i++) {
91         if (a->item[i] == p) {
92             a->count--;
93             memmove(&a->item[i], &a->item[i+1], sizeof(void *) * (a->count - i));
94             return;
95         }
96     }
97     assert(0);
98 }
99 
darray_remove_with_test(darray_ptr a,int (* test)(void *))100 void darray_remove_with_test(darray_ptr a, int (*test)(void *))
101 {
102     int i;
103     for (i=0; i<a->count; i++) {
104         if (test(a->item[i])) {
105             for (;i<a->count; i++) {
106                 a->item[i] = a->item[i+1];
107             }
108             a->count--;
109         }
110     }
111 }
112 
darray_copy(darray_ptr dst,darray_ptr src)113 void darray_copy(darray_ptr dst, darray_ptr src)
114 {
115     darray_realloc(dst, src->count);
116     memcpy(dst->item, src->item, src->count * sizeof(void *));
117     dst->count = src->count;
118 }
119 
darray_forall(darray_t a,void (* func)(void *))120 void darray_forall(darray_t a, void (*func)(void *))
121 {
122     int i, n = a->count;
123     for (i=0; i<n; i++) {
124         func(a->item[i]);
125     }
126 }
127 
darray_forall2(darray_t a,void (* func)(void * darray_item,void * scope_ptr),void * scope_ptr)128 void darray_forall2(darray_t a,
129                     void (*func)(void *darray_item, void *scope_ptr),
130                     void *scope_ptr)
131 {
132     int i, n = a->count;
133     for (i=0; i<n; i++) {
134         func(a->item[i], scope_ptr);
135     }
136 }
137 
darray_forall3(darray_t a,void (* func)(void * darray_item,void * scope_ptr1,void * scope_ptr2),void * scope_ptr1,void * scope_ptr2)138 void darray_forall3(darray_t a,
139                     void (*func)(void *darray_item,
140                                  void *scope_ptr1,
141                                  void *scope_ptr2),
142                     void *scope_ptr1,
143                     void *scope_ptr2)
144 {
145     int i, n = a->count;
146     for (i=0; i<n; i++) {
147         func(a->item[i], scope_ptr1, scope_ptr2);
148     }
149 }
150 
darray_forall4(darray_t a,void (* func)(void * darray_item,void * scope_ptr1,void * scope_ptr2,void * scope_ptr3),void * scope_ptr1,void * scope_ptr2,void * scope_ptr3)151 void darray_forall4(darray_t a,
152                     void (*func)(void *darray_item,
153                                  void *scope_ptr1,
154                                  void *scope_ptr2,
155                                  void *scope_ptr3),
156                     void *scope_ptr1,
157                     void *scope_ptr2,
158                     void *scope_ptr3)
159 {
160     int i, n = a->count;
161     for (i=0; i<n; i++) {
162         func(a->item[i], scope_ptr1, scope_ptr2, scope_ptr3);
163     }
164 }
165 
darray_at_test(darray_ptr a,int (* test)(void * data,void * scope_ptr),void * scope_ptr)166 void *darray_at_test(darray_ptr a,
167                      int (*test)(void *data, void *scope_ptr),
168                      void *scope_ptr)
169 {
170     int i;
171     for (i = 0; i < a->count; i++) {
172         void *p = a->item[i];
173         if (test(p, scope_ptr)) return p;
174     }
175     return NULL;
176 }
177