| ... | ... | @@ -851,6 +851,9 @@ pub inline fn writeStruct(w: *Writer, value: anytype, endian: std.builtin.Endian |
| 851 | 851 | } |
| 852 | 852 | } |
| 853 | 853 | |
| 854 | /// If, `endian` is not native, |
| 855 | /// * Asserts that the buffer storage capacity is at least enough to store `@sizeOf(Elem)` |
| 856 | /// * Asserts that the buffer is aligned enough for `@alignOf(Elem)`. |
| 854 | 857 | pub inline fn writeSliceEndian( |
| 855 | 858 | w: *Writer, |
| 856 | 859 | Elem: type, |
| ... | ... | @@ -860,7 +863,22 @@ pub inline fn writeSliceEndian( |
| 860 | 863 | if (native_endian == endian) { |
| 861 | 864 | return writeAll(w, @ptrCast(slice)); |
| 862 | 865 | } else { |
| 863 | | return w.writeArraySwap(w, Elem, slice); |
| 866 | return writeSliceSwap(w, Elem, slice); |
| 867 | } |
| 868 | } |
| 869 | |
| 870 | /// Asserts that the buffer storage capacity is at least enough to store `@sizeOf(Elem)` |
| 871 | /// |
| 872 | /// Asserts that the buffer is aligned enough for `@alignOf(Elem)`. |
| 873 | pub fn writeSliceSwap(w: *Writer, Elem: type, slice: []const Elem) Error!void { |
| 874 | var i: usize = 0; |
| 875 | while (i < slice.len) { |
| 876 | const dest_bytes = try w.writableSliceGreedy(@sizeOf(Elem)); |
| 877 | const dest: []Elem = @alignCast(@ptrCast(dest_bytes[0 .. dest_bytes.len - dest_bytes.len % @sizeOf(Elem)])); |
| 878 | const copy_len = @min(dest.len, slice.len - i); |
| 879 | @memcpy(dest[0..copy_len], slice[i..][0..copy_len]); |
| 880 | i += copy_len; |
| 881 | std.mem.byteSwapAllElements(Elem, dest); |
| 864 | 882 | } |
| 865 | 883 | } |
| 866 | 884 | |
| ... | ... | @@ -2630,3 +2648,11 @@ test writeStruct { |
| 2630 | 2648 | }, &buffer); |
| 2631 | 2649 | } |
| 2632 | 2650 | } |
| 2651 | |
| 2652 | test writeSliceEndian { |
| 2653 | var buffer: [4]u8 align(2) = undefined; |
| 2654 | var w: Writer = .fixed(&buffer); |
| 2655 | const array: [2]u16 = .{ 0x1234, 0x5678 }; |
| 2656 | try writeSliceEndian(&w, u16, &array, .big); |
| 2657 | try testing.expectEqualSlices(u8, &.{ 0x12, 0x34, 0x56, 0x78 }, &buffer); |
| 2658 | } |