vector.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "vector.h"
  2. #include <string.h>
  3. #include "gc_prelude.h"
  4. struct vector {
  5. size_t length;
  6. size_t capacity;
  7. void** buf;
  8. };
  9. static void Vector_enlarge(Vector self) {
  10. self->buf = realloc(self->buf, self->capacity * sizeof(Object) * 2);
  11. self->capacity = self->capacity * 2;
  12. }
  13. Vector new_Vector() {
  14. Vector vec = malloc(sizeof(struct vector));
  15. vec->length = 0;
  16. vec->capacity = 16;
  17. vec->buf = malloc(16 * sizeof(Object));
  18. return vec;
  19. }
  20. void Vector_pushBack(Vector self, Object obj) {
  21. if (self->length == self->capacity) Vector_enlarge(self);
  22. self->buf[self->length] = obj;
  23. self->length++;
  24. }
  25. Object Vector_get(Vector self, size_t n) {
  26. if (n < 0 || n >= self->length) return NULL;
  27. return self->buf[n];
  28. }
  29. void Vector_erase(Vector self, size_t n) {
  30. if (self->length <= n) {
  31. return;
  32. }
  33. memmove(self->buf + n, self->buf + n + 1, (self->length - n - 1) * sizeof(Object));
  34. self->length--;
  35. }
  36. size_t Vector_size(Vector self) {
  37. return self->length;
  38. }
  39. void Vector_reserve(Vector self, size_t n) {
  40. if (n <= self->capacity) {
  41. return;
  42. }
  43. self->buf = malloc(sizeof(void*) * n);
  44. self->capacity = n;
  45. }
  46. void Vector_insert(Vector self, size_t pos, Object obj) {
  47. if (self->length == self->capacity) {
  48. Vector_enlarge(self);
  49. }
  50. if (pos > self->length || pos < 0) return;
  51. memmove(self->buf + pos + 1, self->buf + pos, sizeof(void*) * (self->length - pos));
  52. self->buf[pos] = obj;
  53. self->length++;
  54. }