Dinamic Array
Loading...
Searching...
No Matches
darr.c
Go to the documentation of this file.
1
#include "
darr.h
"
2
#include <stddef.h>
3
#include <stdio.h>
4
#include <stdlib.h>
5
#include <string.h>
6
#include <strings.h>
7
8
bool
_increase_darr
(
darr_t
*da);
9
bool
_shrink_darr
(
darr_t
*da);
10
21
darr_t
*
darr_new
(
void
) {
22
darr_t
*da = malloc(
sizeof
(
darr_t
));
23
24
da->
_size
= 0;
25
da->
_capacity
=
DARR_DEFAULT_CAPACITY
;
26
da->
_arr
= malloc(da->
_capacity
*
sizeof
(
void
*));
27
28
return
da;
29
}
30
37
size_t
darr_get_size
(
darr_t
*da) {
return
da->
_size
; }
38
45
size_t
darr_get_capacity
(
darr_t
*da) {
return
da->
_capacity
; }
46
50
void
*
darr_at
(
darr_t
*da,
size_t
index) {
51
return
index >= da->
_size
? NULL : da->
_arr
[index];
52
}
53
54
int
darr_push
(
darr_t
*da,
void
*value,
size_t
size) {
55
size_t
const
index = da->
_size
;
56
57
if
(!
_increase_darr
(da))
58
return
-1;
59
60
void
*copy = malloc(size);
61
62
memcpy(copy, value, size);
63
64
da->
_arr
[index] = copy;
65
++da->
_size
;
66
67
return
index;
68
}
69
70
int
darr_pop
(
darr_t
*da) {
71
if
(da->
_size
== 0)
72
return
-1;
73
74
size_t
const
index = da->
_size
- 1;
75
76
free(da->
_arr
[index]);
77
78
--da->
_size
;
79
80
if
(!
_shrink_darr
(da))
81
return
-1;
82
83
return
index;
84
}
85
86
int
darr_insert_at
(
darr_t
*da,
size_t
index,
void
*value,
size_t
size) {
87
if
(index > da->
_size
)
88
return
-1;
89
90
if
(!
_increase_darr
(da))
91
return
-1;
92
93
memmove(&da->
_arr
[index + 1], &da->
_arr
[index],
94
sizeof
(
void
*) * (da->
_size
- index));
95
96
void
*copy = malloc(size);
97
98
memcpy(copy, value, size);
99
100
da->
_arr
[index] = copy;
101
++da->
_size
;
102
103
return
index;
104
}
105
106
int
darr_delete_at
(
darr_t
*da,
size_t
index) {
107
if
(index >= da->
_size
)
108
return
-1;
109
110
free(da->
_arr
[index]);
111
112
memmove(&da->
_arr
[index], &da->
_arr
[index + 1],
113
sizeof
(
void
*) * (da->
_size
- index));
114
115
if
(!
_shrink_darr
(da))
116
return
-1;
117
118
--da->
_size
;
119
120
return
index;
121
}
122
123
int
darr_find
(
darr_t
*da,
void
*value,
compfun_t
compare
) {
124
for
(
size_t
i = 0; i < da->
_size
; ++i)
125
if
(
compare
(da->
_arr
[i], value))
126
return
i;
127
128
return
-1;
129
}
130
131
void
darr_destroy
(
darr_t
*da) {
132
if
(da == NULL)
133
return
;
134
135
for
(
size_t
i = 0; i < da->
_size
; ++i)
136
if
(da->
_arr
[i] != NULL)
137
free(da->
_arr
[i]);
138
139
if
(da->
_arr
!= NULL)
140
free(da->
_arr
);
141
142
free(da);
143
}
144
145
bool
_increase_darr
(
darr_t
*da) {
146
if
(da->
_size
+ 1 <= da->
_capacity
)
147
return
true
;
148
149
__auto_type new_capacity =
150
(size_t)((
float
)da->
_capacity
*
DARR_DEFAULT_GROWING_FACTOR
);
151
152
new_capacity =
153
new_capacity == da->
_capacity
? new_capacity + 1 : new_capacity;
154
155
void
*temp = realloc(da->
_arr
,
sizeof
(
void
*) * new_capacity);
156
157
if
(temp == NULL) {
158
fprintf(stderr,
"_increase_darr(): realocation failed\n"
);
159
160
return
false
;
161
}
162
163
da->
_arr
= temp;
164
da->
_capacity
= new_capacity;
165
166
return
true
;
167
}
168
169
bool
_shrink_darr
(
darr_t
*da) {
170
if
((
float
)da->
_size
- 1 >=
171
(
float
)da->
_capacity
/
DARR_DEFAULT_GROWING_FACTOR
||
172
da->
_capacity
<=
DARR_DEFAULT_CAPACITY
)
173
return
true
;
174
175
da->
_capacity
= da->
_size
;
176
177
void
*temp = realloc(da->
_arr
,
sizeof
(
void
*) * da->
_capacity
+ 1);
178
179
if
(temp == NULL) {
180
fprintf(stderr,
"_shrink_darr(): realocation failed\n"
);
181
182
return
false
;
183
}
184
185
da->
_arr
= temp;
186
187
return
true
;
188
}
darr_get_capacity
size_t darr_get_capacity(darr_t *da)
Definition
darr.c:45
darr_pop
int darr_pop(darr_t *da)
Definition
darr.c:70
_shrink_darr
bool _shrink_darr(darr_t *da)
private method form darr_t
Definition
darr.c:169
_increase_darr
bool _increase_darr(darr_t *da)
private method form darr_t
Definition
darr.c:145
darr_get_size
size_t darr_get_size(darr_t *da)
Definition
darr.c:37
darr_new
darr_t * darr_new(void)
Definition
darr.c:21
darr_find
int darr_find(darr_t *da, void *value, compfun_t compare)
Definition
darr.c:123
darr_destroy
void darr_destroy(darr_t *da)
Definition
darr.c:131
darr_push
int darr_push(darr_t *da, void *value, size_t size)
Definition
darr.c:54
darr_insert_at
int darr_insert_at(darr_t *da, size_t index, void *value, size_t size)
Definition
darr.c:86
darr_at
void * darr_at(darr_t *da, size_t index)
Definition
darr.c:50
darr_delete_at
int darr_delete_at(darr_t *da, size_t index)
Definition
darr.c:106
darr.h
DARR_DEFAULT_CAPACITY
#define DARR_DEFAULT_CAPACITY
Definition
darr.h:13
compfun_t
bool compfun_t(void const *curr, void const *value)
Definition
darr.h:32
DARR_DEFAULT_GROWING_FACTOR
#define DARR_DEFAULT_GROWING_FACTOR
Definition
darr.h:22
compare
bool compare(void const *curr, void const *value)
Definition
main.c:111
darr_t
Definition
darr.h:50
darr_t::_arr
void ** _arr
Definition
darr.h:52
darr_t::_size
size_t _size
Definition
darr.h:54
darr_t::_capacity
size_t _capacity
Definition
darr.h:56
src
darr.c
Generated by
1.12.0