diff options
| author | Lucas Perlind <perlindluca@gmail.com> | 2022-12-17 14:23:05 +1100 |
|---|---|---|
| committer | Lucas Perlind <perlindluca@gmail.com> | 2022-12-21 13:00:33 +1100 |
| commit | f029b4beb1f8a037334ff68bd459049b1e44ef31 (patch) | |
| tree | c59fb5441a5b768b0110db2b562b6516d01fd10f /core/container | |
| parent | 0829ac30f743aa567b2da5dc490ff1b2b13ea37c (diff) | |
Add more utility procedures to small array
Diffstat (limited to 'core/container')
| -rw-r--r-- | core/container/small_array/small_array.odin | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/core/container/small_array/small_array.odin b/core/container/small_array/small_array.odin index b8210d1b0..b471d1706 100644 --- a/core/container/small_array/small_array.odin +++ b/core/container/small_array/small_array.odin @@ -1,6 +1,8 @@ package container_small_array import "core:builtin" +import "core:runtime" +_ :: runtime Small_Array :: struct($N: int, $T: typeid) where N >= 0 { data: [N]T, @@ -32,6 +34,20 @@ get_ptr :: proc "contextless" (a: ^$A/Small_Array($N, $T), index: int) -> ^T { return &a.data[index] } +get_safe :: proc(a: $A/Small_Array($N, $T), index: int) -> (T, bool) #no_bounds_check { + if index < 0 || index >= a.len { + return {}, false + } + return a.data[index], true +} + +get_ptr_safe :: proc(a: ^$A/Small_Array($N, $T), index: int) -> (^T, bool) #no_bounds_check { + if index < 0 || index >= a.len { + return {}, false + } + return &a.data[index], true +} + set :: proc "contextless" (a: ^$A/Small_Array($N, $T), index: int, item: T) { a.data[index] = item } @@ -93,7 +109,7 @@ pop_front_safe :: proc "contextless" (a: ^$A/Small_Array($N, $T)) -> (item: T, o copy(s[:], s[1:]) a.len -= 1 ok = true - } + } return } @@ -102,6 +118,23 @@ consume :: proc "odin" (a: ^$A/Small_Array($N, $T), count: int, loc := #caller_l a.len -= count } +ordered_remove :: proc "contextless" (a: ^$A/Small_Array($N, $T), index: int, loc := #caller_location) #no_bounds_check { + runtime.bounds_check_error_loc(loc, index, a.len) + if index+1 < a.len { + copy(a.data[index:], a.data[index+1:]) + } + a.len -= 1 +} + +unordered_remove :: proc "contextless" (a: ^$A/Small_Array($N, $T), index: int, loc := #caller_location) #no_bounds_check { + runtime.bounds_check_error_loc(loc, index, a.len) + n := a.len-1 + if index != n { + a.data[index] = a.data[n] + } + a.len -= 1 +} + clear :: proc "contextless" (a: ^$A/Small_Array($N, $T)) { resize(a, 0) } @@ -111,6 +144,18 @@ push_back_elems :: proc "contextless" (a: ^$A/Small_Array($N, $T), items: ..T) { a.len += n } +inject_at :: proc "contextless" (a: ^$A/Small_Array($N, $T), item: T, index: int) -> bool #no_bounds_check { + if a.len < cap(a^) && index >= 0 && index <= len(a^) { + a.len += 1 + for i := a.len - 1; i >= index + 1; i -= 1 { + a.data[i] = a.data[i - 1] + } + a.data[index] = item + return true + } + return false +} + append_elem :: push_back append_elems :: push_back_elems push :: proc{push_back, push_back_elems} |