authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2024-07-06 23:43:18-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-07-19 14:09:51-07:00
log647a0c9b8227aa8b80b9409d75e7bf25269507a1
tree8120b05b74f0f2fc5778fd825629452375b30b3f
parentebd9efa85052fc19d8296e8e0f4da079da9cab45

mem: handle Float and Bool cases in byteSwapAllFields


1 files changed, 20 insertions(+), 0 deletions(-)

lib/std/mem.zig+20
...@@ -2021,6 +2021,10 @@ pub fn byteSwapAllFields(comptime S: type, ptr: *S) void {...@@ -2021,6 +2021,10 @@ pub fn byteSwapAllFields(comptime S: type, ptr: *S) void {
2021 .Enum => {2021 .Enum => {
2022 @field(ptr, f.name) = @enumFromInt(@byteSwap(@intFromEnum(@field(ptr, f.name))));2022 @field(ptr, f.name) = @enumFromInt(@byteSwap(@intFromEnum(@field(ptr, f.name))));
2023 },2023 },
2024 .Bool => {},
2025 .Float => |float_info| {
2026 @field(ptr, f.name) = @bitCast(@byteSwap(@as(std.meta.Int(.unsigned, float_info.bits), @bitCast(@field(ptr, f.name)))));
2027 },
2024 else => {2028 else => {
2025 @field(ptr, f.name) = @byteSwap(@field(ptr, f.name));2029 @field(ptr, f.name) = @byteSwap(@field(ptr, f.name));
2026 },2030 },
...@@ -2034,6 +2038,10 @@ pub fn byteSwapAllFields(comptime S: type, ptr: *S) void {...@@ -2034,6 +2038,10 @@ pub fn byteSwapAllFields(comptime S: type, ptr: *S) void {
2034 .Enum => {2038 .Enum => {
2035 item.* = @enumFromInt(@byteSwap(@intFromEnum(item.*)));2039 item.* = @enumFromInt(@byteSwap(@intFromEnum(item.*)));
2036 },2040 },
2041 .Bool => {},
2042 .Float => |float_info| {
2043 item.* = @bitCast(@byteSwap(@as(std.meta.Int(.unsigned, float_info.bits), @bitCast(item.*))));
2044 },
2037 else => {2045 else => {
2038 item.* = @byteSwap(item.*);2046 item.* = @byteSwap(item.*);
2039 },2047 },
...@@ -2050,24 +2058,32 @@ test byteSwapAllFields {...@@ -2050,24 +2058,32 @@ test byteSwapAllFields {
2050 f1: u16,2058 f1: u16,
2051 f2: u32,2059 f2: u32,
2052 f3: [1]u8,2060 f3: [1]u8,
2061 f4: bool,
2062 f5: f32,
2053 };2063 };
2054 const K = extern struct {2064 const K = extern struct {
2055 f0: u8,2065 f0: u8,
2056 f1: T,2066 f1: T,
2057 f2: u16,2067 f2: u16,
2058 f3: [1]u8,2068 f3: [1]u8,
2069 f4: bool,
2070 f5: f32,
2059 };2071 };
2060 var s = T{2072 var s = T{
2061 .f0 = 0x12,2073 .f0 = 0x12,
2062 .f1 = 0x1234,2074 .f1 = 0x1234,
2063 .f2 = 0x12345678,2075 .f2 = 0x12345678,
2064 .f3 = .{0x12},2076 .f3 = .{0x12},
2077 .f4 = true,
2078 .f5 = @as(f32, @bitCast(@as(u32, 0x4640e400))),
2065 };2079 };
2066 var k = K{2080 var k = K{
2067 .f0 = 0x12,2081 .f0 = 0x12,
2068 .f1 = s,2082 .f1 = s,
2069 .f2 = 0x1234,2083 .f2 = 0x1234,
2070 .f3 = .{0x12},2084 .f3 = .{0x12},
2085 .f4 = false,
2086 .f5 = @as(f32, @bitCast(@as(u32, 0x45d42800))),
2071 };2087 };
2072 byteSwapAllFields(T, &s);2088 byteSwapAllFields(T, &s);
2073 byteSwapAllFields(K, &k);2089 byteSwapAllFields(K, &k);
...@@ -2076,12 +2092,16 @@ test byteSwapAllFields {...@@ -2076,12 +2092,16 @@ test byteSwapAllFields {
2076 .f1 = 0x3412,2092 .f1 = 0x3412,
2077 .f2 = 0x78563412,2093 .f2 = 0x78563412,
2078 .f3 = .{0x12},2094 .f3 = .{0x12},
2095 .f4 = true,
2096 .f5 = @as(f32, @bitCast(@as(u32, 0x00e44046))),
2079 }, s);2097 }, s);
2080 try std.testing.expectEqual(K{2098 try std.testing.expectEqual(K{
2081 .f0 = 0x12,2099 .f0 = 0x12,
2082 .f1 = s,2100 .f1 = s,
2083 .f2 = 0x3412,2101 .f2 = 0x3412,
2084 .f3 = .{0x12},2102 .f3 = .{0x12},
2103 .f4 = false,
2104 .f5 = @as(f32, @bitCast(@as(u32, 0x0028d445))),
2085 }, k);2105 }, k);
2086}2106}
20872107