Guest User

Untitled

a guest
Nov 13th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.01 KB | None | 0 0
  1. #pragma once
  2. #ifndef __VECTOR_H__
  3. #define __VECTOR_H__
  4.  
  5. /* system headers */
  6. #include <stdlib.h>
  7. #include <stddef.h>
  8. #include <string.h>
  9.  
  10. /* ----- */
  11.  
  12. #define PTR_ADD(A, B) ((void *)(((ptrdiff_t)(A)) + ((ptrdiff_t)(B))))
  13. #define PTR_SUB(A, B) (((ptrdiff_t)(A)) - ((ptrdiff_t)(B)))
  14.  
  15. /* ----- */
  16.  
  17. typedef struct
  18. {
  19. int size;
  20. void *data;
  21. int len;
  22. } vector_t;
  23.  
  24. void vector_add(vector_t *v, void *data)
  25. {
  26. int newlen = v->len + 1;
  27. v->data = realloc(v->data, newlen * v->size);
  28. if (v->data != NULL) {
  29. memcpy(PTR_ADD(v->data, v->len * v->size), data, v->size);
  30. v->len++;
  31. }
  32. }
  33.  
  34. void vector_insert(vector_t *v, void *data, int pos)
  35. {
  36. int newlen = v->len + 1;
  37. v->data = realloc(v->data, newlen * v->size);
  38. if (v->data != NULL) {
  39. void *ptr = PTR_ADD(v->data, pos * v->size);
  40. memmove(PTR_ADD(ptr, v->size), ptr, (v->len - pos) * v->size);
  41. memcpy(ptr, data, v->size);
  42. v->len++;
  43. }
  44. }
  45.  
  46. void vector_insert_vector(vector_t *v1, vector_t *v2, int pos)
  47. {
  48. int newlen = v1->len + v2->len;
  49. v1->data = realloc(v1->data, newlen * v1->size);
  50. if (v1->data != NULL) {
  51. void *ptr = PTR_ADD(v1->data, pos * v1->size);
  52. memmove(PTR_ADD(ptr, v2->len * v1->size), ptr, (v1->len - pos) * v1->size);
  53. memcpy(ptr, v2->data, v2->len * v1->size);
  54. v1->len = newlen;
  55. }
  56. }
  57.  
  58. void vector_merge(vector_t *v1, vector_t *v2)
  59. {
  60. int newlen = v1->len + v2->len;
  61. v1->data = realloc(v1->data, newlen * v1->size);
  62. if (v1->data != NULL) {
  63. memcpy(PTR_ADD(v1->data, v1->len * v1->size), v2->data, v2->len * v1->size);
  64. v1->len = newlen;
  65. }
  66. }
  67.  
  68. void vector_del(vector_t *v, int pos)
  69. {
  70. int newlen = v->len - 1;
  71. if (pos < newlen)
  72. memmove(PTR_ADD(v->data, pos * v->size), PTR_ADD(v->data, (pos + 1) * v->size), (newlen - pos) * v->size);
  73. v->data = realloc(v->data, newlen * v->size);
  74. v->len--;
  75. }
  76.  
  77. #define vector(A) ((vector_t *)(A))
  78. #define vector_init_size(A, B) memset(A, 0, sizeof(vector_t)); vector(A)->size = (B)
  79. #define vector_init(A, B) vector_init_size(A, sizeof(B))
  80. #define vector_free(A) if (vector(A)->len > 0) { free(vector(A)->data), vector(A)->data = NULL, vector(A)->len = 0; } (void)0
  81. #define vector_err(A) (vector(A)->len != 0 && vector(A)->data == NULL)
  82.  
  83. #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))
  84. #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))
  85. #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))
  86.  
  87. #define vector_get(A, B) PTR_ADD(vector(A)->data, (B) * vector(A)->size)
  88.  
  89. /* ----- */
  90.  
  91. typedef vector_t vector_int_t;
  92.  
  93. int vector_index_of_int(vector_int_t *v, int n)
  94. {
  95. for (int i = 0; i < v->len; i++)
  96. if (*(int *)vector_get(v, i) == n)
  97. return i;
  98. return -1;
  99. }
  100.  
  101. #endif /* !__VECTOR_H__ */
Add Comment
Please, Sign In to add comment