1use crate::io::{self, IoSlice, Seek, SeekFrom, SizeHint, Write};
2use crate::{cmp, fmt, mem};
3
4#[doc(hidden)]
8#[unstable(feature = "core_io_internals", reason = "exposed only for libstd", issue = "none")]
9impl<T> SizeHint for &mut T {
10 #[inline]
11 fn lower_bound(&self) -> usize {
12 SizeHint::lower_bound(*self)
13 }
14
15 #[inline]
16 fn upper_bound(&self) -> Option<usize> {
17 SizeHint::upper_bound(*self)
18 }
19}
20
21#[stable(feature = "rust1", since = "1.0.0")]
22impl<W: Write + ?Sized> Write for &mut W {
23 #[inline]
24 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
25 (**self).write(buf)
26 }
27
28 #[inline]
29 fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
30 (**self).write_vectored(bufs)
31 }
32
33 #[inline]
34 fn is_write_vectored(&self) -> bool {
35 (**self).is_write_vectored()
36 }
37
38 #[inline]
39 fn flush(&mut self) -> io::Result<()> {
40 (**self).flush()
41 }
42
43 #[inline]
44 fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
45 (**self).write_all(buf)
46 }
47
48 #[inline]
49 fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> io::Result<()> {
50 (**self).write_all_vectored(bufs)
51 }
52
53 #[inline]
54 fn write_fmt(&mut self, fmt: fmt::Arguments<'_>) -> io::Result<()> {
55 (**self).write_fmt(fmt)
56 }
57}
58#[stable(feature = "rust1", since = "1.0.0")]
59impl<S: Seek + ?Sized> Seek for &mut S {
60 #[inline]
61 fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
62 (**self).seek(pos)
63 }
64
65 #[inline]
66 fn rewind(&mut self) -> io::Result<()> {
67 (**self).rewind()
68 }
69
70 #[inline]
71 fn stream_len(&mut self) -> io::Result<u64> {
72 (**self).stream_len()
73 }
74
75 #[inline]
76 fn stream_position(&mut self) -> io::Result<u64> {
77 (**self).stream_position()
78 }
79
80 #[inline]
81 fn seek_relative(&mut self, offset: i64) -> io::Result<()> {
82 (**self).seek_relative(offset)
83 }
84}
85
86#[doc(hidden)]
90#[unstable(feature = "core_io_internals", reason = "exposed only for libstd", issue = "none")]
91impl SizeHint for &[u8] {
92 #[inline]
93 fn lower_bound(&self) -> usize {
94 self.len()
95 }
96
97 #[inline]
98 fn upper_bound(&self) -> Option<usize> {
99 Some(self.len())
100 }
101}
102
103#[stable(feature = "rust1", since = "1.0.0")]
113impl Write for &mut [u8] {
114 #[inline]
115 fn write(&mut self, data: &[u8]) -> io::Result<usize> {
116 let amt = cmp::min(data.len(), self.len());
117 let (a, b) = mem::take(self).split_at_mut(amt);
118 a.copy_from_slice(&data[..amt]);
119 *self = b;
120 Ok(amt)
121 }
122
123 #[inline]
124 fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
125 let mut nwritten = 0;
126 for buf in bufs {
127 nwritten += self.write(buf)?;
128 if self.is_empty() {
129 break;
130 }
131 }
132
133 Ok(nwritten)
134 }
135
136 #[inline]
137 fn is_write_vectored(&self) -> bool {
138 true
139 }
140
141 #[inline]
142 fn write_all(&mut self, data: &[u8]) -> io::Result<()> {
143 if self.write(data)? < data.len() { Err(io::Error::WRITE_ALL_EOF) } else { Ok(()) }
144 }
145
146 #[inline]
147 fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> io::Result<()> {
148 for buf in bufs {
149 if self.write(buf)? < buf.len() {
150 return Err(io::Error::WRITE_ALL_EOF);
151 }
152 }
153 Ok(())
154 }
155
156 #[inline]
157 fn flush(&mut self) -> io::Result<()> {
158 Ok(())
159 }
160}
161
162#[unstable(feature = "read_buf", issue = "78485")]
163impl<'a> io::Write for core::io::BorrowedCursor<'a, u8> {
164 #[inline]
165 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
166 let amt = cmp::min(buf.len(), self.capacity());
167 self.append(&buf[..amt]);
168 Ok(amt)
169 }
170
171 #[inline]
172 fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
173 let mut nwritten = 0;
174 for buf in bufs {
175 let n = self.write(buf)?;
176 nwritten += n;
177 if n < buf.len() {
178 break;
179 }
180 }
181 Ok(nwritten)
182 }
183
184 #[inline]
185 fn is_write_vectored(&self) -> bool {
186 true
187 }
188
189 #[inline]
190 fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
191 if self.write(buf)? < buf.len() { Err(io::Error::WRITE_ALL_EOF) } else { Ok(()) }
192 }
193
194 #[inline]
195 fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> io::Result<()> {
196 for buf in bufs {
197 if self.write(buf)? < buf.len() {
198 return Err(io::Error::WRITE_ALL_EOF);
199 }
200 }
201 Ok(())
202 }
203
204 #[inline]
205 fn flush(&mut self) -> io::Result<()> {
206 Ok(())
207 }
208}