aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-04-19 21:45:04 +0100
committergingerBill <bill@gingerbill.org>2020-04-19 21:45:04 +0100
commit97f7a558faaf206bb7d10eaf3adce99322fd9541 (patch)
tree2a3e8f91525692f14de4064751efae62699f10bb /core
parent2c91c21021e1c4d1d675ee430e0d7ccf88e882be (diff)
`#optional_ok` tag for procedures
Diffstat (limited to 'core')
-rw-r--r--core/container/array.odin10
-rw-r--r--core/mem/mem.odin15
2 files changed, 20 insertions, 5 deletions
diff --git a/core/container/array.odin b/core/container/array.odin
index 273657eb6..123440b2e 100644
--- a/core/container/array.odin
+++ b/core/container/array.odin
@@ -47,10 +47,16 @@ array_slice :: proc(a: $A/Array($T)) -> []T {
array_get :: proc(a: $A/Array($T), index: int) -> T {
+ assert(uint(index) < a.len);
return (^T)(uintptr(a.data) + size_of(T)*uintptr(index))^;
}
+array_get_ptr :: proc(a: $A/Array($T), index: int) -> ^T {
+ assert(uint(index) < a.len);
+ return (^T)(uintptr(a.data) + size_of(T)*uintptr(index));
+}
array_set :: proc(a: ^$A/Array($T), index: int, item: T) {
+ assert(uint(index) < a.len);
(^T)(uintptr(a.data) + size_of(T)*uintptr(index))^ = item;
}
@@ -122,7 +128,7 @@ array_clear :: proc(q: ^$Q/Queue($T)) {
}
-array_push :: proc(a: ^$A/Array($T), items: ..T) {
+array_push_back_elems :: proc(a: ^$A/Array($T), items: ..T) {
if array_space(a^) < len(items) {
array_grow(a, a.size + len(items));
}
@@ -133,6 +139,8 @@ array_push :: proc(a: ^$A/Array($T), items: ..T) {
a.len = offset + n;
}
+array_push :: proc{array_push_back, array_push_back_elems};
+array_append :: proc{array_push_back, array_push_back_elems};
array_set_capacity :: proc(a: ^$A/Array($T), new_capacity: int) {
if new_capacity == a.cap {
diff --git a/core/mem/mem.odin b/core/mem/mem.odin
index 99a16a6c9..bafac60d5 100644
--- a/core/mem/mem.odin
+++ b/core/mem/mem.odin
@@ -107,8 +107,12 @@ ptr_sub :: inline proc "contextless" (a, b: $P/^$T) -> int {
slice_ptr :: inline proc "contextless" (ptr: ^$T, len: int) -> []T {
assert(len >= 0);
- slice := Raw_Slice{data = ptr, len = len};
- return transmute([]T)slice;
+ return transmute([]T)Raw_Slice{data = ptr, len = len};
+}
+
+slice_ptr_to_bytes :: proc "contextless" (ptr: rawptr, len: int) -> []byte {
+ assert(len >= 0);
+ return transmute([]byte)Raw_Slice{data = ptr, len = len};
}
slice_to_bytes :: inline proc "contextless" (slice: $E/[]$T) -> []byte {
@@ -127,16 +131,19 @@ slice_data_cast :: inline proc "contextless" ($T: typeid/[]$A, slice: $S/[]$B) -
}
}
+slice_to_components :: proc "contextless" (slice: $E/[]$T) -> (data: ^T, len: int) {
+ s := transmute(Raw_Slice)slice;
+ return s.data, s.len;
+}
buffer_from_slice :: inline proc(backing: $T/[]$E) -> [dynamic]E {
s := transmute(Raw_Slice)backing;
- d := Raw_Dynamic_Array{
+ return transmute([dynamic]E)Raw_Dynamic_Array{
data = s.data,
len = 0,
cap = s.len,
allocator = nil_allocator(),
};
- return transmute([dynamic]E)d;
}
ptr_to_bytes :: inline proc "contextless" (ptr: ^$T, len := 1) -> []byte {