@@ -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
+ }
0 commit comments