From c17a2e0cc3358a51b0b44dafee17583baaf39034 Mon Sep 17 00:00:00 2001 From: Timon Kruiper Date: Mon, 6 Jan 2020 21:38:11 +0100 Subject: [PATCH] Add std.mem.zeroes to the standard library This zero initializes the type passed in. Can be used to zero initialize c structs. --- lib/std/mem.zig | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/std/mem.zig b/lib/std/mem.zig index 48f4a68a5e43..f7b2bf261d1d 100644 --- a/lib/std/mem.zig +++ b/lib/std/mem.zig @@ -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.