11use crate :: { Error , ErrorKind , ErrorType , SliceWriteError , Write , WriteReady } ;
2- use core:: mem;
2+ use core:: mem:: { self , MaybeUninit } ;
33
44impl Error for SliceWriteError {
55 fn kind ( & self ) -> ErrorKind {
@@ -9,10 +9,6 @@ impl Error for SliceWriteError {
99 }
1010}
1111
12- impl ErrorType for & mut [ u8 ] {
13- type Error = SliceWriteError ;
14- }
15-
1612impl core:: fmt:: Display for SliceWriteError {
1713 fn fmt ( & self , f : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
1814 write ! ( f, "{self:?}" )
@@ -21,6 +17,10 @@ impl core::fmt::Display for SliceWriteError {
2117
2218impl core:: error:: Error for SliceWriteError { }
2319
20+ impl ErrorType for & mut [ u8 ] {
21+ type Error = SliceWriteError ;
22+ }
23+
2424/// Write is implemented for `&mut [u8]` by copying into the slice, overwriting
2525/// its data.
2626///
@@ -54,3 +54,43 @@ impl WriteReady for &mut [u8] {
5454 Ok ( true )
5555 }
5656}
57+
58+ impl ErrorType for & mut [ MaybeUninit < u8 > ] {
59+ type Error = SliceWriteError ;
60+ }
61+
62+ /// Write is implemented for `&mut [MaybeUninit<u8>]` by copying into the slice, overwriting
63+ /// its data.
64+ ///
65+ /// Note that writing updates the slice to point to the yet unwritten part.
66+ /// The slice will be empty when it has been completely overwritten.
67+ ///
68+ /// If the number of bytes to be written exceeds the size of the slice, write operations will
69+ /// return short writes: ultimately, a `SliceWriteError::Full`.
70+ impl Write for & mut [ MaybeUninit < u8 > ] {
71+ #[ inline]
72+ fn write ( & mut self , buf : & [ u8 ] ) -> Result < usize , Self :: Error > {
73+ let amt = core:: cmp:: min ( buf. len ( ) , self . len ( ) ) ;
74+ if !buf. is_empty ( ) && amt == 0 {
75+ return Err ( SliceWriteError :: Full ) ;
76+ }
77+ let ( a, b) = mem:: take ( self ) . split_at_mut ( amt) ;
78+ buf. split_at ( amt) . 0 . iter ( ) . enumerate ( ) . for_each ( |( index, byte) | {
79+ a[ index] . write ( * byte) ;
80+ } ) ;
81+ * self = b;
82+ Ok ( amt)
83+ }
84+
85+ #[ inline]
86+ fn flush ( & mut self ) -> Result < ( ) , Self :: Error > {
87+ Ok ( ( ) )
88+ }
89+ }
90+
91+ impl WriteReady for & mut [ MaybeUninit < u8 > ] {
92+ #[ inline]
93+ fn write_ready ( & mut self ) -> Result < bool , Self :: Error > {
94+ Ok ( true )
95+ }
96+ }
0 commit comments