Dodal manjkajoče Leviticus knjige
[ssp.git] / src / intset.c
blob0995eb88854ac9df4c39f4f82c6a2999b00c2f4b
1 #include <stdlib.h>
2 #include <stdbool.h>
4 #include "intset.h"
6 typedef struct intset {
7 int *arr;
8 size_t length;
9 size_t capacity;
10 } intset;
12 intset *
13 intset_new()
15 intset *set = malloc(sizeof(intset));
16 set->arr = malloc(sizeof(int) * 10);
17 set->length = 0;
18 set->capacity = 10;
19 return set;
22 void
23 intset_free(intset *set)
25 if (set) {
26 free(set->arr);
27 free(set);
31 static int
32 intset_cmp(const void *a, const void *b)
34 int x = *(int *)a, y = *(int *)b;
35 if (x < y) {
36 return -1;
37 } else if (x > y) {
38 return 1;
40 return 0;
43 void
44 intset_add(intset *set, int item)
46 if (intset_contains(set, item)) {
47 return;
50 if (set->length + 1 > set->capacity) {
51 set->capacity *= 2;
52 set->arr = realloc(set->arr, sizeof(int) * set->capacity);
54 set->arr[set->length] = item;
55 set->length++;
56 qsort(set->arr, set->length, sizeof(int), intset_cmp);
59 bool
60 intset_contains(intset *set, int item)
62 void *found = bsearch(&item, set->arr, set->length, sizeof(int), intset_cmp);
63 return found != NULL;