Go to the documentation of this file.
65 #define VectorStruct(T) \
84 #define Vector(T, X) \
85 VectorStruct(T) X = { NULL, 0, 0 }
99 #define DeclareVector(T, X) \
113 #define VectorInit(X) \
130 #define VectorFree(X) \
132 M_free((X).ptr, "VectorFree:" #X); \
150 #define VectorPtr(X) \
165 #define VectorFront(X) \
180 #define VectorBack(X) \
181 ((X).ptr[(X).size - 1])
194 #define VectorSize(X) \
208 #define VectorCapacity(X) \
222 #define VectorEmpty(X) \
235 #define VectorClear(X) \
236 do { (X).size = 0; } while (0)
249 #define VectorReserve(X, newcapacity) \
251 size_t v_tmp_newcapacity_ = (newcapacity); \
252 if ( (X).capacity < v_tmp_newcapacity_ ) { \
253 void *v_tmp_newptr_; \
254 v_tmp_newcapacity_ = (v_tmp_newcapacity_ * 3) / 2; \
255 if ( v_tmp_newcapacity_ < 4 ) v_tmp_newcapacity_ = 4; \
256 v_tmp_newptr_ = Malloc1(sizeof((X).ptr[0]) * v_tmp_newcapacity_, "VectorReserve:" #X); \
257 if ( (X).ptr != NULL ) { \
258 memcpy(v_tmp_newptr_, (X).ptr, (X).size * sizeof((X).ptr[0])); \
259 M_free((X).ptr, "VectorReserve:" #X); \
261 (X).ptr = v_tmp_newptr_; \
262 (X).capacity = v_tmp_newcapacity_; \
277 #define VectorPushBack(X, x) \
279 VectorReserve((X), (X).size + 1); \
280 (X).ptr[(X).size++] = (x); \
295 #define VectorPushBacks(X, src, n) \
297 size_t v_tmp_n_ = (n); \
298 VectorReserve((X), (X).size + v_tmp_n_); \
299 memcpy((X).ptr + (X).size, (src), v_tmp_n_ * sizeof((X).ptr[0])); \
300 (X).size += v_tmp_n_; \
314 #define VectorPopBack(X) \
315 do { (X).size --; } while (0)
330 #define VectorInsert(X, index, x) \
332 size_t v_tmp_index_ = (index); \
333 VectorReserve((X), (X).size + 1); \
334 memmove((X).ptr + v_tmp_index_ + 1, (X).ptr + v_tmp_index_, ((X).size - v_tmp_index_) * sizeof((X).ptr[0])); \
335 (X).ptr[v_tmp_index_] = (x); \
353 #define VectorInserts(X, index, src, n) \
355 size_t v_tmp_index_ = (index), v_tmp_n_ = (n); \
356 VectorReserve((X), (X).size + v_tmp_n_); \
357 memmove((X).ptr + v_tmp_index_ + v_tmp_n_, (X).ptr + v_tmp_index_, ((X).size - v_tmp_index_) * sizeof((X).ptr[0])); \
358 memcpy((X).ptr + v_tmp_index_, (src), v_tmp_n_ * sizeof((X).ptr[0])); \
359 (X).size += v_tmp_n_; \
374 #define VectorErase(X, index) \
376 size_t v_tmp_index_ = (index); \
377 memmove((X).ptr + v_tmp_index_, (X).ptr + v_tmp_index_ + 1, ((X).size - v_tmp_index_ - 1) * sizeof((X).ptr[0])); \
394 #define VectorErases(X, index, n) \
396 size_t v_tmp_index_ = (index), v_tmp_n_ = (n); \
397 memmove((X).ptr + v_tmp_index_, (X).ptr + v_tmp_index_ + v_tmp_n_, ((X).size - v_tmp_index_ - 1) * sizeof((X).ptr[0])); \
398 (X).size -= v_tmp_n_; \