diff --git a/core/mem/mem.odin b/core/mem/mem.odin index fc15d2c47..0c27cfdee 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -78,6 +78,44 @@ compare_byte_ptrs :: proc(a, b: ^byte, n: int) -> int #no_bounds_check { return 0; } +check_zero :: proc(data: []byte) -> bool { + return check_zero_ptr(raw_data(data), len(data)); +} + +check_zero_ptr :: proc(ptr: rawptr, len: int) -> bool { + switch { + case len <= 0: + return true; + case ptr == nil: + return true; + } + + start := uintptr(ptr); + start_aligned := align_forward_uintptr(start, align_of(uintptr)); + end := start + uintptr(len); + end_aligned := align_backward_uintptr(end, align_of(uintptr)); + + for b in start.. bool where intrinsics.type_is_simple_compare(T) { a, b := a, b; return compare_byte_ptrs((^byte)(&a), (^byte)(&b), size_of(T)) == 0;