Add mem.check_zero and mem.check_zero_ptr

This commit is contained in:
gingerBill
2020-06-29 16:17:40 +01:00
parent 86448ee044
commit 8478b887a5

View File

@@ -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..<start_aligned {
if (^byte)(b)^ != 0 {
return false;
}
}
for b := start_aligned; b < end_aligned; b += size_of(uintptr) {
if (^uintptr)(b)^ != 0 {
return false;
}
}
for b in end_aligned..<end {
if (^byte)(b)^ != 0 {
return false;
}
}
return true;
}
simple_equal :: proc(a, b: $T) -> bool where intrinsics.type_is_simple_compare(T) {
a, b := a, b;
return compare_byte_ptrs((^byte)(&a), (^byte)(&b), size_of(T)) == 0;