Dinamic Array
 
Loading...
Searching...
No Matches
darr.c File Reference
#include "darr.h"
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>

Go to the source code of this file.

Functions

bool _increase_darr (darr_t *da)
 private method form darr_t
 
bool _shrink_darr (darr_t *da)
 private method form darr_t
 
darr_tdarr_new (void)
 
size_t darr_get_size (darr_t *da)
 
size_t darr_get_capacity (darr_t *da)
 
void * darr_at (darr_t *da, size_t index)
 
int darr_push (darr_t *da, void *value, size_t size)
 
int darr_pop (darr_t *da)
 
int darr_insert_at (darr_t *da, size_t index, void *value, size_t size)
 
int darr_delete_at (darr_t *da, size_t index)
 
int darr_find (darr_t *da, void *value, compfun_t compare)
 
void darr_destroy (darr_t *da)
 

Function Documentation

◆ _increase_darr()

bool _increase_darr ( darr_t * da)

private method form darr_t

Definition at line 145 of file darr.c.

145 {
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}
#define DARR_DEFAULT_GROWING_FACTOR
Definition darr.h:22
void ** _arr
Definition darr.h:52
size_t _size
Definition darr.h:54
size_t _capacity
Definition darr.h:56

◆ _shrink_darr()

bool _shrink_darr ( darr_t * da)

private method form darr_t

Definition at line 169 of file darr.c.

169 {
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}
#define DARR_DEFAULT_CAPACITY
Definition darr.h:13

◆ darr_at()

void * darr_at ( darr_t * da,
size_t index )

Definition at line 50 of file darr.c.

50 {
51 return index >= da->_size ? NULL : da->_arr[index];
52}

◆ darr_delete_at()

int darr_delete_at ( darr_t * da,
size_t index )

Definition at line 106 of file darr.c.

106 {
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}
bool _shrink_darr(darr_t *da)
private method form darr_t
Definition darr.c:169

◆ darr_destroy()

void darr_destroy ( darr_t * da)

Definition at line 131 of file darr.c.

131 {
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}

◆ darr_find()

int darr_find ( darr_t * da,
void * value,
compfun_t compare )

Definition at line 123 of file darr.c.

123 {
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}
bool compare(void const *curr, void const *value)
Definition main.c:111

◆ darr_get_capacity()

size_t darr_get_capacity ( darr_t * da)

Simple getter, this one was intended to be used for debugging propurses, but it can be in handy when needing to have fine control over the memory usage.

Returns
The darr_t._capacity attribute.

Definition at line 45 of file darr.c.

45{ return da->_capacity; }

◆ darr_get_size()

size_t darr_get_size ( darr_t * da)

Simple getter, intended to be used in for/while loops to interact with the array itself.

Returns
The darr_t._size attribute.

Definition at line 37 of file darr.c.

37{ return da->_size; }

◆ darr_insert_at()

int darr_insert_at ( darr_t * da,
size_t index,
void * value,
size_t size )

Definition at line 86 of file darr.c.

86 {
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}
bool _increase_darr(darr_t *da)
private method form darr_t
Definition darr.c:145

◆ darr_new()

darr_t * darr_new ( void )

Creates a darr_t instance in the heap and allocates the initial size that the array will occupe based on the DARR_DEFAULT_CAPACITY value. The array will be a pointer [array] to other pointers with void (generic) type, this means that the items should be castet to some type when using, e.g.: *(float *)da->_arr[1] or, even better, *(float *)darr_at(da, 1).

Returns
A pointer to the created darr_t instance, it should be used in the other darr_*() methods to interact with the array itself.

Definition at line 21 of file darr.c.

21 {
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}
Definition darr.h:50

◆ darr_pop()

int darr_pop ( darr_t * da)

Definition at line 70 of file darr.c.

70 {
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}

◆ darr_push()

int darr_push ( darr_t * da,
void * value,
size_t size )

Definition at line 54 of file darr.c.

54 {
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}