authorgravatar for protoss2017@mail.ruCortex <protoss2017@mail.ru> 2023-05-17 02:10:44+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-05-16 19:10:44-04:00
logc269e16c3b10afe24856f3ed788479afa34587ed
tree54b4813304f6567d19e2ab3197ead9e81e93d1d5
parent958fba0eb715fe9f0b5eddcf53507db03e37ae09
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

std.mem.byteSwapAllFields: add suppport for nested structs (#15696)


1 files changed, 21 insertions(+), 1 deletions(-)

lib/std/mem.zig+21-1
......@@ -1887,7 +1887,11 @@ test "writeIntBig and writeIntLittle" {
18871887pub fn byteSwapAllFields(comptime S: type, ptr: *S) void {
18881888 if (@typeInfo(S) != .Struct) @compileError("byteSwapAllFields expects a struct as the first argument");
18891889 inline for (std.meta.fields(S)) |f| {
1890 @field(ptr, f.name) = @byteSwap(@field(ptr, f.name));
1890 if (@typeInfo(f.type) == .Struct) {
1891 byteSwapAllFields(f.type, &@field(ptr, f.name));
1892 } else {
1893 @field(ptr, f.name) = @byteSwap(@field(ptr, f.name));
1894 }
18911895 }
18921896}
18931897
......@@ -1897,17 +1901,33 @@ test "byteSwapAllFields" {
18971901 f1: u16,
18981902 f2: u32,
18991903 };
1904 const K = extern struct {
1905 f0: u8,
1906 f1: T,
1907 f2: u16,
1908 };
19001909 var s = T{
19011910 .f0 = 0x12,
19021911 .f1 = 0x1234,
19031912 .f2 = 0x12345678,
19041913 };
1914 var k = K{
1915 .f0 = 0x12,
1916 .f1 = s,
1917 .f2 = 0x1234,
1918 };
19051919 byteSwapAllFields(T, &s);
1920 byteSwapAllFields(K, &k);
19061921 try std.testing.expectEqual(T{
19071922 .f0 = 0x12,
19081923 .f1 = 0x3412,
19091924 .f2 = 0x78563412,
19101925 }, s);
1926 try std.testing.expectEqual(K{
1927 .f0 = 0x12,
1928 .f1 = s,
1929 .f2 = 0x3412,
1930 }, k);
19111931}
19121932
19131933/// Returns an iterator that iterates over the slices of `buffer` that are not