small_array.odin 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package container
  2. Small_Array :: struct($N: int, $T: typeid) where N >= 0 {
  3. data: [N]T,
  4. len: int,
  5. }
  6. small_array_len :: proc(a: $A/Small_Array) -> int {
  7. return a.len
  8. }
  9. small_array_cap :: proc(a: $A/Small_Array) -> int {
  10. return len(a.data)
  11. }
  12. small_array_space :: proc(a: $A/Small_Array) -> int {
  13. return len(a.data) - a.len
  14. }
  15. small_array_slice :: proc(a: ^$A/Small_Array($N, $T)) -> []T {
  16. return a.data[:a.len]
  17. }
  18. small_array_get :: proc(a: $A/Small_Array($N, $T), index: int, loc := #caller_location) -> T {
  19. return a.data[index]
  20. }
  21. small_array_get_ptr :: proc(a: $A/Small_Array($N, $T), index: int, loc := #caller_location) -> ^T {
  22. return &a.data[index]
  23. }
  24. small_array_set :: proc(a: ^$A/Small_Array($N, $T), index: int, item: T, loc := #caller_location) {
  25. a.data[index] = item
  26. }
  27. small_array_resize :: proc(a: ^$A/Small_Array, length: int) {
  28. a.len = min(length, len(a.data))
  29. }
  30. small_array_push_back :: proc(a: ^$A/Small_Array($N, $T), item: T) -> bool {
  31. if a.len < len(a.data) {
  32. a.len += 1
  33. a.data[a.len-1] = item
  34. return true
  35. }
  36. return false
  37. }
  38. small_array_push_front :: proc(a: ^$A/Small_Array($N, $T), item: T) -> bool {
  39. if a.len < len(a.data) {
  40. a.len += 1
  41. data := small_array_slice(a)
  42. copy(data[1:], data[:])
  43. data[0] = item
  44. return true
  45. }
  46. return false
  47. }
  48. small_array_pop_back :: proc(a: ^$A/Small_Array($N, $T), loc := #caller_location) -> T {
  49. assert(condition=a.len > 0, loc=loc)
  50. item := a.data[a.len-1]
  51. a.len -= 1
  52. return item
  53. }
  54. small_array_pop_front :: proc(a: ^$A/Small_Array($N, $T), loc := #caller_location) -> T {
  55. assert(condition=a.len > 0, loc=loc)
  56. item := a.data[0]
  57. s := small_array_slice(a)
  58. copy(s[:], s[1:])
  59. a.len -= 1
  60. return item
  61. }
  62. small_array_consume :: proc(a: ^$A/Small_Array($N, $T), count: int, loc := #caller_location) {
  63. assert(condition=a.len >= count, loc=loc)
  64. a.len -= count
  65. }
  66. small_array_clear :: proc(a: ^$A/Small_Array($N, $T)) {
  67. small_array_resize(a, 0)
  68. }
  69. small_array_push_back_elems :: proc(a: ^$A/Small_Array($N, $T), items: ..T) {
  70. n := copy(a.data[a.len:], items[:])
  71. a.len += n
  72. }
  73. small_array_push :: proc{small_array_push_back, small_array_push_back_elems}
  74. small_array_append :: proc{small_array_push_back, small_array_push_back_elems}