/
array.c
109 lines (98 loc) · 2.43 KB
/
array.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
* This file is part of the OpenMV project.
* Copyright (c) 2013/2014 Ibrahim Abdelkader <i.abdalkader@gmail.com>
* This work is licensed under the MIT license, see the file LICENSE for details.
*
* Dynamic array.
*
*/
#include <stdlib.h>
#include <string.h>
#include "xalloc.h"
#include "array.h"
#define ARRAY_INIT_SIZE 10
struct array {
int index;
int length;
void **data;
array_dtor dtor;
};
void array_alloc(struct array **a, array_dtor dtor)
{
struct array *array;
array = xalloc(sizeof(struct array));
array->index = 0;
array->length = ARRAY_INIT_SIZE;
array->dtor = dtor;
array->data = xalloc(array->length*sizeof(void*));
*a = array;
}
void array_alloc_init(struct array **a, array_dtor dtor, int size)
{
struct array *array;
array = xalloc(sizeof(struct array));
array->index = 0;
array->length = size;
array->dtor = dtor;
array->data = xalloc(array->length*sizeof(void*));
*a = array;
}
void array_free(struct array *array)
{
if (array->dtor != NULL) {
for (int i=0; i<array->index; i++){
array->dtor(array->data[i]);
}
}
xfree(array->data);
xfree(array);
}
int array_length(struct array *array)
{
return array->index;
}
void *array_at(struct array *array, int idx)
{
return array->data[idx];
}
void array_push_back(struct array *array, void *element)
{
if (array->index == array->length) {
array->length += ARRAY_INIT_SIZE;
array->data = xrealloc(array->data, array->length * sizeof(void*));
}
array->data[array->index++] = element;
}
void *array_pop_back(struct array *array)
{
void *el=NULL;
if (array->index) {
el = array->data[--array->index];
}
return el;
}
void array_erase(struct array *array, int idx)
{
if (array->dtor) {
array->dtor(array->data[idx]);
}
if (array->index >1 && idx < array->index){
/* Since dst is always < src we can just use memcpy */
memcpy(array->data+idx, array->data+idx+1, (array->index-idx-1) * sizeof(void*));
}
array->index--;
}
void array_resize(struct array *array, int idx)
{
//TODO realloc
while (array->index > idx) {
if (array->dtor != NULL) {
array->dtor(array->data[array->index-1]);
}
array->index--;
}
}
void array_sort(struct array *array, array_comp comp)
{
//qsort(array->data, array->index, sizeof(void*), comp);
}