fork(3) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct {
  6. char *data;
  7. size_t capacity;
  8. size_t size;
  9. const size_t element_size;
  10. } vector;
  11.  
  12. vector vector_init(size_t initial_capacity, size_t element_size) {
  13. if(!initial_capacity) {
  14. initial_capacity = 1;
  15. }
  16. vector result = {
  17. malloc(initial_capacity*element_size),
  18. initial_capacity,
  19. 0,
  20. element_size
  21. };
  22. return result;
  23. }
  24.  
  25. char *vector_get(vector *vec, size_t idx) {
  26. return vec->size > idx
  27. ? vec->data + idx*vec->element_size
  28. : NULL;
  29. }
  30.  
  31. void vector_reserve(vector *vec, size_t size) {
  32. if(vec->capacity >= size) {
  33. return;
  34. }
  35.  
  36. vec->capacity = size;
  37. vec->data = realloc(vec->data, vec->capacity*size);
  38. }
  39.  
  40. void vector_push(vector *vec, void *data) {
  41. if(vec->size >= vec->capacity) {
  42. vector_reserve(vec, vec->capacity*2);
  43. }
  44.  
  45. memcpy(vec->data + vec->size*vec->element_size, data, vec->element_size);
  46. vec->size += 1;
  47. }
  48.  
  49. size_t vector_size(vector const *vec) {
  50. return vec->size;
  51. }
  52.  
  53. size_t vector_capacity(vector const *vec) {
  54. return vec->capacity;
  55. }
  56.  
  57. void vector_free(vector *vec) {
  58. free(vec->data);
  59. }
  60.  
  61. int main(void) {
  62. int initial_capacity = 0;
  63. vector vec = vector_init(initial_capacity, sizeof(int));
  64. int i = 10;
  65.  
  66. while(i --> 0) {
  67. vector_push(&vec, &i);
  68. }
  69.  
  70. printf("vector size: %d\n", vector_size(&vec));
  71. printf("vector capacity: %d\n", vector_capacity(&vec));
  72. printf("vector values:\n");
  73. for(i = 0; i < vector_size(&vec); ++i) {
  74. printf(" vec[%d]: %d\n", i, *(int*)vector_get(&vec, i));
  75. }
  76. vector_free(&vec);
  77. return 0;
  78. }
  79.  
Success #stdin #stdout 0s 2300KB
stdin
Standard input is empty
stdout
vector size:     10
vector capacity: 16
vector values:
  vec[0]: 9
  vec[1]: 8
  vec[2]: 7
  vec[3]: 6
  vec[4]: 5
  vec[5]: 4
  vec[6]: 3
  vec[7]: 2
  vec[8]: 1
  vec[9]: 0