Add std.mem.zeroes to the standard library
This zero initializes the type passed in. Can be used to zero initialize c structs.
This commit is contained in:
parent
baaef7ed97
commit
0deab8fd3b
@ -273,6 +273,33 @@ pub fn set(comptime T: type, dest: []T, value: T) void {
|
||||
d.* = value;
|
||||
}
|
||||
|
||||
/// Zero initializes the type.
|
||||
/// This can be used to zero initialize a C-struct.
|
||||
pub fn zeroes(comptime T: type) T {
|
||||
if (@sizeOf(T) == 0) return T{};
|
||||
|
||||
if (comptime meta.containerLayout(T) != .Extern) {
|
||||
@compileError("TODO: Currently this only works for extern types");
|
||||
}
|
||||
|
||||
var item: T = undefined;
|
||||
@memset(@ptrCast([*]u8, &item), 0, @sizeOf(T));
|
||||
return item;
|
||||
}
|
||||
|
||||
test "mem.zeroes" {
|
||||
const C_struct = extern struct {
|
||||
x: u32,
|
||||
y: u32,
|
||||
};
|
||||
|
||||
var a = zeroes(C_struct);
|
||||
a.y += 10;
|
||||
|
||||
testing.expect(a.x == 0);
|
||||
testing.expect(a.y == 10);
|
||||
}
|
||||
|
||||
pub fn secureZero(comptime T: type, s: []T) void {
|
||||
// NOTE: We do not use a volatile slice cast here since LLVM cannot
|
||||
// see that it can be replaced by a memset.
|
||||
|
Loading…
x
Reference in New Issue
Block a user