Guest User

Untitled

a guest
Nov 12th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. #ifndef DYNAMIC_ARRAY_H
  2. #define DYNAMIC_ARRAY_H
  3.  
  4. #include <stdlib.h>
  5. #include <stddef.h>
  6.  
  7. #define DYNAMIC_ARRAY_INIT_CAPACITY 4
  8. #define DYNAMIC_ARRAY_GROWTH_FACTOR 2
  9.  
  10. typedef struct List
  11. {
  12. int size;
  13. int elementSize;
  14. int capacity;
  15. void *data;
  16. } List;
  17.  
  18. //Create a list, element size is the size of each element in bytes.
  19. inline List *ListCreate(int elementSize)
  20. {
  21. List *list = malloc(sizeof(List));
  22. list->size = 0;
  23. list->elementSize = elementSize;
  24. list->capacity = DYNAMIC_ARRAY_INIT_CAPACITY;
  25. list->data = malloc(elementSize * list->capacity);
  26. return list;
  27. }
  28.  
  29. //Create a list with advanced options
  30. inline List *ListCreateAdv(int elementSize, int startSize, int capacity)
  31. {
  32. List *list = malloc(sizeof(List));
  33. list->size = startSize;
  34. list->elementSize = elementSize;
  35. list->capacity = capacity;
  36. list->data = malloc(elementSize * list->capacity);
  37. return list;
  38. }
  39.  
  40. //Get an element from a list
  41. inline void *ListGet(List *list, int index)
  42. {
  43. if (index < list->size)
  44. return (char*)list->data + (index * list->elementSize);
  45. else
  46. return NULL;
  47. }
  48.  
  49. //Push to a list
  50. inline void ListPushBack(List *list, void *data)
  51. {
  52. if (list->size >= list->capacity)
  53. {
  54. //Allocate/set new data
  55. list->capacity *= DYNAMIC_ARRAY_GROWTH_FACTOR;
  56. void *newLocation = malloc(list->elementSize * list->capacity);
  57. memcpy(newLocation, list->data, list->elementSize * list->size);
  58.  
  59. //Free old data
  60. free(list->data);
  61.  
  62. //Set new pointer
  63. list->data = newLocation;
  64. }
  65.  
  66. //Add to size, and copy element data
  67. list->size++;
  68. memcpy(ListGet(list, list->size - 1), data, list->elementSize);
  69. }
  70.  
  71. //Insert an element into a list at index
  72. inline void ListInsert(List *list, int index, void *data)
  73. {
  74. //Increase size
  75. if (list->size >= list->capacity)
  76. {
  77. //Allocate/set new data
  78. list->capacity *= DYNAMIC_ARRAY_GROWTH_FACTOR;
  79. void *newLocation = malloc(list->elementSize * list->capacity);
  80. memcpy(newLocation, list->data, list->elementSize * list->size);
  81.  
  82. //Free old data
  83. free(list->data);
  84.  
  85. //Set new pointer
  86. list->data = newLocation;
  87. }
  88. list->size++;
  89.  
  90. //Copy all elements from after index, over 1
  91. memcpy(
  92. (char*)list->data + ((index + 1) * list->elementSize), //Destination
  93. (char*)list->data + ((index)* list->elementSize), //Source
  94. (list->size - index) * list->elementSize); //Size
  95.  
  96. //Copy data into index
  97. memcpy(ListGet(list, index), data, list->elementSize);
  98. }
  99.  
  100. //Remove an element from a list at index
  101. inline void ListRemove(List *list, int index)
  102. {
  103. if (index < list->size)
  104. {
  105. list->size--;
  106.  
  107. //Copy everything back
  108. memcpy(ListGet(list, index), (char*)ListGet(list, index) + (1 * list->elementSize), (list->size - index) * list->elementSize);
  109. }
  110. }
  111.  
  112. //Free all memory of list
  113. inline void ListFree(List **list)
  114. {
  115. free((*list)->data);
  116. free(*list);
  117. *list = NULL;
  118. }
  119.  
  120. #endif //DYNAMIC_ARRAY_H
Add Comment
Please, Sign In to add comment