Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #ifndef __VECTOR_H__
- #define __VECTOR_H__
- /* system headers */
- #include <stdlib.h>
- #include <stddef.h>
- #include <string.h>
- /* ----- */
- #define PTR_ADD(A, B) ((void *)(((ptrdiff_t)(A)) + ((ptrdiff_t)(B))))
- #define PTR_SUB(A, B) (((ptrdiff_t)(A)) - ((ptrdiff_t)(B)))
- /* ----- */
- typedef struct
- {
- int size;
- void *data;
- int len;
- } vector_t;
- void vector_add(vector_t *v, void *data)
- {
- int newlen = v->len + 1;
- v->data = realloc(v->data, newlen * v->size);
- if (v->data != NULL) {
- memcpy(PTR_ADD(v->data, v->len * v->size), data, v->size);
- v->len++;
- }
- }
- void vector_insert(vector_t *v, void *data, int pos)
- {
- int newlen = v->len + 1;
- v->data = realloc(v->data, newlen * v->size);
- if (v->data != NULL) {
- void *ptr = PTR_ADD(v->data, pos * v->size);
- memmove(PTR_ADD(ptr, v->size), ptr, (v->len - pos) * v->size);
- memcpy(ptr, data, v->size);
- v->len++;
- }
- }
- void vector_insert_vector(vector_t *v1, vector_t *v2, int pos)
- {
- int newlen = v1->len + v2->len;
- v1->data = realloc(v1->data, newlen * v1->size);
- if (v1->data != NULL) {
- void *ptr = PTR_ADD(v1->data, pos * v1->size);
- memmove(PTR_ADD(ptr, v2->len * v1->size), ptr, (v1->len - pos) * v1->size);
- memcpy(ptr, v2->data, v2->len * v1->size);
- v1->len = newlen;
- }
- }
- void vector_merge(vector_t *v1, vector_t *v2)
- {
- int newlen = v1->len + v2->len;
- v1->data = realloc(v1->data, newlen * v1->size);
- if (v1->data != NULL) {
- memcpy(PTR_ADD(v1->data, v1->len * v1->size), v2->data, v2->len * v1->size);
- v1->len = newlen;
- }
- }
- void vector_del(vector_t *v, int pos)
- {
- int newlen = v->len - 1;
- if (pos < newlen)
- memmove(PTR_ADD(v->data, pos * v->size), PTR_ADD(v->data, (pos + 1) * v->size), (newlen - pos) * v->size);
- v->data = realloc(v->data, newlen * v->size);
- v->len--;
- }
- #define vector(A) ((vector_t *)(A))
- #define vector_init_size(A, B) memset(A, 0, sizeof(vector_t)); vector(A)->size = (B)
- #define vector_init(A, B) vector_init_size(A, sizeof(B))
- #define vector_free(A) if (vector(A)->len > 0) { free(vector(A)->data), vector(A)->data = NULL, vector(A)->len = 0; } (void)0
- #define vector_err(A) (vector(A)->len != 0 && vector(A)->data == NULL)
- #define vector_foreach(A, B) for (B = vector(A)->data; PTR_SUB(B, vector(A)->data) < vector(A)->len * vector(A)->size; B = PTR_ADD(B, vector(A)->size))
- #define vector_foreach_i(A, B) for (B *i = vector(A)->data; PTR_SUB(i, vector(A)->data) < vector(A)->len * vector(A)->size; i = PTR_ADD(i, vector(A)->size))
- #define vector_foreach_var(A, B, C) for (B *C = vector(A)->data; PTR_SUB(C, vector(A)->data) < vector(A)->len * vector(A)->size; C = PTR_ADD(C, vector(A)->size))
- #define vector_get(A, B) PTR_ADD(vector(A)->data, (B) * vector(A)->size)
- /* ----- */
- typedef vector_t vector_int_t;
- int vector_index_of_int(vector_int_t *v, int n)
- {
- for (int i = 0; i < v->len; i++)
- if (*(int *)vector_get(v, i) == n)
- return i;
- return -1;
- }
- #endif /* !__VECTOR_H__ */
Add Comment
Please, Sign In to add comment