-
Notifications
You must be signed in to change notification settings - Fork 0
/
sfarray.c
85 lines (65 loc) · 1.45 KB
/
sfarray.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "sfarray.h"
array_t **ARRAY_STACK;
size_t as_count;
int ARR_CACHE[SF_ARR_CACHE_SIZE];
int achc_count;
SF_API void
sf_array_init (void)
{
ARRAY_STACK = NULL;
as_count = 0;
achc_count = 0;
}
SF_API array_t *
sf_array_new (void)
{
array_t *t = sfmalloc (sizeof (*t));
t->len = 0;
t->vals = NULL;
t->meta.has_id = 0;
t->meta.id = 0;
return t;
}
SF_API void
sf_array_pushVal (array_t *arr, llnode_t *val)
{
arr->vals = sfrealloc (arr->vals, (arr->len + 1) * sizeof (*arr->vals));
arr->vals[arr->len++] = val;
sf_ll_set_meta_refcount (val, val->meta.ref_count + 1);
}
SF_API array_t *
sf_array_add (array_t *arr)
{
arr->meta.has_id = 1;
if (achc_count)
{
int l = ARR_CACHE[--achc_count];
ARRAY_STACK[l] = arr;
arr->meta.id = l;
return ARRAY_STACK[l];
}
else
{
ARRAY_STACK
= sfrealloc (ARRAY_STACK, (as_count + 1) * sizeof (*ARRAY_STACK));
ARRAY_STACK[as_count] = arr;
arr->meta.id = as_count;
}
return ARRAY_STACK[as_count++];
}
SF_API void
sf_array_free (array_t *arr)
{
if (achc_count < SF_ARR_CACHE_SIZE && arr->meta.has_id)
ARR_CACHE[achc_count++] = arr->meta.id;
for (size_t i = 0; i < arr->len; i++)
{
// printf ("%d\n", arr->vals[i]->meta.ref_count);
sf_ll_set_meta_refcount (arr->vals[i], arr->vals[i]->meta.ref_count - 1);
}
if (arr->vals != NULL)
sffree (arr->vals);
arr->len = 0;
arr->vals = NULL;
sffree (arr);
}