1
/* c-basic-offset: 2; tab-width: 2; indent-tabs-mode: nil
2
* vi: set shiftwidth=2 tabstop=2 expandtab:
3
* :indentSize=2:tabSize=2:noTabs=true:
6
#include "DynamicArray.h"
9
* This file, as the rest of the project is under MIT license.
10
* see http://opensource.org/licenses/MIT
12
* Author Gustav Hartvigsson <gustav.hartvigsson _at_ gmail.com> 2014
22
void _private_for_each_item_free (DynamicArray * self, _pointer item,
25
DynamicArray * dynamic_array_new (size_t len, FreeFunc free_func) {
26
DynamicArray * self = malloc (sizeof(DynamicArray));
31
self->free_func = free_func;
33
self->array = malloc (len * sizeof (* self->array));
38
void dynamic_array_free (DynamicArray * self) {
39
if (self->free_func != NULL) {
40
dynamic_array_for_each (self, (ForEachFunc) _private_for_each_item_free,
43
for (int i = 0; i < self->len; i++) {
44
free (self->array[i]);
51
_pointer dynamic_array_get (DynamicArray * self, size_t index) {
52
return self->array[index];
55
size_t dynamic_array_len (DynamicArray * self) {
59
size_t dynamic_array_size (DynamicArray * self) {
60
return self->max_size;
63
void dynamic_array_add (DynamicArray * self, _pointer data) {
64
if (self->len >= self->max_size - 1) {
65
self->array = realloc (self->array,
66
(sizeof (* self->array) *
67
(self->max_size + ARRAY_PADDING)));
68
self->max_size = self->max_size + ARRAY_PADDING;
70
self->array[self->len] = data;
74
_pointer * dynamic_array_dump_array (DynamicArray * self) {
75
_pointer * ret_val = malloc (sizeof (* self->array) * (self->len + 1));
76
for (int i = 0; i < self->len; i++) {
77
ret_val[i] = self->array[i];
79
ret_val[self->len] = NULL;
83
void dynamic_array_for_each (DynamicArray * self, ForEachFunc func,
85
for (int i = 0; i < self->len; i++) {
86
func (self, self->array[i], data);
91
void _private_for_each_item_free (DynamicArray * self, _pointer item,
93
FreeFunc func = self->free_func;