1
1
use crate :: { Error , ErrorKind , ErrorType , SliceWriteError , Write , WriteReady } ;
2
- use core:: mem;
2
+ use core:: mem:: { self , MaybeUninit } ;
3
3
4
4
impl Error for SliceWriteError {
5
5
fn kind ( & self ) -> ErrorKind {
@@ -9,10 +9,6 @@ impl Error for SliceWriteError {
9
9
}
10
10
}
11
11
12
- impl ErrorType for & mut [ u8 ] {
13
- type Error = SliceWriteError ;
14
- }
15
-
16
12
impl core:: fmt:: Display for SliceWriteError {
17
13
fn fmt ( & self , f : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
18
14
write ! ( f, "{self:?}" )
@@ -21,6 +17,10 @@ impl core::fmt::Display for SliceWriteError {
21
17
22
18
impl core:: error:: Error for SliceWriteError { }
23
19
20
+ impl ErrorType for & mut [ u8 ] {
21
+ type Error = SliceWriteError ;
22
+ }
23
+
24
24
/// Write is implemented for `&mut [u8]` by copying into the slice, overwriting
25
25
/// its data.
26
26
///
@@ -54,3 +54,43 @@ impl WriteReady for &mut [u8] {
54
54
Ok ( true )
55
55
}
56
56
}
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