fixed mistake in test/makemain.sh ; still vector_pop_first to fix in src/Vector.c
[cgds.git] / src / Vector.c
CommitLineData
a7868768
BA
1/**
2 * @file Vector.cpp
3 */
4
5#include "cgds/Vector.h"
6
7//////////////////
8// Vector logic //
9//////////////////
10
11void _vector_init(Vector* vector, size_t dataSize)
12{
13 vector->datas = NULL;
14 vector->dataSize = dataSize;
15 vector->size = 0;
16 vector->capacity = 0;
17}
18
19Vector* _vector_new(size_t dataSize)
20{
21 Vector* vector = (Vector*) safe_malloc(sizeof (Vector));
22 _vector_init(vector, dataSize);
23 return vector;
24}
25
26Vector* vector_copy(Vector* vector)
27{
28 Vector* vectorCopy = _vector_new(vector->dataSize);
29 vectorCopy->size = vector->size;
30 vectorCopy->capacity = vector->capacity;
31 vectorCopy->datas = (void**) safe_malloc(vector->capacity * sizeof (void*));
32 for (UInt i = 0; i < vector->size; i++)
33 {
34 vectorCopy->datas[i] = safe_malloc(vector->dataSize);
35 memcpy(vectorCopy->datas[i], vector->datas[i], vector->dataSize);
36 }
37 return vectorCopy;
38}
39
40Bool vector_empty(Vector* vector)
41{
42 return (vector->size == 0);
43}
44
45UInt vector_size(Vector* vector)
46{
47 return vector->size;
48}
49
50void _vector_realloc(Vector* vector, UInt newCapacity)
51{
52 void** rellocatedDatas = (void**) safe_malloc(newCapacity * sizeof (void*));
53 for (UInt i = 0; i < vector->size; i++)
54 {
55 rellocatedDatas[i] = (void*) safe_malloc(vector->dataSize);
56 memcpy(rellocatedDatas[i], vector->datas[i], vector->dataSize);
57 safe_free(vector->datas[i]);
58 }
59 safe_free(vector->datas);
60 vector->datas = rellocatedDatas;
61 vector->capacity = newCapacity;
62}
63
64void _vector_push(Vector* vector, void* data)
65{
66 void* pData = safe_malloc(vector->dataSize);
67 memcpy(pData, data, vector->dataSize);
68 if (vector->size >= vector->capacity)
69 {
70 UInt increasedCapacity = vector->capacity > 0 ? 2 * vector->capacity : 1;
71 _vector_realloc(vector, increasedCapacity);
72 }
73 vector->datas[vector->size] = pData;
74 vector->size++;
75}
76
77void vector_pop(Vector* vector)
78{
79 safe_free(vector->datas[vector_size(vector) - 1]);
80 vector->size--;
81 if (vector_size(vector) <= (vector->capacity >> 1))
82 _vector_realloc(vector, vector->capacity >> 1);
83}
84
8306616e
BA
85void vector_pop_first(Vector* vector)
86{
87 safe_free(vector->datas[0]);
6860e373
BA
88
89
90 //HACK: next 3 lines move vector head
91 void** nextDatas = vector->datas + 1;
92 safe_free(vector->datas);
93 vector->datas = nextDatas;
94//but memory can then be reallocated : TODO
95
96
8306616e 97 vector->size--;
6860e373 98 if (vector->size <= (vector->capacity >> 1))
8306616e
BA
99 _vector_realloc(vector, vector->capacity >> 1);
100}
101
a7868768
BA
102void* _vector_get(Vector* vector, UInt index)
103{
104 return vector->datas[index];
105}
106
107void _vector_set(Vector* vector, UInt index, void* data)
108{
109 memcpy(vector->datas[index], data, vector->dataSize);
110}
111
112void vector_clear(Vector* vector)
113{
114 for (UInt i = 0; i < vector->size; i++)
115 safe_free(vector->datas[i]);
116 safe_free(vector->datas);
117 _vector_init(vector, vector->dataSize);
118}
119
120void vector_destroy(Vector* vector)
121{
122 vector_clear(vector);
123 safe_free(vector);
124}
125
126////////////////////
127// Iterator logic //
128////////////////////
129
130VectorIterator* vector_get_iterator(Vector* vector)
131{
132 VectorIterator* vectorI = (VectorIterator*) safe_malloc(sizeof (VectorIterator));
133 vectorI->vector = vector;
134 vectorI_reset_begin(vectorI);
135 return vectorI;
136}
137
138void vectorI_reset_begin(VectorIterator* vectorI)
139{
140 vectorI->current = vectorI->vector->datas;
141}
142
143void vectorI_reset_end(VectorIterator* vectorI)
144{
145 vectorI->current = vectorI->vector->datas + vectorI->vector->size - 1;
146}
147
148Bool vectorI_has_data(VectorIterator* vectorI)
149{
150 return (vectorI->current >= vectorI->vector->datas &&
151 vectorI->current < vectorI->vector->datas + vectorI->vector->size);
152}
153
154void* _vectorI_get(VectorIterator* vectorI)
155{
156 return *(vectorI->current);
157}
158
159void _vectorI_set(VectorIterator* vectorI, void* data)
160{
161 *(vectorI->current) = data;
162}
163
164void vectorI_move_next(VectorIterator* vectorI)
165{
166 vectorI->current++;
167}
168
169void vectorI_move_prev(VectorIterator* vectorI)
170{
171 vectorI->current--;
172}
173
174void vectorI_destroy(VectorIterator* vectorI)
175{
176 safe_free(vectorI);
177}