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
8bool _increase_darr(darr_t *da);
9bool _shrink_darr(darr_t *da);
10
22 darr_t *da = malloc(sizeof(darr_t));
23
24 da->_size = 0;
26 da->_arr = malloc(da->_capacity * sizeof(void *));
27
28 return da;
29}
30
37size_t darr_get_size(darr_t *da) { return da->_size; }
38
45size_t darr_get_capacity(darr_t *da) { return da->_capacity; }
46
50void *darr_at(darr_t *da, size_t index) {
51 return index >= da->_size ? NULL : da->_arr[index];
52}
53
54int 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
70int 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
86int 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
106int 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
123int 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
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
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
170 if ((float)da->_size - 1 >=
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}
size_t darr_get_capacity(darr_t *da)
Definition darr.c:45
int darr_pop(darr_t *da)
Definition darr.c:70
bool _shrink_darr(darr_t *da)
private method form darr_t
Definition darr.c:169
bool _increase_darr(darr_t *da)
private method form darr_t
Definition darr.c:145
size_t darr_get_size(darr_t *da)
Definition darr.c:37
darr_t * darr_new(void)
Definition darr.c:21
int darr_find(darr_t *da, void *value, compfun_t compare)
Definition darr.c:123
void darr_destroy(darr_t *da)
Definition darr.c:131
int darr_push(darr_t *da, void *value, size_t size)
Definition darr.c:54
int darr_insert_at(darr_t *da, size_t index, void *value, size_t size)
Definition darr.c:86
void * darr_at(darr_t *da, size_t index)
Definition darr.c:50
int darr_delete_at(darr_t *da, size_t index)
Definition darr.c:106
#define DARR_DEFAULT_CAPACITY
Definition darr.h:13
bool compfun_t(void const *curr, void const *value)
Definition darr.h:32
#define DARR_DEFAULT_GROWING_FACTOR
Definition darr.h:22
bool compare(void const *curr, void const *value)
Definition main.c:111
Definition darr.h:50
void ** _arr
Definition darr.h:52
size_t _size
Definition darr.h:54
size_t _capacity
Definition darr.h:56