vector.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "pocketpy/common/vector.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void c11_array__ctor(c11_array* self, int elem_size, int count){
  5. self->data = malloc(elem_size * count);
  6. self->count = count;
  7. self->elem_size = elem_size;
  8. }
  9. void c11_array__dtor(c11_array* self){
  10. free(self->data);
  11. self->data = NULL;
  12. self->count = 0;
  13. }
  14. c11_array c11_array__copy(const c11_array* self){
  15. c11_array retval;
  16. c11_array__ctor(&retval, self->elem_size, self->count);
  17. memcpy(retval.data, self->data, self->elem_size * self->count);
  18. return retval;
  19. }
  20. void* c11_array__at(c11_array* self, int index){
  21. return (char*)self->data + self->elem_size * index;
  22. }
  23. void c11_vector__ctor(c11_vector* self, int elem_size){
  24. self->data = NULL;
  25. self->count = 0;
  26. self->capacity = 0;
  27. self->elem_size = elem_size;
  28. }
  29. void c11_vector__dtor(c11_vector* self){
  30. if(self->data) free(self->data);
  31. self->data = NULL;
  32. self->count = 0;
  33. self->capacity = 0;
  34. }
  35. c11_vector c11_vector__copy(const c11_vector* self){
  36. c11_vector retval;
  37. c11_vector__ctor(&retval, self->elem_size);
  38. c11_vector__reserve(&retval, self->capacity);
  39. memcpy(retval.data, self->data, self->elem_size * self->count);
  40. retval.count = self->count;
  41. return retval;
  42. }
  43. void* c11_vector__at(c11_vector* self, int index){
  44. return (char*)self->data + self->elem_size * index;
  45. }
  46. void c11_vector__reserve(c11_vector* self, int capacity){
  47. if(capacity < 4) capacity = 4;
  48. if(capacity <= self->capacity) return;
  49. self->capacity = capacity;
  50. self->data = realloc(self->data, self->elem_size * self->capacity);
  51. }
  52. c11_array c11_vector__as_array(c11_vector* self){
  53. c11_array retval = {
  54. .data = self->data,
  55. .count = self->count,
  56. .elem_size = self->elem_size,
  57. };
  58. return retval;
  59. }