Commit 0deab8fd3b

Timon Kruiper <timonkruiper@gmail.com>
2020-01-06 21:38:11
Add std.mem.zeroes to the standard library
This zero initializes the type passed in. Can be used to zero initialize c structs.
1 parent baaef7e
Changed files (1)
lib
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.