-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathda.h
More file actions
147 lines (126 loc) · 4.75 KB
/
Copy pathda.h
File metadata and controls
147 lines (126 loc) · 4.75 KB
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef DARRAY_H_
#define DARRAY_H_
#define DADEF static inline
#ifndef DA_DEFAULT_INITIAL_CAPACITY
#define DA_DEFAULT_INITIAL_CAPACITY 64
#endif // DEFAULT_INITIAL_CAPACITY
#ifndef DA_DEFAULT_INCREASE_SIZE
#define DA_DEFAULT_INCREASE_SIZE 64
#endif // DEFAULT_INCREASE_SIZE
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "stdint.h"
typedef struct DArray
{
void* elements; // pointer to the array of elements
uint16_t element_size; // size of the element in byte
uint32_t length; // number of element we holden in the array
uint32_t capacity; // number of element can be hold in the array
uint32_t increase_size; // number of elements we prepare to hold in the array
} DArray;
DADEF DArray DA_create_array(uint16_t element_size, uint32_t initial_capacity, uint32_t increase_size);
DADEF void DA_append(DArray* da, void* element);
DADEF void DA_insert(DArray* da, void *element, uint32_t index);
DADEF void DA_set_element(DArray* da, void *element, uint32_t index);
DADEF size_t DA_len(DArray* da);
DADEF int64_t DA_get_first_index(DArray* da, void* element);
DADEF void* DA_get_element(DArray* da, uint32_t index);
DADEF void DA_delete(DArray* da, uint32_t index);
DADEF void DA_reset(DArray* da);
DADEF void DA_clear(DArray* da);
DADEF void DA_destroy(DArray* da);
#endif // DARRAY_H_
#ifdef DA_IMPLEMENTATION
DADEF DArray DA_create_array(uint16_t element_size,
uint32_t initial_capacity,
uint32_t increase_size){
if (initial_capacity == 0) {
initial_capacity = DA_DEFAULT_INITIAL_CAPACITY;
}
if (increase_size == 0) {
increase_size = DA_DEFAULT_INCREASE_SIZE;
}
DArray da = {.element_size = element_size,
.capacity = initial_capacity,
.increase_size = increase_size};
da.elements = (void*)malloc(da.capacity * da.element_size);
return da;
}
DADEF void DA_append(DArray* da, void* element){
if(da->length + 1 > da->capacity){
da->elements = (void*)realloc(da->elements, (da->capacity + da->increase_size) * da->element_size);
da->capacity += da->increase_size;
}
memcpy(da->elements + (da->length * da->element_size), element, (size_t)(da->element_size));
da->length += 1;
}
DADEF void DA_insert(DArray* da, void *element, uint32_t index){
if(da->length + 1 > da->capacity){
da->elements = (void*)realloc(da->elements, (size_t)((da->capacity + da->increase_size) * da->element_size));
da->capacity += da->increase_size;
}
for(uint32_t i = da->length - 1; i >= index; i--){
// memcpy(da->elements + (da->length * da->element_size), element, (size_t)(da->element_size));
memmove(da->elements + ((i + 1) * da->element_size),
da->elements + ((i + 0) * da->element_size),
(size_t)da->element_size);
}
memcpy(da->elements + (index * da->element_size),
element, (size_t)(da->element_size));
da->length += 1;
}
DADEF void DA_set_element(DArray* da, void *element, uint32_t index){
memcpy(da->elements + (index * da->element_size),
element, (size_t)da->element_size);
}
DADEF size_t DA_len(DArray* da){
return (size_t)da->length;
}
DADEF int64_t DA_get_first_index(DArray* da, void* element){
for(uint32_t i = 0; i < da->length; i++)
{
if(memcmp(da->elements + (i * da->element_size),
element, da->element_size) == 0){
return (int64_t)i;
}
}
return -1;
}
DADEF void* DA_get_element(DArray* da, uint32_t index){
if(index >= da->length){
return NULL;
}
return (da->elements + (index * da->element_size));
}
DADEF void DA_delete(DArray* da, uint32_t index){
if(index >= da->length) return;
uint32_t NumberOfElementsBehind = da->length - 1 - index;
(void)NumberOfElementsBehind;
for(uint32_t i = index; i < da->length; i++){
memmove(da->elements + ((i + 0) * da->element_size),
da->elements + ((i + 1) * da->element_size),
(size_t)da->element_size);
}
da->length -= 1;
if(da->length < (da->capacity - da->increase_size)){
da->elements = (void*)realloc(da->elements, (size_t)((da->capacity - da->increase_size) * da->element_size));
da->capacity -= da->increase_size;
}
}
DADEF void DA_reset(DArray* da){
da->length = 0;
}
DADEF void DA_clear(DArray* da){
memset(da->elements, 0, (size_t)(da->capacity * da->element_size));
da->capacity = da->increase_size;
da->elements = (void*)realloc(da->elements, da->capacity);
da->length = 0;
}
DADEF void DA_destroy(DArray* da){
free(da->elements);
da->increase_size = 0;
da->capacity = 0;
da->length = 0;
}
#endif // DA_IMPLEMENTATION