iron_array.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. #include "iron_array.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "iron_string.h"
  5. #include "iron_gc.h"
  6. void array_free(void *a) {
  7. u8_array_t *tmp = (u8_array_t *)a;
  8. gc_free(tmp->buffer);
  9. tmp->buffer = NULL;
  10. tmp->length = tmp->capacity = 0;
  11. }
  12. static void *gc_realloc_no_free(void *ptr, size_t old_size, size_t new_size) {
  13. void *buffer = gc_alloc(new_size);
  14. memcpy(buffer, ptr, old_size);
  15. return buffer;
  16. }
  17. static void array_alloc(void *a, uint8_t element_size) {
  18. u8_array_t *tmp = (u8_array_t *)a;
  19. if (tmp->length >= tmp->capacity) {
  20. if (tmp->capacity == 0) {
  21. // If the array was created in armpack, length can already be > 0
  22. tmp->capacity = tmp->length + 1;
  23. size_t old_size = tmp->length * element_size;
  24. size_t new_size = tmp->capacity * element_size;
  25. tmp->buffer = gc_realloc_no_free(tmp->buffer, old_size, new_size);
  26. }
  27. else {
  28. tmp->capacity *= 2;
  29. tmp->buffer = gc_realloc(tmp->buffer, tmp->capacity * element_size);
  30. }
  31. if (element_size < 8) {
  32. gc_leaf(tmp->buffer);
  33. }
  34. else {
  35. gc_array(tmp->buffer, &tmp->length);
  36. }
  37. }
  38. }
  39. void i8_array_push(i8_array_t *a, int8_t e) {
  40. array_alloc(a, sizeof(int8_t));
  41. a->buffer[a->length++] = e;
  42. }
  43. void u8_array_push(u8_array_t *a, uint8_t e) {
  44. array_alloc(a, sizeof(uint8_t));
  45. a->buffer[a->length++] = e;
  46. }
  47. void i16_array_push(i16_array_t *a, int16_t e) {
  48. array_alloc(a, sizeof(int16_t));
  49. a->buffer[a->length++] = e;
  50. }
  51. void u16_array_push(u16_array_t *a, uint16_t e) {
  52. array_alloc(a, sizeof(uint16_t));
  53. a->buffer[a->length++] = e;
  54. }
  55. void i32_array_push(i32_array_t *a, int32_t e) {
  56. array_alloc(a, sizeof(int32_t));
  57. a->buffer[a->length++] = e;
  58. }
  59. void u32_array_push(u32_array_t *a, uint32_t e) {
  60. array_alloc(a, sizeof(uint32_t));
  61. a->buffer[a->length++] = e;
  62. }
  63. void f32_array_push(f32_array_t *a, float e) {
  64. array_alloc(a, sizeof(float));
  65. a->buffer[a->length++] = e;
  66. }
  67. void any_array_push(any_array_t *a, void *e) {
  68. array_alloc(a, sizeof(uintptr_t));
  69. a->buffer[a->length++] = e;
  70. }
  71. void char_ptr_array_push(char_ptr_array_t *a, void *e) {
  72. array_alloc(a, sizeof(uintptr_t));
  73. a->buffer[a->length++] = e;
  74. }
  75. void i8_array_resize(i8_array_t *a, uint32_t size) {
  76. a->capacity = size;
  77. a->buffer = gc_realloc(a->buffer, a->capacity * sizeof(int8_t));
  78. gc_leaf(a->buffer);
  79. }
  80. void u8_array_resize(u8_array_t *a, uint32_t size) {
  81. a->capacity = size;
  82. a->buffer = gc_realloc(a->buffer, a->capacity * sizeof(uint8_t));
  83. gc_leaf(a->buffer);
  84. }
  85. void i16_array_resize(i16_array_t *a, uint32_t size) {
  86. a->capacity = size;
  87. a->buffer = gc_realloc(a->buffer, a->capacity * sizeof(int16_t));
  88. gc_leaf(a->buffer);
  89. }
  90. void u16_array_resize(u16_array_t *a, uint32_t size) {
  91. a->capacity = size;
  92. a->buffer = gc_realloc(a->buffer, a->capacity * sizeof(uint16_t));
  93. gc_leaf(a->buffer);
  94. }
  95. void i32_array_resize(i32_array_t *a, uint32_t size) {
  96. a->capacity = size;
  97. a->buffer = gc_realloc(a->buffer, a->capacity * sizeof(int32_t));
  98. gc_leaf(a->buffer);
  99. }
  100. void u32_array_resize(u32_array_t *a, uint32_t size) {
  101. a->capacity = size;
  102. a->buffer = gc_realloc(a->buffer, a->capacity * sizeof(uint32_t));
  103. gc_leaf(a->buffer);
  104. }
  105. void f32_array_resize(f32_array_t *a, uint32_t size) {
  106. a->capacity = size;
  107. a->buffer = gc_realloc(a->buffer, a->capacity * sizeof(float));
  108. gc_leaf(a->buffer);
  109. }
  110. void any_array_resize(any_array_t *a, uint32_t size) {
  111. a->capacity = size;
  112. a->buffer = gc_realloc(a->buffer, a->capacity * sizeof(void *));
  113. gc_array(a->buffer, &a->length);
  114. }
  115. void char_ptr_array_resize(char_ptr_array_t *a, uint32_t size) {
  116. a->capacity = size;
  117. a->buffer = gc_realloc(a->buffer, a->capacity * sizeof(void *));
  118. gc_array(a->buffer, &a->length);
  119. }
  120. void buffer_resize(buffer_t *b, uint32_t size) {
  121. b->length = size;
  122. b->buffer = gc_realloc(b->buffer, b->length * sizeof(uint8_t));
  123. gc_leaf(b->buffer);
  124. }
  125. static int _array_sort_alpha(const void *a, const void *b) {
  126. return strcmp(*(const char **)a, *(const char **)b);
  127. }
  128. void array_sort(any_array_t *ar, int (*compare)(const void *, const void *)) {
  129. if (compare == NULL) {
  130. compare = _array_sort_alpha;
  131. }
  132. qsort(ar->buffer, ar->length, sizeof(ar->buffer[0]), compare);
  133. }
  134. static int _array_sort_num(const void *a, const void *b) {
  135. return (*(int *)a - *(int *)b);
  136. }
  137. void i32_array_sort(i32_array_t *ar, int (*compare)(const void *, const void *)) {
  138. if (compare == NULL) {
  139. compare = _array_sort_num;
  140. }
  141. qsort(ar->buffer, ar->length, sizeof(ar->buffer[0]), compare);
  142. }
  143. void *array_pop(any_array_t *ar) {
  144. ar->length--;
  145. return ar->buffer[ar->length];
  146. }
  147. int i32_array_pop(i32_array_t *ar) {
  148. ar->length--;
  149. return ar->buffer[ar->length];
  150. }
  151. void *array_shift(any_array_t *ar) {
  152. void *first = ar->buffer[0];
  153. for (uint32_t i = 0; i < ar->length - 1; ++i) {
  154. ar->buffer[i] = ar->buffer[i + 1];
  155. }
  156. ar->length--;
  157. return first;
  158. }
  159. void array_splice(any_array_t *ar, uint32_t start, uint32_t delete_count) {
  160. for (uint32_t i = start; i < ar->length; ++i) {
  161. if (i + delete_count >= ar->length) {
  162. ar->buffer[i] = NULL;
  163. }
  164. else {
  165. ar->buffer[i] = ar->buffer[i + delete_count];
  166. }
  167. }
  168. ar->length -= delete_count;
  169. }
  170. void i32_array_splice(i32_array_t *ar, uint32_t start, uint32_t delete_count) {
  171. for (uint32_t i = start; i < ar->length; ++i) {
  172. if (i + delete_count >= ar->length) {
  173. ar->buffer[i] = 0;
  174. }
  175. else {
  176. ar->buffer[i] = ar->buffer[i + delete_count];
  177. }
  178. }
  179. ar->length -= delete_count;
  180. }
  181. any_array_t *array_concat(any_array_t *a, any_array_t *b) {
  182. any_array_t *ar = gc_alloc(sizeof(any_array_t));
  183. ar->length = a->length + b->length;
  184. any_array_resize(ar, ar->length);
  185. for (uint32_t i = 0; i < a->length; ++i) {
  186. ar->buffer[i] = a->buffer[i];
  187. }
  188. for (uint32_t i = 0; i < b->length; ++i) {
  189. ar->buffer[a->length + i] = b->buffer[i];
  190. }
  191. return ar;
  192. }
  193. any_array_t *array_slice(any_array_t *a, uint32_t begin, uint32_t end) {
  194. any_array_t *ar = gc_alloc(sizeof(any_array_t));
  195. ar->length = end - begin;
  196. any_array_resize(ar, ar->length);
  197. for (uint32_t i = 0; i < ar->length; ++i) {
  198. ar->buffer[i] = a->buffer[begin + i];
  199. }
  200. return ar;
  201. }
  202. void array_insert(any_array_t *a, uint32_t at, void *e) {
  203. array_alloc(a, sizeof(uintptr_t));
  204. for (uint32_t i = a->length; i > at; --i) {
  205. a->buffer[i] = a->buffer[i - 1];
  206. }
  207. a->length++;
  208. a->buffer[at] = e;
  209. }
  210. void array_remove(any_array_t *ar, void *e) {
  211. int32_t i = array_index_of(ar, e);
  212. if (i > -1) {
  213. array_splice(ar, i, 1);
  214. }
  215. }
  216. void char_ptr_array_remove(char_ptr_array_t *ar, char *e) {
  217. int32_t i = char_ptr_array_index_of(ar, e);
  218. if (i > -1) {
  219. array_splice(ar, i, 1);
  220. }
  221. }
  222. void i32_array_remove(i32_array_t *ar, int e) {
  223. int32_t i = i32_array_index_of(ar, e);
  224. if (i > -1) {
  225. i32_array_splice(ar, i, 1);
  226. }
  227. }
  228. int32_t array_index_of(any_array_t *ar, void *e) {
  229. for (uint32_t i = 0; i < ar->length; ++i) {
  230. if (ar->buffer[i] == e) {
  231. return i;
  232. }
  233. }
  234. return -1;
  235. }
  236. int32_t char_ptr_array_index_of(char_ptr_array_t *ar, char *e) {
  237. for (uint32_t i = 0; i < ar->length; ++i) {
  238. if (string_equals(ar->buffer[i], e)) {
  239. return i;
  240. }
  241. }
  242. return -1;
  243. }
  244. int32_t i32_array_index_of(i32_array_t *ar, int e) {
  245. for (uint32_t i = 0; i < ar->length; ++i) {
  246. if (ar->buffer[i] == e) {
  247. return i;
  248. }
  249. }
  250. return -1;
  251. }
  252. void array_reverse(any_array_t *ar) {
  253. for (uint32_t i = 0; i < ar->length / 2; ++i) {
  254. void *tmp = ar->buffer[i];
  255. ar->buffer[i] = ar->buffer[ar->length - 1 - i];
  256. ar->buffer[ar->length - 1 - i] = tmp;
  257. }
  258. }
  259. buffer_t *buffer_slice(buffer_t *a, uint32_t begin, uint32_t end) {
  260. buffer_t *b = gc_alloc(sizeof(buffer_t));
  261. buffer_resize(b, end - begin);
  262. for (uint32_t i = 0; i < b->length; ++i) {
  263. b->buffer[i] = a->buffer[begin + i];
  264. }
  265. return b;
  266. }
  267. uint8_t buffer_get_u8(buffer_t *b, uint32_t p) {
  268. return *(uint8_t *)(b->buffer + p);
  269. }
  270. int8_t buffer_get_i8(buffer_t *b, uint32_t p) {
  271. return *(int8_t *)(b->buffer + p);
  272. }
  273. uint16_t buffer_get_u16(buffer_t *b, uint32_t p) {
  274. return *(uint16_t *)(b->buffer + p);
  275. }
  276. int16_t buffer_get_i16(buffer_t *b, uint32_t p) {
  277. return *(int16_t *)(b->buffer + p);
  278. }
  279. uint32_t buffer_get_u32(buffer_t *b, uint32_t p) {
  280. return *(uint32_t *)(b->buffer + p);
  281. }
  282. int32_t buffer_get_i32(buffer_t *b, uint32_t p) {
  283. return *(int32_t *)(b->buffer + p);
  284. }
  285. float buffer_get_f32(buffer_t *b, uint32_t p) {
  286. return *(float *)(b->buffer + p);
  287. }
  288. double buffer_get_f64(buffer_t *b, uint32_t p) {
  289. return *(double *)(b->buffer + p);
  290. }
  291. int64_t buffer_get_i64(buffer_t *b, uint32_t p) {
  292. return *(int64_t *)(b->buffer + p);
  293. }
  294. void buffer_set_u8(buffer_t *b, uint32_t p, uint8_t n) {
  295. *(uint8_t *)(b->buffer + p) = n;
  296. }
  297. void buffer_set_i8(buffer_t *b, uint32_t p, int8_t n) {
  298. *(int8_t *)(b->buffer + p) = n;
  299. }
  300. void buffer_set_u16(buffer_t *b, uint32_t p, uint16_t n) {
  301. *(uint16_t *)(b->buffer + p) = n;
  302. }
  303. void buffer_set_i16(buffer_t *b, uint32_t p, uint16_t n) {
  304. *(int16_t *)(b->buffer + p) = n;
  305. }
  306. void buffer_set_u32(buffer_t *b, uint32_t p, uint32_t n) {
  307. *(uint32_t *)(b->buffer + p) = n;
  308. }
  309. void buffer_set_i32(buffer_t *b, uint32_t p, int32_t n) {
  310. *(int32_t *)(b->buffer + p) = n;
  311. }
  312. void buffer_set_f32(buffer_t *b, uint32_t p, float n) {
  313. *(float *)(b->buffer + p) = n;
  314. }
  315. buffer_t *buffer_create(uint32_t length) {
  316. buffer_t * b = gc_alloc(sizeof(buffer_t));
  317. buffer_resize(b, length);
  318. return b;
  319. }
  320. buffer_t *buffer_create_from_raw(char *raw, uint32_t length) {
  321. buffer_t * b = gc_alloc(sizeof(buffer_t));
  322. b->buffer = raw;
  323. b->length = length;
  324. b->capacity = length;
  325. return b;
  326. }
  327. f32_array_t *f32_array_create(uint32_t length) {
  328. f32_array_t *a = gc_alloc(sizeof(f32_array_t));
  329. if (length > 0) {
  330. f32_array_resize(a, length);
  331. a->length = length;
  332. }
  333. return a;
  334. }
  335. f32_array_t *f32_array_create_from_buffer(buffer_t *b) {
  336. f32_array_t *a = gc_alloc(sizeof(f32_array_t));
  337. a->buffer = b->buffer;
  338. a->length = b->length / 4;
  339. a->capacity = b->length / 4;
  340. return a;
  341. }
  342. f32_array_t *f32_array_create_from_array(f32_array_t *from) {
  343. f32_array_t *a = f32_array_create(from->length);
  344. for (uint32_t i = 0; i < from->length; ++i) {
  345. a->buffer[i] = from->buffer[i];
  346. }
  347. return a;
  348. }
  349. f32_array_t *f32_array_create_from_raw(float *raw, uint32_t length) {
  350. f32_array_t *a = f32_array_create(length);
  351. for (uint32_t i = 0; i < length; ++i) {
  352. a->buffer[i] = raw[i];
  353. }
  354. return a;
  355. }
  356. f32_array_t *f32_array_create_x(float x) {
  357. f32_array_t *a = f32_array_create(1);
  358. a->buffer[0] = x;
  359. return a;
  360. }
  361. f32_array_t *f32_array_create_xy(float x, float y) {
  362. f32_array_t *a = f32_array_create(2);
  363. a->buffer[0] = x;
  364. a->buffer[1] = y;
  365. return a;
  366. }
  367. f32_array_t *f32_array_create_xyz(float x, float y, float z) {
  368. f32_array_t *a = f32_array_create(3);
  369. a->buffer[0] = x;
  370. a->buffer[1] = y;
  371. a->buffer[2] = z;
  372. return a;
  373. }
  374. f32_array_t *f32_array_create_xyzw(float x, float y, float z, float w) {
  375. f32_array_t *a = f32_array_create(4);
  376. a->buffer[0] = x;
  377. a->buffer[1] = y;
  378. a->buffer[2] = z;
  379. a->buffer[3] = w;
  380. return a;
  381. }
  382. f32_array_t *f32_array_create_xyzwv(float x, float y, float z, float w, float v) {
  383. f32_array_t *a = f32_array_create(5);
  384. a->buffer[0] = x;
  385. a->buffer[1] = y;
  386. a->buffer[2] = z;
  387. a->buffer[3] = w;
  388. a->buffer[4] = v;
  389. return a;
  390. }
  391. u32_array_t *u32_array_create(uint32_t length) {
  392. u32_array_t *a = gc_alloc(sizeof(u32_array_t));
  393. if (length > 0) {
  394. u32_array_resize(a, length);
  395. a->length = length;
  396. }
  397. return a;
  398. }
  399. u32_array_t *u32_array_create_from_array(u32_array_t *from) {
  400. u32_array_t *a = u32_array_create(from->length);
  401. for (uint32_t i = 0; i < from->length; ++i) {
  402. a->buffer[i] = from->buffer[i];
  403. }
  404. return a;
  405. }
  406. u32_array_t *u32_array_create_from_raw(uint32_t *raw, uint32_t length) {
  407. u32_array_t *a = u32_array_create(length);
  408. for (uint32_t i = 0; i < length; ++i) {
  409. a->buffer[i] = raw[i];
  410. }
  411. return a;
  412. }
  413. i32_array_t *i32_array_create(uint32_t length) {
  414. i32_array_t *a = gc_alloc(sizeof(i32_array_t));
  415. if (length > 0) {
  416. i32_array_resize(a, length);
  417. a->length = length;
  418. }
  419. return a;
  420. }
  421. i32_array_t *i32_array_create_from_array(i32_array_t *from) {
  422. i32_array_t *a = i32_array_create(from->length);
  423. for (uint32_t i = 0; i < from->length; ++i) {
  424. a->buffer[i] = from->buffer[i];
  425. }
  426. return a;
  427. }
  428. i32_array_t *i32_array_create_from_raw(int32_t *raw, uint32_t length) {
  429. i32_array_t *a = i32_array_create(length);
  430. for (uint32_t i = 0; i < length; ++i) {
  431. a->buffer[i] = raw[i];
  432. }
  433. return a;
  434. }
  435. u16_array_t *u16_array_create(uint32_t length) {
  436. u16_array_t *a = gc_alloc(sizeof(u16_array_t));
  437. if (length > 0) {
  438. u16_array_resize(a, length);
  439. a->length = length;
  440. }
  441. return a;
  442. }
  443. u16_array_t *u16_array_create_from_raw(uint16_t *raw, uint32_t length) {
  444. u16_array_t *a = u16_array_create(length);
  445. for (uint32_t i = 0; i < length; ++i) {
  446. a->buffer[i] = raw[i];
  447. }
  448. return a;
  449. }
  450. i16_array_t *i16_array_create(uint32_t length) {
  451. i16_array_t *a = gc_alloc(sizeof(i16_array_t));
  452. if (length > 0) {
  453. i16_array_resize(a, length);
  454. a->length = length;
  455. }
  456. return a;
  457. }
  458. i16_array_t *i16_array_create_from_array(i16_array_t *from) {
  459. i16_array_t *a = i16_array_create(from->length);
  460. for (uint32_t i = 0; i < from->length; ++i) {
  461. a->buffer[i] = from->buffer[i];
  462. }
  463. return a;
  464. }
  465. i16_array_t *i16_array_create_from_raw(int16_t *raw, uint32_t length) {
  466. i16_array_t *a = i16_array_create(length);
  467. for (uint32_t i = 0; i < length; ++i) {
  468. a->buffer[i] = raw[i];
  469. }
  470. return a;
  471. }
  472. u8_array_t *u8_array_create(uint32_t length) {
  473. u8_array_t *a = gc_alloc(sizeof(u8_array_t));
  474. if (length > 0) {
  475. u8_array_resize(a, length);
  476. a->length = length;
  477. }
  478. return a;
  479. }
  480. u8_array_t *u8_array_create_from_array(u8_array_t *from) {
  481. u8_array_t *a = u8_array_create(from->length);
  482. for (uint32_t i = 0; i < from->length; ++i) {
  483. a->buffer[i] = from->buffer[i];
  484. }
  485. return a;
  486. }
  487. u8_array_t *u8_array_create_from_raw(uint8_t *raw, uint32_t length) {
  488. u8_array_t *a = u8_array_create(length);
  489. for (uint32_t i = 0; i < length; ++i) {
  490. a->buffer[i] = raw[i];
  491. }
  492. return a;
  493. }
  494. u8_array_t *u8_array_create_from_string(char *s) {
  495. u8_array_t *a = u8_array_create(strlen(s) + 1);
  496. for (uint32_t i = 0; i < strlen(s); ++i) {
  497. a->buffer[i] = s[i];
  498. }
  499. return a;
  500. }
  501. char *u8_array_to_string(u8_array_t *a) {
  502. char *r = gc_alloc(a->length + 1);
  503. memcpy(r, a->buffer, a->length);
  504. return r;
  505. }
  506. i8_array_t *i8_array_create(uint32_t length) {
  507. i8_array_t *a = gc_alloc(sizeof(i8_array_t));
  508. if (length > 0) {
  509. i8_array_resize(a, length);
  510. a->length = length;
  511. }
  512. return a;
  513. }
  514. i8_array_t *i8_array_create_from_raw(int8_t *raw, uint32_t length) {
  515. i8_array_t *a = i8_array_create(length);
  516. for (uint32_t i = 0; i < length; ++i) {
  517. a->buffer[i] = raw[i];
  518. }
  519. return a;
  520. }
  521. any_array_t *any_array_create(uint32_t length) {
  522. any_array_t *a = gc_alloc(sizeof(any_array_t));
  523. if (length > 0) {
  524. any_array_resize(a, length);
  525. a->length = length;
  526. }
  527. return a;
  528. }
  529. any_array_t *any_array_create_from_raw(void **raw, uint32_t length) {
  530. any_array_t *a = any_array_create(length);
  531. for (uint32_t i = 0; i < length; ++i) {
  532. a->buffer[i] = raw[i];
  533. }
  534. return a;
  535. }
  536. char_ptr_array_t *char_ptr_array_create(uint32_t length) {
  537. char_ptr_array_t *a = gc_alloc(sizeof(char_ptr_array_t));
  538. if (length > 0) {
  539. char_ptr_array_resize(a, length);
  540. a->length = length;
  541. }
  542. return a;
  543. }