28
28
#include "DynamicArray.h"
30
struct SDynamicArrayPrivate {
33
31
FreeFunc free_func;
37
void _private_for_each_item_free (DynamicArray * self, spointer item,
35
void _private_for_each_item_free (SDynamicArray * self, spointer item,
40
DynamicArray * dynamic_array_new (size_t len, FreeFunc free_func) {
41
DynamicArray * self = malloc (sizeof(DynamicArray));
38
SDynamicArray * s_dynamic_array_new (size_t len, FreeFunc free_func) {
39
SDynamicArray * self = malloc (sizeof(SDynamicArray));
41
self->priv = malloc (sizeof (SDynamicArrayPrivate));
43
43
self->max_size = len;
46
self->free_func = free_func;
46
self->priv->free_func = free_func;
48
self->array = malloc (len * sizeof (* self->array));
48
self->priv->array = malloc (len * sizeof (* self->priv->array));
53
void dynamic_array_free (DynamicArray * self) {
54
if (self->free_func != NULL) {
55
dynamic_array_for_each (self, (ForEachFunc) _private_for_each_item_free,
53
void s_dynamic_array_free (SDynamicArray * self) {
54
if (self->priv->free_func != NULL) {
55
s_dynamic_array_for_each (self, (ForEachFunc) _private_for_each_item_free,
58
58
for (int i = 0; i < self->len; i++) {
59
free (self->array[i]);
59
free (self->priv->array[i]);
62
free (self->priv->array);
66
spointer dynamic_array_get (DynamicArray * self, size_t index) {
67
return self->array[index];
66
spointer s_dynamic_array_get (SDynamicArray * self, size_t index) {
67
return self->priv->array[index];
70
size_t dynamic_array_len (DynamicArray * self) {
70
size_t s_dynamic_array_len (SDynamicArray * self) {
74
size_t dynamic_array_size (DynamicArray * self) {
74
size_t s_dynamic_array_size (SDynamicArray * self) {
75
75
return self->max_size;
78
void dynamic_array_add (DynamicArray * self, spointer data) {
78
void s_dynamic_array_add (SDynamicArray * self, spointer data) {
79
79
if (self->len >= self->max_size - 1) {
80
self->array = realloc (self->array,
81
(sizeof (* self->array) *
80
self->priv->array = realloc (self->priv->array,
81
(sizeof (* self->priv->array) *
82
82
(self->max_size + ARRAY_PADDING)));
83
83
self->max_size = self->max_size + ARRAY_PADDING;
85
self->array[self->len] = data;
85
self->priv->array[self->len] = data;
89
spointer * dynamic_array_dump_array (DynamicArray * self) {
90
spointer * ret_val = malloc (sizeof (* self->array) * (self->len + 1));
89
spointer * s_dynamic_array_dump_array (SDynamicArray * self) {
90
spointer * ret_val = malloc (sizeof (* self->priv->array) * (self->len + 1));
91
91
for (int i = 0; i < self->len; i++) {
92
ret_val[i] = self->array[i];
92
ret_val[i] = self->priv->array[i];
94
94
ret_val[self->len] = NULL;
98
void dynamic_array_for_each (DynamicArray * self, ForEachFunc func,
98
void s_dynamic_array_for_each (SDynamicArray * self, ForEachFunc func,
100
100
for (int i = 0; i < self->len; i++) {
101
func (self, self->array[i], data);
101
func (self, self->priv->array[i], data);
106
void _private_for_each_item_free (DynamicArray * self, spointer item,
106
void _private_for_each_item_free (SDynamicArray * self, spointer item,
108
FreeFunc func = self->free_func;
108
FreeFunc func = self->priv->free_func;