25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

140 lines
3.3 KiB

  1. #pragma once
  2. #include <stdlib.h>
  3. #include "types.hpp"
  4. template <typename type>
  5. struct Array_List {
  6. type* data;
  7. u32 length;
  8. u32 next_index;
  9. void alloc(u32 initial_capacity = 16) {
  10. data = (type*)malloc(initial_capacity * sizeof(type));
  11. next_index = 0;
  12. length = initial_capacity;
  13. }
  14. void dealloc() {
  15. free(data);
  16. data = 0;
  17. }
  18. void clear() {
  19. next_index = 0;
  20. }
  21. Array_List<type> clone() {
  22. Array_List<type> ret;
  23. ret.length = length;
  24. ret.next_index = next_index;
  25. ret.data = (type*)malloc(length * sizeof(type));
  26. for (u32 i = 0; i < next_index; ++i) {
  27. ret.data[i] = data[i];
  28. }
  29. return ret;
  30. }
  31. type* begin() {
  32. return data;
  33. }
  34. type* end() {
  35. return data+(next_index);
  36. }
  37. void remove_index(u32 index) {
  38. data[index] = data[--next_index];
  39. }
  40. void append(type element) {
  41. if (next_index == length) {
  42. length *= 2;
  43. data = (type*)realloc(data, length * sizeof(type));
  44. }
  45. data[next_index] = element;
  46. next_index++;
  47. }
  48. void reserve(u32 count) {
  49. if (next_index+count >= (u32)length) {
  50. length *= 2;
  51. data = (type*)realloc(data, length * sizeof(type));
  52. }
  53. }
  54. type& operator[](u32 index) {
  55. return data[index];
  56. }
  57. void _merge(u32 start, u32 mid, u32 end) {
  58. u32 start2 = mid + 1;
  59. /* If the direct merge is already sorted */
  60. if ((size_t)data[mid] <= (size_t)data[start2]) {
  61. return;
  62. }
  63. /* Two pointers to maintain start of both arrays to merge */
  64. while (start <= mid && start2 <= end) {
  65. if ((size_t)data[start] <= (size_t)data[start2]) {
  66. start++;
  67. }
  68. else {
  69. type value = data[start2];
  70. u32 index = start2;
  71. /* Shift all the elements between element 1; element 2, right by 1. */
  72. while (index != start) {
  73. data[index] = data[index - 1];
  74. index--;
  75. }
  76. data[start] = value;
  77. /* Update all the pointers */
  78. start++;
  79. mid++;
  80. start2++;
  81. }
  82. }
  83. }
  84. void sort(s32 left=-1, s32 right=-1) {
  85. if (left == -1) {
  86. if (next_index == 0)
  87. return;
  88. sort(0, next_index - 1);
  89. return;
  90. } else if (left == right) {
  91. return;
  92. }
  93. u32 middle = left + (right-left) / 2;
  94. sort(left, middle);
  95. sort(middle+1, right);
  96. _merge(left, middle, right);
  97. }
  98. u32 sorted_find(type elem, s32 left=-1, s32 right=-1) {
  99. if (left == -1) {
  100. return sorted_find(elem, 0, next_index - 1);
  101. } else if (left == right) {
  102. if ((size_t)data[left] == (size_t)elem)
  103. return left;
  104. return -1;
  105. } else if (right < left)
  106. return -1;
  107. u32 middle = left + (right-left) / 2;
  108. if ((size_t)data[middle] < (size_t)elem)
  109. return sorted_find(elem, middle+1, right);
  110. if ((size_t)data[middle] > (size_t)elem)
  111. return sorted_find(elem, left, middle-1);
  112. return middle;
  113. }
  114. };