-
Notifications
You must be signed in to change notification settings - Fork 0
/
ue_vector.c
137 lines (111 loc) · 3.88 KB
/
ue_vector.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
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
#include "ue_vector.h"
ue_vector* ue_vector_start(size_t init_capacity, size_t data_size) {
if (init_capacity == 0)
init_capacity = 4;
ue_vector* new_vect = (ue_vector*)malloc(sizeof(ue_vector));
assert(new_vect != NULL);
new_vect->data = (void**)malloc(sizeof(void*) * init_capacity);
assert(new_vect->data != NULL);
new_vect->data_size = data_size;
new_vect->capacity = init_capacity;
new_vect->length = 0;
return new_vect;
}
void ue_vector_finish(ue_vector* vect) {
for (size_t i = 0; i < ue_vector_length(vect); ++i)
free(vect->data[i]);
free(vect->data);
free(vect);
}
size_t ue_vector_length(const ue_vector* const vect) {
assert(vect != NULL);
return vect->length;
}
size_t ue_vector_capacity(const ue_vector* const vect) {
assert(vect != NULL);
return vect->capacity;
}
size_t ue_vector_data_size(const ue_vector* const vect) {
assert(vect != NULL);
return vect->data_size;
}
bool ue_vector_is_empty(const ue_vector* const vect) {
assert(vect != NULL);
return ue_vector_length(vect) == 0;
}
void ue_vector_resize(ue_vector* vect) {
assert(vect != NULL);
if (ue_vector_length(vect) == ue_vector_capacity(vect)) {
vect->capacity += ue_vector_capacity(vect) / 2;
vect->data = (void**)realloc(vect->data, sizeof(void*) * ue_vector_capacity(vect));
}
}
void ue_vector_shrink_to_fit(ue_vector* vect) {
assert(vect != NULL);
assert(!ue_vector_is_empty(vect));
vect->capacity = ue_vector_length(vect) + 1;
vect->data = (void**)realloc(vect->data, sizeof(void*) * ue_vector_capacity(vect));
}
void ue_vector_add_back(ue_vector* vect, const void* const to_be_added) {
assert(vect != NULL);
assert(to_be_added != NULL);
if (!ue_vector_is_empty(vect))
ue_vector_add_in(vect, to_be_added, ue_vector_length(vect));
else
ue_vector_add_in(vect, to_be_added, 0);
}
void ue_vector_add_front(ue_vector* vect, const void* const to_be_added) {
assert(vect != NULL);
assert(to_be_added != NULL);
ue_vector_add_in(vect, to_be_added, 0);
}
void ue_vector_add_in(ue_vector* vect, const void* const to_be_added, size_t pos) {
assert(vect != NULL);
assert(to_be_added != NULL);
assert(pos <= ue_vector_length(vect));
ue_vector_resize(vect);
vect->data[ue_vector_length(vect)] = (void*)malloc(ue_vector_data_size(vect));
// moving elements
for (size_t i = ue_vector_length(vect); i > pos; --i) {
memcpy(vect->data[i], vect->data[i - 1], ue_vector_data_size(vect));
}
memcpy(vect->data[pos], to_be_added, ue_vector_data_size(vect));
++(vect->length);
}
void* ue_vector_get_back(const ue_vector* const vect) {
assert(vect != NULL);
assert(ue_vector_length(vect) != 0);
return ue_vector_get_in(vect, ue_vector_length(vect) - 1);
}
void* ue_vector_get_front(const ue_vector* const vect) {
assert(vect != NULL);
assert(ue_vector_length(vect) != 0);
return ue_vector_get_in(vect, 0);
}
void* ue_vector_get_in(const ue_vector* const vect, size_t pos) {
assert(vect != NULL);
assert(ue_vector_length(vect) != 0);
assert(pos < ue_vector_length(vect));
return vect->data[pos];
}
void ue_vector_delete_back(ue_vector* vect) {
assert(vect != NULL);
assert(!ue_vector_is_empty(vect));
ue_vector_delete_in(vect, ue_vector_length(vect) - 1);
}
void ue_vector_delete_front(ue_vector* vect) {
assert(vect != NULL);
assert(!ue_vector_is_empty(vect));
ue_vector_delete_in(vect, 0);
}
void ue_vector_delete_in(ue_vector* vect, size_t pos) {
assert(vect != NULL);
assert(!ue_vector_is_empty(vect));
assert(pos < ue_vector_length(vect));
// moving elements
for (size_t i = pos; i < ue_vector_length(vect) - 1; ++i) {
memcpy(vect->data[i], vect->data[i + 1], ue_vector_data_size(vect));
}
free(vect->data[ue_vector_length(vect) - 1]);
--(vect->length);
}