vector.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include <stdint.h>
  2. #include <stddef.h>
  3. #include <stdbool.h>
  4. #include "vector.h"
  5. #include "alloc.h"
  6. zv_vector_t * zv_vector_create() {
  7. zv_vector_t *result = (zv_vector_t *) zv_alloc(sizeof(zv_vector_t));
  8. if (result == NULL) {
  9. return NULL;
  10. }
  11. result->lenght = 0;
  12. result->first = NULL;
  13. result->last = NULL;
  14. return result;
  15. }
  16. static inline zv_vector_container_t * __zv_vector_count_right(
  17. zv_vector_t *self,
  18. size_t count
  19. ) {
  20. zv_vector_container_t *current = self->last;
  21. count = self->lenght - count;
  22. while (count-- > 0) {
  23. current = current->previous;
  24. if (current == NULL) {
  25. return NULL;
  26. }
  27. }
  28. return current;
  29. }
  30. static inline zv_vector_container_t * __zv_vector_count_lefr(
  31. zv_vector_t *self,
  32. size_t count
  33. ) {
  34. zv_vector_container_t *current = self->first;
  35. while (count-- > 0) {
  36. current = current->next;
  37. if (current == NULL) {
  38. return NULL;
  39. }
  40. }
  41. return current;
  42. }
  43. static zv_vector_container_t * __zv_vector_get_container(
  44. zv_vector_t *self,
  45. size_t count
  46. ) {
  47. if (self->lenght <= count) {
  48. return NULL;
  49. }
  50. if (self->lenght / 2 > count) {
  51. return __zv_vector_count_right(self, count);
  52. }
  53. return __zv_vector_count_left(self, count);
  54. }
  55. zv_universal_t zv_vector_get(zv_vector_t *self, size_t count) {
  56. zv_vector_container_t *current = __zv_vector_get_container(self, count);
  57. if (current == NULL) {
  58. return NULL;
  59. }
  60. return current->content;
  61. }
  62. size_t zv_vector_push(zv_vector_t *, zv_universal_t);
  63. size_t zv_vector_count(zv_vector_t *);
  64. zv_universal_t zv_vector_pop(zv_vector_t *, size_t);
  65. bool zv_vector_insert(zv_vector_t *, zv_universal_t, size_t);
  66. void zv_vector_remove(zv_vector_t *);
  67. zv_universal_t * zv_vector_to_array(zv_vector_t *);