Minor documentation edits.
[zddfun.git] / inta.c
blob4e8f8a89b8899ac0ce8212340fe23e3f04bde6c9
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4 #include "inta.h"
6 #define NDEBUG
7 #include <assert.h>
9 enum {
10 max_init = 8
13 void inta_init(inta_ptr a)
15 a->max = max_init;
16 a->count = 0;
17 a->item = malloc(sizeof(int) * a->max);
20 void inta_init_n(inta_ptr a, int n)
22 a->max = n;
23 a->count = 0;
24 a->item = malloc(sizeof(int) * a->max);
27 inta_ptr inta_new()
29 inta_ptr res = malloc(sizeof(inta_t));
30 inta_init(res);
31 return res;
34 void inta_remove_all(inta_ptr a)
36 a->max = max_init;
37 a->count = 0;
38 free(a->item);
39 a->item = malloc(sizeof(int) * a->max);
42 int inta_remove_last(inta_ptr a)
44 assert(a->count > 0);
45 a->count--;
46 return(a->item[a->count]);
49 void inta_realloc(inta_ptr a, int size)
51 a->max = size;
52 a->item = realloc(a->item, sizeof(int) * a->max);
55 void inta_append(inta_ptr a, int p)
57 if (a->count == a->max) {
58 if (!a->max) a->max = max_init;
59 else a->max *= 2;
60 a->item = realloc(a->item, sizeof(int) * a->max);
62 a->item[a->count] = p;
63 a->count++;
66 int inta_index_of(inta_ptr a, int p)
68 int i;
69 for (i=0; i<a->count; i++) {
70 if (a->item[i] == p) return i;
72 return -1;
75 void inta_clear(inta_t a)
77 free(a->item);
78 a->max = 0;
79 a->count = 0;
82 void inta_remove_index(inta_ptr a, int n)
84 assert(a->count >= n-1);
85 a->count--;
86 memmove(a->item + n, a->item + n + 1, sizeof(int) * (a->count - n));
89 void inta_remove(inta_ptr a, int p)
91 int i;
92 for (i=0; i<a->count; i++) {
93 if (a->item[i] == p) {
94 inta_remove_index(a, i);
95 return;
98 assert(0);
101 int inta_index_of_test(inta_ptr a, int (*test)(int))
103 int i;
104 for (i = 0; i < a->count; i++) if (test(a->item[i])) return i;
105 return -1;
108 int inta_at_test(inta_ptr a, int (*test)(int))
110 int i;
111 for (i = 0; i < a->count; i++) {
112 int p = a->item[i];
113 if (test(p)) return p;
115 return 0;
118 void inta_remove_test(inta_ptr a, int (*test)(int))
120 int i;
121 while ((i = inta_index_of_test(a, test) >= 0)) {
122 inta_remove_index(a, i);
126 void inta_swap(inta_ptr a, int i, int j)
128 int tmp = a->item[j];
129 a->item[j] = a->item[i];
130 a->item[i] = tmp;
133 void inta_copy(inta_ptr dst, inta_ptr src)
135 inta_realloc(dst, src->count);
136 memcpy(dst->item, src->item, src->count * sizeof(int));
137 dst->count = src->count;
140 void inta_forall(inta_t a, void (*func)(int))
142 int *item = a->item;
143 const int *end = item + a->count;
144 while (item != end) {
145 func(*item);
146 item++;
150 void inta_qsort(inta_t a, int (*compar)(const void *, const void *)) {
151 qsort(a->item, a->count, sizeof(void *), compar);