| ... | @@ -851,6 +851,9 @@ pub inline fn writeStruct(w: *Writer, value: anytype, endian: std.builtin.Endian | ... | @@ -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 | pub inline fn writeSliceEndian( | 857 | pub inline fn writeSliceEndian( |
| 855 | w: *Writer, | 858 | w: *Writer, |
| 856 | Elem: type, | 859 | Elem: type, |
| ... | @@ -860,7 +863,22 @@ pub inline fn writeSliceEndian( | ... | @@ -860,7 +863,22 @@ pub inline fn writeSliceEndian( |
| 860 | if (native_endian == endian) { | 863 | if (native_endian == endian) { |
| 861 | return writeAll(w, @ptrCast(slice)); | 864 | return writeAll(w, @ptrCast(slice)); |
| 862 | } else { | 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,3 +2648,11 @@ test writeStruct { |
| 2630 | }, &buffer); | 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 | } |