std/io/
mod.rs

1//! Traits, helpers, and type definitions for core I/O functionality.
2//!
3//! The `std::io` module contains a number of common things you'll need
4//! when doing input and output. The most core part of this module is
5//! the [`Read`] and [`Write`] traits, which provide the
6//! most general interface for reading and writing input and output.
7//!
8//! ## Read and Write
9//!
10//! Because they are traits, [`Read`] and [`Write`] are implemented by a number
11//! of other types, and you can implement them for your types too. As such,
12//! you'll see a few different types of I/O throughout the documentation in
13//! this module: [`File`]s, [`TcpStream`]s, and sometimes even [`Vec<T>`]s. For
14//! example, [`Read`] adds a [`read`][`Read::read`] method, which we can use on
15//! [`File`]s:
16//!
17//! ```no_run
18//! use std::io;
19//! use std::io::prelude::*;
20//! use std::fs::File;
21//!
22//! fn main() -> io::Result<()> {
23//!     let mut f = File::open("foo.txt")?;
24//!     let mut buffer = [0; 10];
25//!
26//!     // read up to 10 bytes
27//!     let n = f.read(&mut buffer)?;
28//!
29//!     println!("The bytes: {:?}", &buffer[..n]);
30//!     Ok(())
31//! }
32//! ```
33//!
34//! [`Read`] and [`Write`] are so important, implementors of the two traits have a
35//! nickname: readers and writers. So you'll sometimes see 'a reader' instead
36//! of 'a type that implements the [`Read`] trait'. Much easier!
37//!
38//! ## Seek and BufRead
39//!
40//! Beyond that, there are two important traits that are provided: [`Seek`]
41//! and [`BufRead`]. Both of these build on top of a reader to control
42//! how the reading happens. [`Seek`] lets you control where the next byte is
43//! coming from:
44//!
45//! ```no_run
46//! use std::io;
47//! use std::io::prelude::*;
48//! use std::io::SeekFrom;
49//! use std::fs::File;
50//!
51//! fn main() -> io::Result<()> {
52//!     let mut f = File::open("foo.txt")?;
53//!     let mut buffer = [0; 10];
54//!
55//!     // skip to the last 10 bytes of the file
56//!     f.seek(SeekFrom::End(-10))?;
57//!
58//!     // read up to 10 bytes
59//!     let n = f.read(&mut buffer)?;
60//!
61//!     println!("The bytes: {:?}", &buffer[..n]);
62//!     Ok(())
63//! }
64//! ```
65//!
66//! [`BufRead`] uses an internal buffer to provide a number of other ways to read, but
67//! to show it off, we'll need to talk about buffers in general. Keep reading!
68//!
69//! ## BufReader and BufWriter
70//!
71//! Byte-based interfaces are unwieldy and can be inefficient, as we'd need to be
72//! making near-constant calls to the operating system. To help with this,
73//! `std::io` comes with two structs, [`BufReader`] and [`BufWriter`], which wrap
74//! readers and writers. The wrapper uses a buffer, reducing the number of
75//! calls and providing nicer methods for accessing exactly what you want.
76//!
77//! For example, [`BufReader`] works with the [`BufRead`] trait to add extra
78//! methods to any reader:
79//!
80//! ```no_run
81//! use std::io;
82//! use std::io::prelude::*;
83//! use std::io::BufReader;
84//! use std::fs::File;
85//!
86//! fn main() -> io::Result<()> {
87//!     let f = File::open("foo.txt")?;
88//!     let mut reader = BufReader::new(f);
89//!     let mut buffer = String::new();
90//!
91//!     // read a line into buffer
92//!     reader.read_line(&mut buffer)?;
93//!
94//!     println!("{buffer}");
95//!     Ok(())
96//! }
97//! ```
98//!
99//! [`BufWriter`] doesn't add any new ways of writing; it just buffers every call
100//! to [`write`][`Write::write`]:
101//!
102//! ```no_run
103//! use std::io;
104//! use std::io::prelude::*;
105//! use std::io::BufWriter;
106//! use std::fs::File;
107//!
108//! fn main() -> io::Result<()> {
109//!     let f = File::create("foo.txt")?;
110//!     {
111//!         let mut writer = BufWriter::new(f);
112//!
113//!         // write a byte to the buffer
114//!         writer.write(&[42])?;
115//!
116//!     } // the buffer is flushed once writer goes out of scope
117//!
118//!     Ok(())
119//! }
120//! ```
121//!
122//! ## Standard input and output
123//!
124//! A very common source of input is standard input:
125//!
126//! ```no_run
127//! use std::io;
128//!
129//! fn main() -> io::Result<()> {
130//!     let mut input = String::new();
131//!
132//!     io::stdin().read_line(&mut input)?;
133//!
134//!     println!("You typed: {}", input.trim());
135//!     Ok(())
136//! }
137//! ```
138//!
139//! Note that you cannot use the [`?` operator] in functions that do not return
140//! a [`Result<T, E>`][`Result`]. Instead, you can call [`.unwrap()`]
141//! or `match` on the return value to catch any possible errors:
142//!
143//! ```no_run
144//! use std::io;
145//!
146//! let mut input = String::new();
147//!
148//! io::stdin().read_line(&mut input).unwrap();
149//! ```
150//!
151//! And a very common source of output is standard output:
152//!
153//! ```no_run
154//! use std::io;
155//! use std::io::prelude::*;
156//!
157//! fn main() -> io::Result<()> {
158//!     io::stdout().write(&[42])?;
159//!     Ok(())
160//! }
161//! ```
162//!
163//! Of course, using [`io::stdout`] directly is less common than something like
164//! [`println!`].
165//!
166//! ## Iterator types
167//!
168//! A large number of the structures provided by `std::io` are for various
169//! ways of iterating over I/O. For example, [`Lines`] is used to split over
170//! lines:
171//!
172//! ```no_run
173//! use std::io;
174//! use std::io::prelude::*;
175//! use std::io::BufReader;
176//! use std::fs::File;
177//!
178//! fn main() -> io::Result<()> {
179//!     let f = File::open("foo.txt")?;
180//!     let reader = BufReader::new(f);
181//!
182//!     for line in reader.lines() {
183//!         println!("{}", line?);
184//!     }
185//!     Ok(())
186//! }
187//! ```
188//!
189//! ## Functions
190//!
191//! There are a number of [functions][functions-list] that offer access to various
192//! features. For example, we can use three of these functions to copy everything
193//! from standard input to standard output:
194//!
195//! ```no_run
196//! use std::io;
197//!
198//! fn main() -> io::Result<()> {
199//!     io::copy(&mut io::stdin(), &mut io::stdout())?;
200//!     Ok(())
201//! }
202//! ```
203//!
204//! [functions-list]: #functions-1
205//!
206//! ## io::Result
207//!
208//! Last, but certainly not least, is [`io::Result`]. This type is used
209//! as the return type of many `std::io` functions that can cause an error, and
210//! can be returned from your own functions as well. Many of the examples in this
211//! module use the [`?` operator]:
212//!
213//! ```
214//! use std::io;
215//!
216//! fn read_input() -> io::Result<()> {
217//!     let mut input = String::new();
218//!
219//!     io::stdin().read_line(&mut input)?;
220//!
221//!     println!("You typed: {}", input.trim());
222//!
223//!     Ok(())
224//! }
225//! ```
226//!
227//! The return type of `read_input()`, [`io::Result<()>`][`io::Result`], is a very
228//! common type for functions which don't have a 'real' return value, but do want to
229//! return errors if they happen. In this case, the only purpose of this function is
230//! to read the line and print it, so we use `()`.
231//!
232//! ## Platform-specific behavior
233//!
234//! Many I/O functions throughout the standard library are documented to indicate
235//! what various library or syscalls they are delegated to. This is done to help
236//! applications both understand what's happening under the hood as well as investigate
237//! any possibly unclear semantics. Note, however, that this is informative, not a binding
238//! contract. The implementation of many of these functions are subject to change over
239//! time and may call fewer or more syscalls/library functions.
240//!
241//! ## I/O Safety
242//!
243//! Rust follows an I/O safety discipline that is comparable to its memory safety discipline. This
244//! means that file descriptors can be *exclusively owned*. (Here, "file descriptor" is meant to
245//! subsume similar concepts that exist across a wide range of operating systems even if they might
246//! use a different name, such as "handle".) An exclusively owned file descriptor is one that no
247//! other code is allowed to access in any way, but the owner is allowed to access and even close
248//! it any time. A type that owns its file descriptor should usually close it in its `drop`
249//! function. Types like [`File`] own their file descriptor. Similarly, file descriptors
250//! can be *borrowed*, granting the temporary right to perform operations on this file descriptor.
251//! This indicates that the file descriptor will not be closed for the lifetime of the borrow, but
252//! it does *not* imply any right to close this file descriptor, since it will likely be owned by
253//! someone else.
254//!
255//! The platform-specific parts of the Rust standard library expose types that reflect these
256//! concepts, see [`os::unix`] and [`os::windows`].
257//!
258//! To uphold I/O safety, it is crucial that no code acts on file descriptors it does not own or
259//! borrow, and no code closes file descriptors it does not own. In other words, a safe function
260//! that takes a regular integer, treats it as a file descriptor, and acts on it, is *unsound*.
261//!
262//! Not upholding I/O safety and acting on a file descriptor without proof of ownership can lead to
263//! misbehavior and even Undefined Behavior in code that relies on ownership of its file
264//! descriptors: a closed file descriptor could be re-allocated, so the original owner of that file
265//! descriptor is now working on the wrong file. Some code might even rely on fully encapsulating
266//! its file descriptors with no operations being performed by any other part of the program.
267//!
268//! Note that exclusive ownership of a file descriptor does *not* imply exclusive ownership of the
269//! underlying kernel object that the file descriptor references (also called "open file description" on
270//! some operating systems). File descriptors basically work like [`Arc`]: when you receive an owned
271//! file descriptor, you cannot know whether there are any other file descriptors that reference the
272//! same kernel object. However, when you create a new kernel object, you know that you are holding
273//! the only reference to it. Just be careful not to lend it to anyone, since they can obtain a
274//! clone and then you can no longer know what the reference count is! In that sense, [`OwnedFd`] is
275//! like `Arc` and [`BorrowedFd<'a>`] is like `&'a Arc` (and similar for the Windows types). In
276//! particular, given a `BorrowedFd<'a>`, you are not allowed to close the file descriptor -- just
277//! like how, given a `&'a Arc`, you are not allowed to decrement the reference count and
278//! potentially free the underlying object. There is no equivalent to `Box` for file descriptors in
279//! the standard library (that would be a type that guarantees that the reference count is `1`),
280//! however, it would be possible for a crate to define a type with those semantics.
281//!
282//! [`File`]: crate::fs::File
283//! [`TcpStream`]: crate::net::TcpStream
284//! [`io::stdout`]: stdout
285//! [`io::Result`]: self::Result
286//! [`?` operator]: ../../book/appendix-02-operators.html
287//! [`Result`]: crate::result::Result
288//! [`.unwrap()`]: crate::result::Result::unwrap
289//! [`os::unix`]: ../os/unix/io/index.html
290//! [`os::windows`]: ../os/windows/io/index.html
291//! [`OwnedFd`]: ../os/fd/struct.OwnedFd.html
292//! [`BorrowedFd<'a>`]: ../os/fd/struct.BorrowedFd.html
293//! [`Arc`]: crate::sync::Arc
294
295#![stable(feature = "rust1", since = "1.0.0")]
296
297#[cfg(test)]
298mod tests;
299
300#[unstable(feature = "read_buf", issue = "78485")]
301pub use core::io::{BorrowedBuf, BorrowedCursor};
302use core::slice::memchr;
303
304#[stable(feature = "bufwriter_into_parts", since = "1.56.0")]
305pub use self::buffered::WriterPanicked;
306#[unstable(feature = "raw_os_error_ty", issue = "107792")]
307pub use self::error::RawOsError;
308#[doc(hidden)]
309#[unstable(feature = "io_const_error_internals", issue = "none")]
310pub use self::error::SimpleMessage;
311#[unstable(feature = "io_const_error", issue = "133448")]
312pub use self::error::const_error;
313#[stable(feature = "anonymous_pipe", since = "1.87.0")]
314pub use self::pipe::{PipeReader, PipeWriter, pipe};
315#[stable(feature = "is_terminal", since = "1.70.0")]
316pub use self::stdio::IsTerminal;
317pub(crate) use self::stdio::attempt_print_to_stderr;
318#[unstable(feature = "print_internals", issue = "none")]
319#[doc(hidden)]
320pub use self::stdio::{_eprint, _print};
321#[unstable(feature = "internal_output_capture", issue = "none")]
322#[doc(no_inline, hidden)]
323pub use self::stdio::{set_output_capture, try_set_output_capture};
324#[stable(feature = "rust1", since = "1.0.0")]
325pub use self::{
326    buffered::{BufReader, BufWriter, IntoInnerError, LineWriter},
327    copy::copy,
328    cursor::Cursor,
329    error::{Error, ErrorKind, Result},
330    stdio::{Stderr, StderrLock, Stdin, StdinLock, Stdout, StdoutLock, stderr, stdin, stdout},
331    util::{Empty, Repeat, Sink, empty, repeat, sink},
332};
333use crate::mem::take;
334use crate::ops::{Deref, DerefMut};
335use crate::{cmp, fmt, slice, str, sys};
336
337mod buffered;
338pub(crate) mod copy;
339mod cursor;
340mod error;
341mod impls;
342mod pipe;
343pub mod prelude;
344mod stdio;
345mod util;
346
347const DEFAULT_BUF_SIZE: usize = crate::sys::io::DEFAULT_BUF_SIZE;
348
349pub(crate) use stdio::cleanup;
350
351struct Guard<'a> {
352    buf: &'a mut Vec<u8>,
353    len: usize,
354}
355
356impl Drop for Guard<'_> {
357    fn drop(&mut self) {
358        unsafe {
359            self.buf.set_len(self.len);
360        }
361    }
362}
363
364// Several `read_to_string` and `read_line` methods in the standard library will
365// append data into a `String` buffer, but we need to be pretty careful when
366// doing this. The implementation will just call `.as_mut_vec()` and then
367// delegate to a byte-oriented reading method, but we must ensure that when
368// returning we never leave `buf` in a state such that it contains invalid UTF-8
369// in its bounds.
370//
371// To this end, we use an RAII guard (to protect against panics) which updates
372// the length of the string when it is dropped. This guard initially truncates
373// the string to the prior length and only after we've validated that the
374// new contents are valid UTF-8 do we allow it to set a longer length.
375//
376// The unsafety in this function is twofold:
377//
378// 1. We're looking at the raw bytes of `buf`, so we take on the burden of UTF-8
379//    checks.
380// 2. We're passing a raw buffer to the function `f`, and it is expected that
381//    the function only *appends* bytes to the buffer. We'll get undefined
382//    behavior if existing bytes are overwritten to have non-UTF-8 data.
383pub(crate) unsafe fn append_to_string<F>(buf: &mut String, f: F) -> Result<usize>
384where
385    F: FnOnce(&mut Vec<u8>) -> Result<usize>,
386{
387    let mut g = Guard { len: buf.len(), buf: unsafe { buf.as_mut_vec() } };
388    let ret = f(g.buf);
389
390    // SAFETY: the caller promises to only append data to `buf`
391    let appended = unsafe { g.buf.get_unchecked(g.len..) };
392    if str::from_utf8(appended).is_err() {
393        ret.and_then(|_| Err(Error::INVALID_UTF8))
394    } else {
395        g.len = g.buf.len();
396        ret
397    }
398}
399
400// Here we must serve many masters with conflicting goals:
401//
402// - avoid allocating unless necessary
403// - avoid overallocating if we know the exact size (#89165)
404// - avoid passing large buffers to readers that always initialize the free capacity if they perform short reads (#23815, #23820)
405// - pass large buffers to readers that do not initialize the spare capacity. this can amortize per-call overheads
406// - and finally pass not-too-small and not-too-large buffers to Windows read APIs because they manage to suffer from both problems
407//   at the same time, i.e. small reads suffer from syscall overhead, all reads incur costs proportional to buffer size (#110650)
408//
409pub(crate) fn default_read_to_end<R: Read + ?Sized>(
410    r: &mut R,
411    buf: &mut Vec<u8>,
412    size_hint: Option<usize>,
413) -> Result<usize> {
414    let start_len = buf.len();
415    let start_cap = buf.capacity();
416    // Optionally limit the maximum bytes read on each iteration.
417    // This adds an arbitrary fiddle factor to allow for more data than we expect.
418    let mut max_read_size = size_hint
419        .and_then(|s| s.checked_add(1024)?.checked_next_multiple_of(DEFAULT_BUF_SIZE))
420        .unwrap_or(DEFAULT_BUF_SIZE);
421
422    let mut initialized = 0; // Extra initialized bytes from previous loop iteration
423
424    const PROBE_SIZE: usize = 32;
425
426    fn small_probe_read<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize> {
427        let mut probe = [0u8; PROBE_SIZE];
428
429        loop {
430            match r.read(&mut probe) {
431                Ok(n) => {
432                    // there is no way to recover from allocation failure here
433                    // because the data has already been read.
434                    buf.extend_from_slice(&probe[..n]);
435                    return Ok(n);
436                }
437                Err(ref e) if e.is_interrupted() => continue,
438                Err(e) => return Err(e),
439            }
440        }
441    }
442
443    // avoid inflating empty/small vecs before we have determined that there's anything to read
444    if (size_hint.is_none() || size_hint == Some(0)) && buf.capacity() - buf.len() < PROBE_SIZE {
445        let read = small_probe_read(r, buf)?;
446
447        if read == 0 {
448            return Ok(0);
449        }
450    }
451
452    let mut consecutive_short_reads = 0;
453
454    loop {
455        if buf.len() == buf.capacity() && buf.capacity() == start_cap {
456            // The buffer might be an exact fit. Let's read into a probe buffer
457            // and see if it returns `Ok(0)`. If so, we've avoided an
458            // unnecessary doubling of the capacity. But if not, append the
459            // probe buffer to the primary buffer and let its capacity grow.
460            let read = small_probe_read(r, buf)?;
461
462            if read == 0 {
463                return Ok(buf.len() - start_len);
464            }
465        }
466
467        if buf.len() == buf.capacity() {
468            // buf is full, need more space
469            buf.try_reserve(PROBE_SIZE)?;
470        }
471
472        let mut spare = buf.spare_capacity_mut();
473        let buf_len = cmp::min(spare.len(), max_read_size);
474        spare = &mut spare[..buf_len];
475        let mut read_buf: BorrowedBuf<'_> = spare.into();
476
477        // SAFETY: These bytes were initialized but not filled in the previous loop
478        unsafe {
479            read_buf.set_init(initialized);
480        }
481
482        let mut cursor = read_buf.unfilled();
483        let result = loop {
484            match r.read_buf(cursor.reborrow()) {
485                Err(e) if e.is_interrupted() => continue,
486                // Do not stop now in case of error: we might have received both data
487                // and an error
488                res => break res,
489            }
490        };
491
492        let unfilled_but_initialized = cursor.init_mut().len();
493        let bytes_read = cursor.written();
494        let was_fully_initialized = read_buf.init_len() == buf_len;
495
496        // SAFETY: BorrowedBuf's invariants mean this much memory is initialized.
497        unsafe {
498            let new_len = bytes_read + buf.len();
499            buf.set_len(new_len);
500        }
501
502        // Now that all data is pushed to the vector, we can fail without data loss
503        result?;
504
505        if bytes_read == 0 {
506            return Ok(buf.len() - start_len);
507        }
508
509        if bytes_read < buf_len {
510            consecutive_short_reads += 1;
511        } else {
512            consecutive_short_reads = 0;
513        }
514
515        // store how much was initialized but not filled
516        initialized = unfilled_but_initialized;
517
518        // Use heuristics to determine the max read size if no initial size hint was provided
519        if size_hint.is_none() {
520            // The reader is returning short reads but it doesn't call ensure_init().
521            // In that case we no longer need to restrict read sizes to avoid
522            // initialization costs.
523            // When reading from disk we usually don't get any short reads except at EOF.
524            // So we wait for at least 2 short reads before uncapping the read buffer;
525            // this helps with the Windows issue.
526            if !was_fully_initialized && consecutive_short_reads > 1 {
527                max_read_size = usize::MAX;
528            }
529
530            // we have passed a larger buffer than previously and the
531            // reader still hasn't returned a short read
532            if buf_len >= max_read_size && bytes_read == buf_len {
533                max_read_size = max_read_size.saturating_mul(2);
534            }
535        }
536    }
537}
538
539pub(crate) fn default_read_to_string<R: Read + ?Sized>(
540    r: &mut R,
541    buf: &mut String,
542    size_hint: Option<usize>,
543) -> Result<usize> {
544    // Note that we do *not* call `r.read_to_end()` here. We are passing
545    // `&mut Vec<u8>` (the raw contents of `buf`) into the `read_to_end`
546    // method to fill it up. An arbitrary implementation could overwrite the
547    // entire contents of the vector, not just append to it (which is what
548    // we are expecting).
549    //
550    // To prevent extraneously checking the UTF-8-ness of the entire buffer
551    // we pass it to our hardcoded `default_read_to_end` implementation which
552    // we know is guaranteed to only read data into the end of the buffer.
553    unsafe { append_to_string(buf, |b| default_read_to_end(r, b, size_hint)) }
554}
555
556pub(crate) fn default_read_vectored<F>(read: F, bufs: &mut [IoSliceMut<'_>]) -> Result<usize>
557where
558    F: FnOnce(&mut [u8]) -> Result<usize>,
559{
560    let buf = bufs.iter_mut().find(|b| !b.is_empty()).map_or(&mut [][..], |b| &mut **b);
561    read(buf)
562}
563
564pub(crate) fn default_write_vectored<F>(write: F, bufs: &[IoSlice<'_>]) -> Result<usize>
565where
566    F: FnOnce(&[u8]) -> Result<usize>,
567{
568    let buf = bufs.iter().find(|b| !b.is_empty()).map_or(&[][..], |b| &**b);
569    write(buf)
570}
571
572pub(crate) fn default_read_exact<R: Read + ?Sized>(this: &mut R, mut buf: &mut [u8]) -> Result<()> {
573    while !buf.is_empty() {
574        match this.read(buf) {
575            Ok(0) => break,
576            Ok(n) => {
577                buf = &mut buf[n..];
578            }
579            Err(ref e) if e.is_interrupted() => {}
580            Err(e) => return Err(e),
581        }
582    }
583    if !buf.is_empty() { Err(Error::READ_EXACT_EOF) } else { Ok(()) }
584}
585
586pub(crate) fn default_read_buf<F>(read: F, mut cursor: BorrowedCursor<'_>) -> Result<()>
587where
588    F: FnOnce(&mut [u8]) -> Result<usize>,
589{
590    let n = read(cursor.ensure_init().init_mut())?;
591    cursor.advance(n);
592    Ok(())
593}
594
595pub(crate) fn default_read_buf_exact<R: Read + ?Sized>(
596    this: &mut R,
597    mut cursor: BorrowedCursor<'_>,
598) -> Result<()> {
599    while cursor.capacity() > 0 {
600        let prev_written = cursor.written();
601        match this.read_buf(cursor.reborrow()) {
602            Ok(()) => {}
603            Err(e) if e.is_interrupted() => continue,
604            Err(e) => return Err(e),
605        }
606
607        if cursor.written() == prev_written {
608            return Err(Error::READ_EXACT_EOF);
609        }
610    }
611
612    Ok(())
613}
614
615pub(crate) fn default_write_fmt<W: Write + ?Sized>(
616    this: &mut W,
617    args: fmt::Arguments<'_>,
618) -> Result<()> {
619    // Create a shim which translates a `Write` to a `fmt::Write` and saves off
620    // I/O errors, instead of discarding them.
621    struct Adapter<'a, T: ?Sized + 'a> {
622        inner: &'a mut T,
623        error: Result<()>,
624    }
625
626    impl<T: Write + ?Sized> fmt::Write for Adapter<'_, T> {
627        fn write_str(&mut self, s: &str) -> fmt::Result {
628            match self.inner.write_all(s.as_bytes()) {
629                Ok(()) => Ok(()),
630                Err(e) => {
631                    self.error = Err(e);
632                    Err(fmt::Error)
633                }
634            }
635        }
636    }
637
638    let mut output = Adapter { inner: this, error: Ok(()) };
639    match fmt::write(&mut output, args) {
640        Ok(()) => Ok(()),
641        Err(..) => {
642            // Check whether the error came from the underlying `Write`.
643            if output.error.is_err() {
644                output.error
645            } else {
646                // This shouldn't happen: the underlying stream did not error,
647                // but somehow the formatter still errored?
648                panic!(
649                    "a formatting trait implementation returned an error when the underlying stream did not"
650                );
651            }
652        }
653    }
654}
655
656/// The `Read` trait allows for reading bytes from a source.
657///
658/// Implementors of the `Read` trait are called 'readers'.
659///
660/// Readers are defined by one required method, [`read()`]. Each call to [`read()`]
661/// will attempt to pull bytes from this source into a provided buffer. A
662/// number of other methods are implemented in terms of [`read()`], giving
663/// implementors a number of ways to read bytes while only needing to implement
664/// a single method.
665///
666/// Readers are intended to be composable with one another. Many implementors
667/// throughout [`std::io`] take and provide types which implement the `Read`
668/// trait.
669///
670/// Please note that each call to [`read()`] may involve a system call, and
671/// therefore, using something that implements [`BufRead`], such as
672/// [`BufReader`], will be more efficient.
673///
674/// Repeated calls to the reader use the same cursor, so for example
675/// calling `read_to_end` twice on a [`File`] will only return the file's
676/// contents once. It's recommended to first call `rewind()` in that case.
677///
678/// # Examples
679///
680/// [`File`]s implement `Read`:
681///
682/// ```no_run
683/// use std::io;
684/// use std::io::prelude::*;
685/// use std::fs::File;
686///
687/// fn main() -> io::Result<()> {
688///     let mut f = File::open("foo.txt")?;
689///     let mut buffer = [0; 10];
690///
691///     // read up to 10 bytes
692///     f.read(&mut buffer)?;
693///
694///     let mut buffer = Vec::new();
695///     // read the whole file
696///     f.read_to_end(&mut buffer)?;
697///
698///     // read into a String, so that you don't need to do the conversion.
699///     let mut buffer = String::new();
700///     f.read_to_string(&mut buffer)?;
701///
702///     // and more! See the other methods for more details.
703///     Ok(())
704/// }
705/// ```
706///
707/// Read from [`&str`] because [`&[u8]`][prim@slice] implements `Read`:
708///
709/// ```no_run
710/// # use std::io;
711/// use std::io::prelude::*;
712///
713/// fn main() -> io::Result<()> {
714///     let mut b = "This string will be read".as_bytes();
715///     let mut buffer = [0; 10];
716///
717///     // read up to 10 bytes
718///     b.read(&mut buffer)?;
719///
720///     // etc... it works exactly as a File does!
721///     Ok(())
722/// }
723/// ```
724///
725/// [`read()`]: Read::read
726/// [`&str`]: prim@str
727/// [`std::io`]: self
728/// [`File`]: crate::fs::File
729#[stable(feature = "rust1", since = "1.0.0")]
730#[doc(notable_trait)]
731#[cfg_attr(not(test), rustc_diagnostic_item = "IoRead")]
732pub trait Read {
733    /// Pull some bytes from this source into the specified buffer, returning
734    /// how many bytes were read.
735    ///
736    /// This function does not provide any guarantees about whether it blocks
737    /// waiting for data, but if an object needs to block for a read and cannot,
738    /// it will typically signal this via an [`Err`] return value.
739    ///
740    /// If the return value of this method is [`Ok(n)`], then implementations must
741    /// guarantee that `0 <= n <= buf.len()`. A nonzero `n` value indicates
742    /// that the buffer `buf` has been filled in with `n` bytes of data from this
743    /// source. If `n` is `0`, then it can indicate one of two scenarios:
744    ///
745    /// 1. This reader has reached its "end of file" and will likely no longer
746    ///    be able to produce bytes. Note that this does not mean that the
747    ///    reader will *always* no longer be able to produce bytes. As an example,
748    ///    on Linux, this method will call the `recv` syscall for a [`TcpStream`],
749    ///    where returning zero indicates the connection was shut down correctly. While
750    ///    for [`File`], it is possible to reach the end of file and get zero as result,
751    ///    but if more data is appended to the file, future calls to `read` will return
752    ///    more data.
753    /// 2. The buffer specified was 0 bytes in length.
754    ///
755    /// It is not an error if the returned value `n` is smaller than the buffer size,
756    /// even when the reader is not at the end of the stream yet.
757    /// This may happen for example because fewer bytes are actually available right now
758    /// (e. g. being close to end-of-file) or because read() was interrupted by a signal.
759    ///
760    /// As this trait is safe to implement, callers in unsafe code cannot rely on
761    /// `n <= buf.len()` for safety.
762    /// Extra care needs to be taken when `unsafe` functions are used to access the read bytes.
763    /// Callers have to ensure that no unchecked out-of-bounds accesses are possible even if
764    /// `n > buf.len()`.
765    ///
766    /// *Implementations* of this method can make no assumptions about the contents of `buf` when
767    /// this function is called. It is recommended that implementations only write data to `buf`
768    /// instead of reading its contents.
769    ///
770    /// Correspondingly, however, *callers* of this method in unsafe code must not assume
771    /// any guarantees about how the implementation uses `buf`. The trait is safe to implement,
772    /// so it is possible that the code that's supposed to write to the buffer might also read
773    /// from it. It is your responsibility to make sure that `buf` is initialized
774    /// before calling `read`. Calling `read` with an uninitialized `buf` (of the kind one
775    /// obtains via [`MaybeUninit<T>`]) is not safe, and can lead to undefined behavior.
776    ///
777    /// [`MaybeUninit<T>`]: crate::mem::MaybeUninit
778    ///
779    /// # Errors
780    ///
781    /// If this function encounters any form of I/O or other error, an error
782    /// variant will be returned. If an error is returned then it must be
783    /// guaranteed that no bytes were read.
784    ///
785    /// An error of the [`ErrorKind::Interrupted`] kind is non-fatal and the read
786    /// operation should be retried if there is nothing else to do.
787    ///
788    /// # Examples
789    ///
790    /// [`File`]s implement `Read`:
791    ///
792    /// [`Ok(n)`]: Ok
793    /// [`File`]: crate::fs::File
794    /// [`TcpStream`]: crate::net::TcpStream
795    ///
796    /// ```no_run
797    /// use std::io;
798    /// use std::io::prelude::*;
799    /// use std::fs::File;
800    ///
801    /// fn main() -> io::Result<()> {
802    ///     let mut f = File::open("foo.txt")?;
803    ///     let mut buffer = [0; 10];
804    ///
805    ///     // read up to 10 bytes
806    ///     let n = f.read(&mut buffer[..])?;
807    ///
808    ///     println!("The bytes: {:?}", &buffer[..n]);
809    ///     Ok(())
810    /// }
811    /// ```
812    #[stable(feature = "rust1", since = "1.0.0")]
813    fn read(&mut self, buf: &mut [u8]) -> Result<usize>;
814
815    /// Like `read`, except that it reads into a slice of buffers.
816    ///
817    /// Data is copied to fill each buffer in order, with the final buffer
818    /// written to possibly being only partially filled. This method must
819    /// behave equivalently to a single call to `read` with concatenated
820    /// buffers.
821    ///
822    /// The default implementation calls `read` with either the first nonempty
823    /// buffer provided, or an empty one if none exists.
824    #[stable(feature = "iovec", since = "1.36.0")]
825    fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize> {
826        default_read_vectored(|b| self.read(b), bufs)
827    }
828
829    /// Determines if this `Read`er has an efficient `read_vectored`
830    /// implementation.
831    ///
832    /// If a `Read`er does not override the default `read_vectored`
833    /// implementation, code using it may want to avoid the method all together
834    /// and coalesce writes into a single buffer for higher performance.
835    ///
836    /// The default implementation returns `false`.
837    #[unstable(feature = "can_vector", issue = "69941")]
838    fn is_read_vectored(&self) -> bool {
839        false
840    }
841
842    /// Reads all bytes until EOF in this source, placing them into `buf`.
843    ///
844    /// All bytes read from this source will be appended to the specified buffer
845    /// `buf`. This function will continuously call [`read()`] to append more data to
846    /// `buf` until [`read()`] returns either [`Ok(0)`] or an error of
847    /// non-[`ErrorKind::Interrupted`] kind.
848    ///
849    /// If successful, this function will return the total number of bytes read.
850    ///
851    /// # Errors
852    ///
853    /// If this function encounters an error of the kind
854    /// [`ErrorKind::Interrupted`] then the error is ignored and the operation
855    /// will continue.
856    ///
857    /// If any other read error is encountered then this function immediately
858    /// returns. Any bytes which have already been read will be appended to
859    /// `buf`.
860    ///
861    /// # Examples
862    ///
863    /// [`File`]s implement `Read`:
864    ///
865    /// [`read()`]: Read::read
866    /// [`Ok(0)`]: Ok
867    /// [`File`]: crate::fs::File
868    ///
869    /// ```no_run
870    /// use std::io;
871    /// use std::io::prelude::*;
872    /// use std::fs::File;
873    ///
874    /// fn main() -> io::Result<()> {
875    ///     let mut f = File::open("foo.txt")?;
876    ///     let mut buffer = Vec::new();
877    ///
878    ///     // read the whole file
879    ///     f.read_to_end(&mut buffer)?;
880    ///     Ok(())
881    /// }
882    /// ```
883    ///
884    /// (See also the [`std::fs::read`] convenience function for reading from a
885    /// file.)
886    ///
887    /// [`std::fs::read`]: crate::fs::read
888    ///
889    /// ## Implementing `read_to_end`
890    ///
891    /// When implementing the `io::Read` trait, it is recommended to allocate
892    /// memory using [`Vec::try_reserve`]. However, this behavior is not guaranteed
893    /// by all implementations, and `read_to_end` may not handle out-of-memory
894    /// situations gracefully.
895    ///
896    /// ```no_run
897    /// # use std::io::{self, BufRead};
898    /// # struct Example { example_datasource: io::Empty } impl Example {
899    /// # fn get_some_data_for_the_example(&self) -> &'static [u8] { &[] }
900    /// fn read_to_end(&mut self, dest_vec: &mut Vec<u8>) -> io::Result<usize> {
901    ///     let initial_vec_len = dest_vec.len();
902    ///     loop {
903    ///         let src_buf = self.example_datasource.fill_buf()?;
904    ///         if src_buf.is_empty() {
905    ///             break;
906    ///         }
907    ///         dest_vec.try_reserve(src_buf.len())?;
908    ///         dest_vec.extend_from_slice(src_buf);
909    ///
910    ///         // Any irreversible side effects should happen after `try_reserve` succeeds,
911    ///         // to avoid losing data on allocation error.
912    ///         let read = src_buf.len();
913    ///         self.example_datasource.consume(read);
914    ///     }
915    ///     Ok(dest_vec.len() - initial_vec_len)
916    /// }
917    /// # }
918    /// ```
919    ///
920    /// # Usage Notes
921    ///
922    /// `read_to_end` attempts to read a source until EOF, but many sources are continuous streams
923    /// that do not send EOF. In these cases, `read_to_end` will block indefinitely. Standard input
924    /// is one such stream which may be finite if piped, but is typically continuous. For example,
925    /// `cat file | my-rust-program` will correctly terminate with an `EOF` upon closure of cat.
926    /// Reading user input or running programs that remain open indefinitely will never terminate
927    /// the stream with `EOF` (e.g. `yes | my-rust-program`).
928    ///
929    /// Using `.lines()` with a [`BufReader`] or using [`read`] can provide a better solution
930    ///
931    ///[`read`]: Read::read
932    ///
933    /// [`Vec::try_reserve`]: crate::vec::Vec::try_reserve
934    #[stable(feature = "rust1", since = "1.0.0")]
935    fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize> {
936        default_read_to_end(self, buf, None)
937    }
938
939    /// Reads all bytes until EOF in this source, appending them to `buf`.
940    ///
941    /// If successful, this function returns the number of bytes which were read
942    /// and appended to `buf`.
943    ///
944    /// # Errors
945    ///
946    /// If the data in this stream is *not* valid UTF-8 then an error is
947    /// returned and `buf` is unchanged.
948    ///
949    /// See [`read_to_end`] for other error semantics.
950    ///
951    /// [`read_to_end`]: Read::read_to_end
952    ///
953    /// # Examples
954    ///
955    /// [`File`]s implement `Read`:
956    ///
957    /// [`File`]: crate::fs::File
958    ///
959    /// ```no_run
960    /// use std::io;
961    /// use std::io::prelude::*;
962    /// use std::fs::File;
963    ///
964    /// fn main() -> io::Result<()> {
965    ///     let mut f = File::open("foo.txt")?;
966    ///     let mut buffer = String::new();
967    ///
968    ///     f.read_to_string(&mut buffer)?;
969    ///     Ok(())
970    /// }
971    /// ```
972    ///
973    /// (See also the [`std::fs::read_to_string`] convenience function for
974    /// reading from a file.)
975    ///
976    /// # Usage Notes
977    ///
978    /// `read_to_string` attempts to read a source until EOF, but many sources are continuous streams
979    /// that do not send EOF. In these cases, `read_to_string` will block indefinitely. Standard input
980    /// is one such stream which may be finite if piped, but is typically continuous. For example,
981    /// `cat file | my-rust-program` will correctly terminate with an `EOF` upon closure of cat.
982    /// Reading user input or running programs that remain open indefinitely will never terminate
983    /// the stream with `EOF` (e.g. `yes | my-rust-program`).
984    ///
985    /// Using `.lines()` with a [`BufReader`] or using [`read`] can provide a better solution
986    ///
987    ///[`read`]: Read::read
988    ///
989    /// [`std::fs::read_to_string`]: crate::fs::read_to_string
990    #[stable(feature = "rust1", since = "1.0.0")]
991    fn read_to_string(&mut self, buf: &mut String) -> Result<usize> {
992        default_read_to_string(self, buf, None)
993    }
994
995    /// Reads the exact number of bytes required to fill `buf`.
996    ///
997    /// This function reads as many bytes as necessary to completely fill the
998    /// specified buffer `buf`.
999    ///
1000    /// *Implementations* of this method can make no assumptions about the contents of `buf` when
1001    /// this function is called. It is recommended that implementations only write data to `buf`
1002    /// instead of reading its contents. The documentation on [`read`] has a more detailed
1003    /// explanation of this subject.
1004    ///
1005    /// # Errors
1006    ///
1007    /// If this function encounters an error of the kind
1008    /// [`ErrorKind::Interrupted`] then the error is ignored and the operation
1009    /// will continue.
1010    ///
1011    /// If this function encounters an "end of file" before completely filling
1012    /// the buffer, it returns an error of the kind [`ErrorKind::UnexpectedEof`].
1013    /// The contents of `buf` are unspecified in this case.
1014    ///
1015    /// If any other read error is encountered then this function immediately
1016    /// returns. The contents of `buf` are unspecified in this case.
1017    ///
1018    /// If this function returns an error, it is unspecified how many bytes it
1019    /// has read, but it will never read more than would be necessary to
1020    /// completely fill the buffer.
1021    ///
1022    /// # Examples
1023    ///
1024    /// [`File`]s implement `Read`:
1025    ///
1026    /// [`read`]: Read::read
1027    /// [`File`]: crate::fs::File
1028    ///
1029    /// ```no_run
1030    /// use std::io;
1031    /// use std::io::prelude::*;
1032    /// use std::fs::File;
1033    ///
1034    /// fn main() -> io::Result<()> {
1035    ///     let mut f = File::open("foo.txt")?;
1036    ///     let mut buffer = [0; 10];
1037    ///
1038    ///     // read exactly 10 bytes
1039    ///     f.read_exact(&mut buffer)?;
1040    ///     Ok(())
1041    /// }
1042    /// ```
1043    #[stable(feature = "read_exact", since = "1.6.0")]
1044    fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> {
1045        default_read_exact(self, buf)
1046    }
1047
1048    /// Pull some bytes from this source into the specified buffer.
1049    ///
1050    /// This is equivalent to the [`read`](Read::read) method, except that it is passed a [`BorrowedCursor`] rather than `[u8]` to allow use
1051    /// with uninitialized buffers. The new data will be appended to any existing contents of `buf`.
1052    ///
1053    /// The default implementation delegates to `read`.
1054    ///
1055    /// This method makes it possible to return both data and an error but it is advised against.
1056    #[unstable(feature = "read_buf", issue = "78485")]
1057    fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<()> {
1058        default_read_buf(|b| self.read(b), buf)
1059    }
1060
1061    /// Reads the exact number of bytes required to fill `cursor`.
1062    ///
1063    /// This is similar to the [`read_exact`](Read::read_exact) method, except
1064    /// that it is passed a [`BorrowedCursor`] rather than `[u8]` to allow use
1065    /// with uninitialized buffers.
1066    ///
1067    /// # Errors
1068    ///
1069    /// If this function encounters an error of the kind [`ErrorKind::Interrupted`]
1070    /// then the error is ignored and the operation will continue.
1071    ///
1072    /// If this function encounters an "end of file" before completely filling
1073    /// the buffer, it returns an error of the kind [`ErrorKind::UnexpectedEof`].
1074    ///
1075    /// If any other read error is encountered then this function immediately
1076    /// returns.
1077    ///
1078    /// If this function returns an error, all bytes read will be appended to `cursor`.
1079    #[unstable(feature = "read_buf", issue = "78485")]
1080    fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<()> {
1081        default_read_buf_exact(self, cursor)
1082    }
1083
1084    /// Creates a "by reference" adaptor for this instance of `Read`.
1085    ///
1086    /// The returned adapter also implements `Read` and will simply borrow this
1087    /// current reader.
1088    ///
1089    /// # Examples
1090    ///
1091    /// [`File`]s implement `Read`:
1092    ///
1093    /// [`File`]: crate::fs::File
1094    ///
1095    /// ```no_run
1096    /// use std::io;
1097    /// use std::io::Read;
1098    /// use std::fs::File;
1099    ///
1100    /// fn main() -> io::Result<()> {
1101    ///     let mut f = File::open("foo.txt")?;
1102    ///     let mut buffer = Vec::new();
1103    ///     let mut other_buffer = Vec::new();
1104    ///
1105    ///     {
1106    ///         let reference = f.by_ref();
1107    ///
1108    ///         // read at most 5 bytes
1109    ///         reference.take(5).read_to_end(&mut buffer)?;
1110    ///
1111    ///     } // drop our &mut reference so we can use f again
1112    ///
1113    ///     // original file still usable, read the rest
1114    ///     f.read_to_end(&mut other_buffer)?;
1115    ///     Ok(())
1116    /// }
1117    /// ```
1118    #[stable(feature = "rust1", since = "1.0.0")]
1119    fn by_ref(&mut self) -> &mut Self
1120    where
1121        Self: Sized,
1122    {
1123        self
1124    }
1125
1126    /// Transforms this `Read` instance to an [`Iterator`] over its bytes.
1127    ///
1128    /// The returned type implements [`Iterator`] where the [`Item`] is
1129    /// <code>[Result]<[u8], [io::Error]></code>.
1130    /// The yielded item is [`Ok`] if a byte was successfully read and [`Err`]
1131    /// otherwise. EOF is mapped to returning [`None`] from this iterator.
1132    ///
1133    /// The default implementation calls `read` for each byte,
1134    /// which can be very inefficient for data that's not in memory,
1135    /// such as [`File`]. Consider using a [`BufReader`] in such cases.
1136    ///
1137    /// # Examples
1138    ///
1139    /// [`File`]s implement `Read`:
1140    ///
1141    /// [`Item`]: Iterator::Item
1142    /// [`File`]: crate::fs::File "fs::File"
1143    /// [Result]: crate::result::Result "Result"
1144    /// [io::Error]: self::Error "io::Error"
1145    ///
1146    /// ```no_run
1147    /// use std::io;
1148    /// use std::io::prelude::*;
1149    /// use std::io::BufReader;
1150    /// use std::fs::File;
1151    ///
1152    /// fn main() -> io::Result<()> {
1153    ///     let f = BufReader::new(File::open("foo.txt")?);
1154    ///
1155    ///     for byte in f.bytes() {
1156    ///         println!("{}", byte?);
1157    ///     }
1158    ///     Ok(())
1159    /// }
1160    /// ```
1161    #[stable(feature = "rust1", since = "1.0.0")]
1162    fn bytes(self) -> Bytes<Self>
1163    where
1164        Self: Sized,
1165    {
1166        Bytes { inner: self }
1167    }
1168
1169    /// Creates an adapter which will chain this stream with another.
1170    ///
1171    /// The returned `Read` instance will first read all bytes from this object
1172    /// until EOF is encountered. Afterwards the output is equivalent to the
1173    /// output of `next`.
1174    ///
1175    /// # Examples
1176    ///
1177    /// [`File`]s implement `Read`:
1178    ///
1179    /// [`File`]: crate::fs::File
1180    ///
1181    /// ```no_run
1182    /// use std::io;
1183    /// use std::io::prelude::*;
1184    /// use std::fs::File;
1185    ///
1186    /// fn main() -> io::Result<()> {
1187    ///     let f1 = File::open("foo.txt")?;
1188    ///     let f2 = File::open("bar.txt")?;
1189    ///
1190    ///     let mut handle = f1.chain(f2);
1191    ///     let mut buffer = String::new();
1192    ///
1193    ///     // read the value into a String. We could use any Read method here,
1194    ///     // this is just one example.
1195    ///     handle.read_to_string(&mut buffer)?;
1196    ///     Ok(())
1197    /// }
1198    /// ```
1199    #[stable(feature = "rust1", since = "1.0.0")]
1200    fn chain<R: Read>(self, next: R) -> Chain<Self, R>
1201    where
1202        Self: Sized,
1203    {
1204        Chain { first: self, second: next, done_first: false }
1205    }
1206
1207    /// Creates an adapter which will read at most `limit` bytes from it.
1208    ///
1209    /// This function returns a new instance of `Read` which will read at most
1210    /// `limit` bytes, after which it will always return EOF ([`Ok(0)`]). Any
1211    /// read errors will not count towards the number of bytes read and future
1212    /// calls to [`read()`] may succeed.
1213    ///
1214    /// # Examples
1215    ///
1216    /// [`File`]s implement `Read`:
1217    ///
1218    /// [`File`]: crate::fs::File
1219    /// [`Ok(0)`]: Ok
1220    /// [`read()`]: Read::read
1221    ///
1222    /// ```no_run
1223    /// use std::io;
1224    /// use std::io::prelude::*;
1225    /// use std::fs::File;
1226    ///
1227    /// fn main() -> io::Result<()> {
1228    ///     let f = File::open("foo.txt")?;
1229    ///     let mut buffer = [0; 5];
1230    ///
1231    ///     // read at most five bytes
1232    ///     let mut handle = f.take(5);
1233    ///
1234    ///     handle.read(&mut buffer)?;
1235    ///     Ok(())
1236    /// }
1237    /// ```
1238    #[stable(feature = "rust1", since = "1.0.0")]
1239    fn take(self, limit: u64) -> Take<Self>
1240    where
1241        Self: Sized,
1242    {
1243        Take { inner: self, len: limit, limit }
1244    }
1245}
1246
1247/// Reads all bytes from a [reader][Read] into a new [`String`].
1248///
1249/// This is a convenience function for [`Read::read_to_string`]. Using this
1250/// function avoids having to create a variable first and provides more type
1251/// safety since you can only get the buffer out if there were no errors. (If you
1252/// use [`Read::read_to_string`] you have to remember to check whether the read
1253/// succeeded because otherwise your buffer will be empty or only partially full.)
1254///
1255/// # Performance
1256///
1257/// The downside of this function's increased ease of use and type safety is
1258/// that it gives you less control over performance. For example, you can't
1259/// pre-allocate memory like you can using [`String::with_capacity`] and
1260/// [`Read::read_to_string`]. Also, you can't re-use the buffer if an error
1261/// occurs while reading.
1262///
1263/// In many cases, this function's performance will be adequate and the ease of use
1264/// and type safety tradeoffs will be worth it. However, there are cases where you
1265/// need more control over performance, and in those cases you should definitely use
1266/// [`Read::read_to_string`] directly.
1267///
1268/// Note that in some special cases, such as when reading files, this function will
1269/// pre-allocate memory based on the size of the input it is reading. In those
1270/// cases, the performance should be as good as if you had used
1271/// [`Read::read_to_string`] with a manually pre-allocated buffer.
1272///
1273/// # Errors
1274///
1275/// This function forces you to handle errors because the output (the `String`)
1276/// is wrapped in a [`Result`]. See [`Read::read_to_string`] for the errors
1277/// that can occur. If any error occurs, you will get an [`Err`], so you
1278/// don't have to worry about your buffer being empty or partially full.
1279///
1280/// # Examples
1281///
1282/// ```no_run
1283/// # use std::io;
1284/// fn main() -> io::Result<()> {
1285///     let stdin = io::read_to_string(io::stdin())?;
1286///     println!("Stdin was:");
1287///     println!("{stdin}");
1288///     Ok(())
1289/// }
1290/// ```
1291///
1292/// # Usage Notes
1293///
1294/// `read_to_string` attempts to read a source until EOF, but many sources are continuous streams
1295/// that do not send EOF. In these cases, `read_to_string` will block indefinitely. Standard input
1296/// is one such stream which may be finite if piped, but is typically continuous. For example,
1297/// `cat file | my-rust-program` will correctly terminate with an `EOF` upon closure of cat.
1298/// Reading user input or running programs that remain open indefinitely will never terminate
1299/// the stream with `EOF` (e.g. `yes | my-rust-program`).
1300///
1301/// Using `.lines()` with a [`BufReader`] or using [`read`] can provide a better solution
1302///
1303///[`read`]: Read::read
1304///
1305#[stable(feature = "io_read_to_string", since = "1.65.0")]
1306pub fn read_to_string<R: Read>(mut reader: R) -> Result<String> {
1307    let mut buf = String::new();
1308    reader.read_to_string(&mut buf)?;
1309    Ok(buf)
1310}
1311
1312/// A buffer type used with `Read::read_vectored`.
1313///
1314/// It is semantically a wrapper around a `&mut [u8]`, but is guaranteed to be
1315/// ABI compatible with the `iovec` type on Unix platforms and `WSABUF` on
1316/// Windows.
1317#[stable(feature = "iovec", since = "1.36.0")]
1318#[repr(transparent)]
1319pub struct IoSliceMut<'a>(sys::io::IoSliceMut<'a>);
1320
1321#[stable(feature = "iovec_send_sync", since = "1.44.0")]
1322unsafe impl<'a> Send for IoSliceMut<'a> {}
1323
1324#[stable(feature = "iovec_send_sync", since = "1.44.0")]
1325unsafe impl<'a> Sync for IoSliceMut<'a> {}
1326
1327#[stable(feature = "iovec", since = "1.36.0")]
1328impl<'a> fmt::Debug for IoSliceMut<'a> {
1329    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1330        fmt::Debug::fmt(self.0.as_slice(), fmt)
1331    }
1332}
1333
1334impl<'a> IoSliceMut<'a> {
1335    /// Creates a new `IoSliceMut` wrapping a byte slice.
1336    ///
1337    /// # Panics
1338    ///
1339    /// Panics on Windows if the slice is larger than 4GB.
1340    #[stable(feature = "iovec", since = "1.36.0")]
1341    #[inline]
1342    pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
1343        IoSliceMut(sys::io::IoSliceMut::new(buf))
1344    }
1345
1346    /// Advance the internal cursor of the slice.
1347    ///
1348    /// Also see [`IoSliceMut::advance_slices`] to advance the cursors of
1349    /// multiple buffers.
1350    ///
1351    /// # Panics
1352    ///
1353    /// Panics when trying to advance beyond the end of the slice.
1354    ///
1355    /// # Examples
1356    ///
1357    /// ```
1358    /// use std::io::IoSliceMut;
1359    /// use std::ops::Deref;
1360    ///
1361    /// let mut data = [1; 8];
1362    /// let mut buf = IoSliceMut::new(&mut data);
1363    ///
1364    /// // Mark 3 bytes as read.
1365    /// buf.advance(3);
1366    /// assert_eq!(buf.deref(), [1; 5].as_ref());
1367    /// ```
1368    #[stable(feature = "io_slice_advance", since = "1.81.0")]
1369    #[inline]
1370    pub fn advance(&mut self, n: usize) {
1371        self.0.advance(n)
1372    }
1373
1374    /// Advance a slice of slices.
1375    ///
1376    /// Shrinks the slice to remove any `IoSliceMut`s that are fully advanced over.
1377    /// If the cursor ends up in the middle of an `IoSliceMut`, it is modified
1378    /// to start at that cursor.
1379    ///
1380    /// For example, if we have a slice of two 8-byte `IoSliceMut`s, and we advance by 10 bytes,
1381    /// the result will only include the second `IoSliceMut`, advanced by 2 bytes.
1382    ///
1383    /// # Panics
1384    ///
1385    /// Panics when trying to advance beyond the end of the slices.
1386    ///
1387    /// # Examples
1388    ///
1389    /// ```
1390    /// use std::io::IoSliceMut;
1391    /// use std::ops::Deref;
1392    ///
1393    /// let mut buf1 = [1; 8];
1394    /// let mut buf2 = [2; 16];
1395    /// let mut buf3 = [3; 8];
1396    /// let mut bufs = &mut [
1397    ///     IoSliceMut::new(&mut buf1),
1398    ///     IoSliceMut::new(&mut buf2),
1399    ///     IoSliceMut::new(&mut buf3),
1400    /// ][..];
1401    ///
1402    /// // Mark 10 bytes as read.
1403    /// IoSliceMut::advance_slices(&mut bufs, 10);
1404    /// assert_eq!(bufs[0].deref(), [2; 14].as_ref());
1405    /// assert_eq!(bufs[1].deref(), [3; 8].as_ref());
1406    /// ```
1407    #[stable(feature = "io_slice_advance", since = "1.81.0")]
1408    #[inline]
1409    pub fn advance_slices(bufs: &mut &mut [IoSliceMut<'a>], n: usize) {
1410        // Number of buffers to remove.
1411        let mut remove = 0;
1412        // Remaining length before reaching n.
1413        let mut left = n;
1414        for buf in bufs.iter() {
1415            if let Some(remainder) = left.checked_sub(buf.len()) {
1416                left = remainder;
1417                remove += 1;
1418            } else {
1419                break;
1420            }
1421        }
1422
1423        *bufs = &mut take(bufs)[remove..];
1424        if bufs.is_empty() {
1425            assert!(left == 0, "advancing io slices beyond their length");
1426        } else {
1427            bufs[0].advance(left);
1428        }
1429    }
1430
1431    /// Get the underlying bytes as a mutable slice with the original lifetime.
1432    ///
1433    /// # Examples
1434    ///
1435    /// ```
1436    /// #![feature(io_slice_as_bytes)]
1437    /// use std::io::IoSliceMut;
1438    ///
1439    /// let mut data = *b"abcdef";
1440    /// let io_slice = IoSliceMut::new(&mut data);
1441    /// io_slice.into_slice()[0] = b'A';
1442    ///
1443    /// assert_eq!(&data, b"Abcdef");
1444    /// ```
1445    #[unstable(feature = "io_slice_as_bytes", issue = "132818")]
1446    pub const fn into_slice(self) -> &'a mut [u8] {
1447        self.0.into_slice()
1448    }
1449}
1450
1451#[stable(feature = "iovec", since = "1.36.0")]
1452impl<'a> Deref for IoSliceMut<'a> {
1453    type Target = [u8];
1454
1455    #[inline]
1456    fn deref(&self) -> &[u8] {
1457        self.0.as_slice()
1458    }
1459}
1460
1461#[stable(feature = "iovec", since = "1.36.0")]
1462impl<'a> DerefMut for IoSliceMut<'a> {
1463    #[inline]
1464    fn deref_mut(&mut self) -> &mut [u8] {
1465        self.0.as_mut_slice()
1466    }
1467}
1468
1469/// A buffer type used with `Write::write_vectored`.
1470///
1471/// It is semantically a wrapper around a `&[u8]`, but is guaranteed to be
1472/// ABI compatible with the `iovec` type on Unix platforms and `WSABUF` on
1473/// Windows.
1474#[stable(feature = "iovec", since = "1.36.0")]
1475#[derive(Copy, Clone)]
1476#[repr(transparent)]
1477pub struct IoSlice<'a>(sys::io::IoSlice<'a>);
1478
1479#[stable(feature = "iovec_send_sync", since = "1.44.0")]
1480unsafe impl<'a> Send for IoSlice<'a> {}
1481
1482#[stable(feature = "iovec_send_sync", since = "1.44.0")]
1483unsafe impl<'a> Sync for IoSlice<'a> {}
1484
1485#[stable(feature = "iovec", since = "1.36.0")]
1486impl<'a> fmt::Debug for IoSlice<'a> {
1487    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
1488        fmt::Debug::fmt(self.0.as_slice(), fmt)
1489    }
1490}
1491
1492impl<'a> IoSlice<'a> {
1493    /// Creates a new `IoSlice` wrapping a byte slice.
1494    ///
1495    /// # Panics
1496    ///
1497    /// Panics on Windows if the slice is larger than 4GB.
1498    #[stable(feature = "iovec", since = "1.36.0")]
1499    #[must_use]
1500    #[inline]
1501    pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
1502        IoSlice(sys::io::IoSlice::new(buf))
1503    }
1504
1505    /// Advance the internal cursor of the slice.
1506    ///
1507    /// Also see [`IoSlice::advance_slices`] to advance the cursors of multiple
1508    /// buffers.
1509    ///
1510    /// # Panics
1511    ///
1512    /// Panics when trying to advance beyond the end of the slice.
1513    ///
1514    /// # Examples
1515    ///
1516    /// ```
1517    /// use std::io::IoSlice;
1518    /// use std::ops::Deref;
1519    ///
1520    /// let data = [1; 8];
1521    /// let mut buf = IoSlice::new(&data);
1522    ///
1523    /// // Mark 3 bytes as read.
1524    /// buf.advance(3);
1525    /// assert_eq!(buf.deref(), [1; 5].as_ref());
1526    /// ```
1527    #[stable(feature = "io_slice_advance", since = "1.81.0")]
1528    #[inline]
1529    pub fn advance(&mut self, n: usize) {
1530        self.0.advance(n)
1531    }
1532
1533    /// Advance a slice of slices.
1534    ///
1535    /// Shrinks the slice to remove any `IoSlice`s that are fully advanced over.
1536    /// If the cursor ends up in the middle of an `IoSlice`, it is modified
1537    /// to start at that cursor.
1538    ///
1539    /// For example, if we have a slice of two 8-byte `IoSlice`s, and we advance by 10 bytes,
1540    /// the result will only include the second `IoSlice`, advanced by 2 bytes.
1541    ///
1542    /// # Panics
1543    ///
1544    /// Panics when trying to advance beyond the end of the slices.
1545    ///
1546    /// # Examples
1547    ///
1548    /// ```
1549    /// use std::io::IoSlice;
1550    /// use std::ops::Deref;
1551    ///
1552    /// let buf1 = [1; 8];
1553    /// let buf2 = [2; 16];
1554    /// let buf3 = [3; 8];
1555    /// let mut bufs = &mut [
1556    ///     IoSlice::new(&buf1),
1557    ///     IoSlice::new(&buf2),
1558    ///     IoSlice::new(&buf3),
1559    /// ][..];
1560    ///
1561    /// // Mark 10 bytes as written.
1562    /// IoSlice::advance_slices(&mut bufs, 10);
1563    /// assert_eq!(bufs[0].deref(), [2; 14].as_ref());
1564    /// assert_eq!(bufs[1].deref(), [3; 8].as_ref());
1565    #[stable(feature = "io_slice_advance", since = "1.81.0")]
1566    #[inline]
1567    pub fn advance_slices(bufs: &mut &mut [IoSlice<'a>], n: usize) {
1568        // Number of buffers to remove.
1569        let mut remove = 0;
1570        // Remaining length before reaching n. This prevents overflow
1571        // that could happen if the length of slices in `bufs` were instead
1572        // accumulated. Those slice may be aliased and, if they are large
1573        // enough, their added length may overflow a `usize`.
1574        let mut left = n;
1575        for buf in bufs.iter() {
1576            if let Some(remainder) = left.checked_sub(buf.len()) {
1577                left = remainder;
1578                remove += 1;
1579            } else {
1580                break;
1581            }
1582        }
1583
1584        *bufs = &mut take(bufs)[remove..];
1585        if bufs.is_empty() {
1586            assert!(left == 0, "advancing io slices beyond their length");
1587        } else {
1588            bufs[0].advance(left);
1589        }
1590    }
1591
1592    /// Get the underlying bytes as a slice with the original lifetime.
1593    ///
1594    /// This doesn't borrow from `self`, so is less restrictive than calling
1595    /// `.deref()`, which does.
1596    ///
1597    /// # Examples
1598    ///
1599    /// ```
1600    /// #![feature(io_slice_as_bytes)]
1601    /// use std::io::IoSlice;
1602    ///
1603    /// let data = b"abcdef";
1604    ///
1605    /// let mut io_slice = IoSlice::new(data);
1606    /// let tail = &io_slice.as_slice()[3..];
1607    ///
1608    /// // This works because `tail` doesn't borrow `io_slice`
1609    /// io_slice = IoSlice::new(tail);
1610    ///
1611    /// assert_eq!(io_slice.as_slice(), b"def");
1612    /// ```
1613    #[unstable(feature = "io_slice_as_bytes", issue = "132818")]
1614    pub const fn as_slice(self) -> &'a [u8] {
1615        self.0.as_slice()
1616    }
1617}
1618
1619#[stable(feature = "iovec", since = "1.36.0")]
1620impl<'a> Deref for IoSlice<'a> {
1621    type Target = [u8];
1622
1623    #[inline]
1624    fn deref(&self) -> &[u8] {
1625        self.0.as_slice()
1626    }
1627}
1628
1629/// A trait for objects which are byte-oriented sinks.
1630///
1631/// Implementors of the `Write` trait are sometimes called 'writers'.
1632///
1633/// Writers are defined by two required methods, [`write`] and [`flush`]:
1634///
1635/// * The [`write`] method will attempt to write some data into the object,
1636///   returning how many bytes were successfully written.
1637///
1638/// * The [`flush`] method is useful for adapters and explicit buffers
1639///   themselves for ensuring that all buffered data has been pushed out to the
1640///   'true sink'.
1641///
1642/// Writers are intended to be composable with one another. Many implementors
1643/// throughout [`std::io`] take and provide types which implement the `Write`
1644/// trait.
1645///
1646/// [`write`]: Write::write
1647/// [`flush`]: Write::flush
1648/// [`std::io`]: self
1649///
1650/// # Examples
1651///
1652/// ```no_run
1653/// use std::io::prelude::*;
1654/// use std::fs::File;
1655///
1656/// fn main() -> std::io::Result<()> {
1657///     let data = b"some bytes";
1658///
1659///     let mut pos = 0;
1660///     let mut buffer = File::create("foo.txt")?;
1661///
1662///     while pos < data.len() {
1663///         let bytes_written = buffer.write(&data[pos..])?;
1664///         pos += bytes_written;
1665///     }
1666///     Ok(())
1667/// }
1668/// ```
1669///
1670/// The trait also provides convenience methods like [`write_all`], which calls
1671/// `write` in a loop until its entire input has been written.
1672///
1673/// [`write_all`]: Write::write_all
1674#[stable(feature = "rust1", since = "1.0.0")]
1675#[doc(notable_trait)]
1676#[cfg_attr(not(test), rustc_diagnostic_item = "IoWrite")]
1677pub trait Write {
1678    /// Writes a buffer into this writer, returning how many bytes were written.
1679    ///
1680    /// This function will attempt to write the entire contents of `buf`, but
1681    /// the entire write might not succeed, or the write may also generate an
1682    /// error. Typically, a call to `write` represents one attempt to write to
1683    /// any wrapped object.
1684    ///
1685    /// Calls to `write` are not guaranteed to block waiting for data to be
1686    /// written, and a write which would otherwise block can be indicated through
1687    /// an [`Err`] variant.
1688    ///
1689    /// If this method consumed `n > 0` bytes of `buf` it must return [`Ok(n)`].
1690    /// If the return value is `Ok(n)` then `n` must satisfy `n <= buf.len()`.
1691    /// A return value of `Ok(0)` typically means that the underlying object is
1692    /// no longer able to accept bytes and will likely not be able to in the
1693    /// future as well, or that the buffer provided is empty.
1694    ///
1695    /// # Errors
1696    ///
1697    /// Each call to `write` may generate an I/O error indicating that the
1698    /// operation could not be completed. If an error is returned then no bytes
1699    /// in the buffer were written to this writer.
1700    ///
1701    /// It is **not** considered an error if the entire buffer could not be
1702    /// written to this writer.
1703    ///
1704    /// An error of the [`ErrorKind::Interrupted`] kind is non-fatal and the
1705    /// write operation should be retried if there is nothing else to do.
1706    ///
1707    /// # Examples
1708    ///
1709    /// ```no_run
1710    /// use std::io::prelude::*;
1711    /// use std::fs::File;
1712    ///
1713    /// fn main() -> std::io::Result<()> {
1714    ///     let mut buffer = File::create("foo.txt")?;
1715    ///
1716    ///     // Writes some prefix of the byte string, not necessarily all of it.
1717    ///     buffer.write(b"some bytes")?;
1718    ///     Ok(())
1719    /// }
1720    /// ```
1721    ///
1722    /// [`Ok(n)`]: Ok
1723    #[stable(feature = "rust1", since = "1.0.0")]
1724    fn write(&mut self, buf: &[u8]) -> Result<usize>;
1725
1726    /// Like [`write`], except that it writes from a slice of buffers.
1727    ///
1728    /// Data is copied from each buffer in order, with the final buffer
1729    /// read from possibly being only partially consumed. This method must
1730    /// behave as a call to [`write`] with the buffers concatenated would.
1731    ///
1732    /// The default implementation calls [`write`] with either the first nonempty
1733    /// buffer provided, or an empty one if none exists.
1734    ///
1735    /// # Examples
1736    ///
1737    /// ```no_run
1738    /// use std::io::IoSlice;
1739    /// use std::io::prelude::*;
1740    /// use std::fs::File;
1741    ///
1742    /// fn main() -> std::io::Result<()> {
1743    ///     let data1 = [1; 8];
1744    ///     let data2 = [15; 8];
1745    ///     let io_slice1 = IoSlice::new(&data1);
1746    ///     let io_slice2 = IoSlice::new(&data2);
1747    ///
1748    ///     let mut buffer = File::create("foo.txt")?;
1749    ///
1750    ///     // Writes some prefix of the byte string, not necessarily all of it.
1751    ///     buffer.write_vectored(&[io_slice1, io_slice2])?;
1752    ///     Ok(())
1753    /// }
1754    /// ```
1755    ///
1756    /// [`write`]: Write::write
1757    #[stable(feature = "iovec", since = "1.36.0")]
1758    fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize> {
1759        default_write_vectored(|b| self.write(b), bufs)
1760    }
1761
1762    /// Determines if this `Write`r has an efficient [`write_vectored`]
1763    /// implementation.
1764    ///
1765    /// If a `Write`r does not override the default [`write_vectored`]
1766    /// implementation, code using it may want to avoid the method all together
1767    /// and coalesce writes into a single buffer for higher performance.
1768    ///
1769    /// The default implementation returns `false`.
1770    ///
1771    /// [`write_vectored`]: Write::write_vectored
1772    #[unstable(feature = "can_vector", issue = "69941")]
1773    fn is_write_vectored(&self) -> bool {
1774        false
1775    }
1776
1777    /// Flushes this output stream, ensuring that all intermediately buffered
1778    /// contents reach their destination.
1779    ///
1780    /// # Errors
1781    ///
1782    /// It is considered an error if not all bytes could be written due to
1783    /// I/O errors or EOF being reached.
1784    ///
1785    /// # Examples
1786    ///
1787    /// ```no_run
1788    /// use std::io::prelude::*;
1789    /// use std::io::BufWriter;
1790    /// use std::fs::File;
1791    ///
1792    /// fn main() -> std::io::Result<()> {
1793    ///     let mut buffer = BufWriter::new(File::create("foo.txt")?);
1794    ///
1795    ///     buffer.write_all(b"some bytes")?;
1796    ///     buffer.flush()?;
1797    ///     Ok(())
1798    /// }
1799    /// ```
1800    #[stable(feature = "rust1", since = "1.0.0")]
1801    fn flush(&mut self) -> Result<()>;
1802
1803    /// Attempts to write an entire buffer into this writer.
1804    ///
1805    /// This method will continuously call [`write`] until there is no more data
1806    /// to be written or an error of non-[`ErrorKind::Interrupted`] kind is
1807    /// returned. This method will not return until the entire buffer has been
1808    /// successfully written or such an error occurs. The first error that is
1809    /// not of [`ErrorKind::Interrupted`] kind generated from this method will be
1810    /// returned.
1811    ///
1812    /// If the buffer contains no data, this will never call [`write`].
1813    ///
1814    /// # Errors
1815    ///
1816    /// This function will return the first error of
1817    /// non-[`ErrorKind::Interrupted`] kind that [`write`] returns.
1818    ///
1819    /// [`write`]: Write::write
1820    ///
1821    /// # Examples
1822    ///
1823    /// ```no_run
1824    /// use std::io::prelude::*;
1825    /// use std::fs::File;
1826    ///
1827    /// fn main() -> std::io::Result<()> {
1828    ///     let mut buffer = File::create("foo.txt")?;
1829    ///
1830    ///     buffer.write_all(b"some bytes")?;
1831    ///     Ok(())
1832    /// }
1833    /// ```
1834    #[stable(feature = "rust1", since = "1.0.0")]
1835    fn write_all(&mut self, mut buf: &[u8]) -> Result<()> {
1836        while !buf.is_empty() {
1837            match self.write(buf) {
1838                Ok(0) => {
1839                    return Err(Error::WRITE_ALL_EOF);
1840                }
1841                Ok(n) => buf = &buf[n..],
1842                Err(ref e) if e.is_interrupted() => {}
1843                Err(e) => return Err(e),
1844            }
1845        }
1846        Ok(())
1847    }
1848
1849    /// Attempts to write multiple buffers into this writer.
1850    ///
1851    /// This method will continuously call [`write_vectored`] until there is no
1852    /// more data to be written or an error of non-[`ErrorKind::Interrupted`]
1853    /// kind is returned. This method will not return until all buffers have
1854    /// been successfully written or such an error occurs. The first error that
1855    /// is not of [`ErrorKind::Interrupted`] kind generated from this method
1856    /// will be returned.
1857    ///
1858    /// If the buffer contains no data, this will never call [`write_vectored`].
1859    ///
1860    /// # Notes
1861    ///
1862    /// Unlike [`write_vectored`], this takes a *mutable* reference to
1863    /// a slice of [`IoSlice`]s, not an immutable one. That's because we need to
1864    /// modify the slice to keep track of the bytes already written.
1865    ///
1866    /// Once this function returns, the contents of `bufs` are unspecified, as
1867    /// this depends on how many calls to [`write_vectored`] were necessary. It is
1868    /// best to understand this function as taking ownership of `bufs` and to
1869    /// not use `bufs` afterwards. The underlying buffers, to which the
1870    /// [`IoSlice`]s point (but not the [`IoSlice`]s themselves), are unchanged and
1871    /// can be reused.
1872    ///
1873    /// [`write_vectored`]: Write::write_vectored
1874    ///
1875    /// # Examples
1876    ///
1877    /// ```
1878    /// #![feature(write_all_vectored)]
1879    /// # fn main() -> std::io::Result<()> {
1880    ///
1881    /// use std::io::{Write, IoSlice};
1882    ///
1883    /// let mut writer = Vec::new();
1884    /// let bufs = &mut [
1885    ///     IoSlice::new(&[1]),
1886    ///     IoSlice::new(&[2, 3]),
1887    ///     IoSlice::new(&[4, 5, 6]),
1888    /// ];
1889    ///
1890    /// writer.write_all_vectored(bufs)?;
1891    /// // Note: the contents of `bufs` is now undefined, see the Notes section.
1892    ///
1893    /// assert_eq!(writer, &[1, 2, 3, 4, 5, 6]);
1894    /// # Ok(()) }
1895    /// ```
1896    #[unstable(feature = "write_all_vectored", issue = "70436")]
1897    fn write_all_vectored(&mut self, mut bufs: &mut [IoSlice<'_>]) -> Result<()> {
1898        // Guarantee that bufs is empty if it contains no data,
1899        // to avoid calling write_vectored if there is no data to be written.
1900        IoSlice::advance_slices(&mut bufs, 0);
1901        while !bufs.is_empty() {
1902            match self.write_vectored(bufs) {
1903                Ok(0) => {
1904                    return Err(Error::WRITE_ALL_EOF);
1905                }
1906                Ok(n) => IoSlice::advance_slices(&mut bufs, n),
1907                Err(ref e) if e.is_interrupted() => {}
1908                Err(e) => return Err(e),
1909            }
1910        }
1911        Ok(())
1912    }
1913
1914    /// Writes a formatted string into this writer, returning any error
1915    /// encountered.
1916    ///
1917    /// This method is primarily used to interface with the
1918    /// [`format_args!()`] macro, and it is rare that this should
1919    /// explicitly be called. The [`write!()`] macro should be favored to
1920    /// invoke this method instead.
1921    ///
1922    /// This function internally uses the [`write_all`] method on
1923    /// this trait and hence will continuously write data so long as no errors
1924    /// are received. This also means that partial writes are not indicated in
1925    /// this signature.
1926    ///
1927    /// [`write_all`]: Write::write_all
1928    ///
1929    /// # Errors
1930    ///
1931    /// This function will return any I/O error reported while formatting.
1932    ///
1933    /// # Examples
1934    ///
1935    /// ```no_run
1936    /// use std::io::prelude::*;
1937    /// use std::fs::File;
1938    ///
1939    /// fn main() -> std::io::Result<()> {
1940    ///     let mut buffer = File::create("foo.txt")?;
1941    ///
1942    ///     // this call
1943    ///     write!(buffer, "{:.*}", 2, 1.234567)?;
1944    ///     // turns into this:
1945    ///     buffer.write_fmt(format_args!("{:.*}", 2, 1.234567))?;
1946    ///     Ok(())
1947    /// }
1948    /// ```
1949    #[stable(feature = "rust1", since = "1.0.0")]
1950    fn write_fmt(&mut self, args: fmt::Arguments<'_>) -> Result<()> {
1951        if let Some(s) = args.as_statically_known_str() {
1952            self.write_all(s.as_bytes())
1953        } else {
1954            default_write_fmt(self, args)
1955        }
1956    }
1957
1958    /// Creates a "by reference" adapter for this instance of `Write`.
1959    ///
1960    /// The returned adapter also implements `Write` and will simply borrow this
1961    /// current writer.
1962    ///
1963    /// # Examples
1964    ///
1965    /// ```no_run
1966    /// use std::io::Write;
1967    /// use std::fs::File;
1968    ///
1969    /// fn main() -> std::io::Result<()> {
1970    ///     let mut buffer = File::create("foo.txt")?;
1971    ///
1972    ///     let reference = buffer.by_ref();
1973    ///
1974    ///     // we can use reference just like our original buffer
1975    ///     reference.write_all(b"some bytes")?;
1976    ///     Ok(())
1977    /// }
1978    /// ```
1979    #[stable(feature = "rust1", since = "1.0.0")]
1980    fn by_ref(&mut self) -> &mut Self
1981    where
1982        Self: Sized,
1983    {
1984        self
1985    }
1986}
1987
1988/// The `Seek` trait provides a cursor which can be moved within a stream of
1989/// bytes.
1990///
1991/// The stream typically has a fixed size, allowing seeking relative to either
1992/// end or the current offset.
1993///
1994/// # Examples
1995///
1996/// [`File`]s implement `Seek`:
1997///
1998/// [`File`]: crate::fs::File
1999///
2000/// ```no_run
2001/// use std::io;
2002/// use std::io::prelude::*;
2003/// use std::fs::File;
2004/// use std::io::SeekFrom;
2005///
2006/// fn main() -> io::Result<()> {
2007///     let mut f = File::open("foo.txt")?;
2008///
2009///     // move the cursor 42 bytes from the start of the file
2010///     f.seek(SeekFrom::Start(42))?;
2011///     Ok(())
2012/// }
2013/// ```
2014#[stable(feature = "rust1", since = "1.0.0")]
2015#[cfg_attr(not(test), rustc_diagnostic_item = "IoSeek")]
2016pub trait Seek {
2017    /// Seek to an offset, in bytes, in a stream.
2018    ///
2019    /// A seek beyond the end of a stream is allowed, but behavior is defined
2020    /// by the implementation.
2021    ///
2022    /// If the seek operation completed successfully,
2023    /// this method returns the new position from the start of the stream.
2024    /// That position can be used later with [`SeekFrom::Start`].
2025    ///
2026    /// # Errors
2027    ///
2028    /// Seeking can fail, for example because it might involve flushing a buffer.
2029    ///
2030    /// Seeking to a negative offset is considered an error.
2031    #[stable(feature = "rust1", since = "1.0.0")]
2032    fn seek(&mut self, pos: SeekFrom) -> Result<u64>;
2033
2034    /// Rewind to the beginning of a stream.
2035    ///
2036    /// This is a convenience method, equivalent to `seek(SeekFrom::Start(0))`.
2037    ///
2038    /// # Errors
2039    ///
2040    /// Rewinding can fail, for example because it might involve flushing a buffer.
2041    ///
2042    /// # Example
2043    ///
2044    /// ```no_run
2045    /// use std::io::{Read, Seek, Write};
2046    /// use std::fs::OpenOptions;
2047    ///
2048    /// let mut f = OpenOptions::new()
2049    ///     .write(true)
2050    ///     .read(true)
2051    ///     .create(true)
2052    ///     .open("foo.txt")?;
2053    ///
2054    /// let hello = "Hello!\n";
2055    /// write!(f, "{hello}")?;
2056    /// f.rewind()?;
2057    ///
2058    /// let mut buf = String::new();
2059    /// f.read_to_string(&mut buf)?;
2060    /// assert_eq!(&buf, hello);
2061    /// # std::io::Result::Ok(())
2062    /// ```
2063    #[stable(feature = "seek_rewind", since = "1.55.0")]
2064    fn rewind(&mut self) -> Result<()> {
2065        self.seek(SeekFrom::Start(0))?;
2066        Ok(())
2067    }
2068
2069    /// Returns the length of this stream (in bytes).
2070    ///
2071    /// The default implementation uses up to three seek operations. If this
2072    /// method returns successfully, the seek position is unchanged (i.e. the
2073    /// position before calling this method is the same as afterwards).
2074    /// However, if this method returns an error, the seek position is
2075    /// unspecified.
2076    ///
2077    /// If you need to obtain the length of *many* streams and you don't care
2078    /// about the seek position afterwards, you can reduce the number of seek
2079    /// operations by simply calling `seek(SeekFrom::End(0))` and using its
2080    /// return value (it is also the stream length).
2081    ///
2082    /// Note that length of a stream can change over time (for example, when
2083    /// data is appended to a file). So calling this method multiple times does
2084    /// not necessarily return the same length each time.
2085    ///
2086    /// # Example
2087    ///
2088    /// ```no_run
2089    /// #![feature(seek_stream_len)]
2090    /// use std::{
2091    ///     io::{self, Seek},
2092    ///     fs::File,
2093    /// };
2094    ///
2095    /// fn main() -> io::Result<()> {
2096    ///     let mut f = File::open("foo.txt")?;
2097    ///
2098    ///     let len = f.stream_len()?;
2099    ///     println!("The file is currently {len} bytes long");
2100    ///     Ok(())
2101    /// }
2102    /// ```
2103    #[unstable(feature = "seek_stream_len", issue = "59359")]
2104    fn stream_len(&mut self) -> Result<u64> {
2105        stream_len_default(self)
2106    }
2107
2108    /// Returns the current seek position from the start of the stream.
2109    ///
2110    /// This is equivalent to `self.seek(SeekFrom::Current(0))`.
2111    ///
2112    /// # Example
2113    ///
2114    /// ```no_run
2115    /// use std::{
2116    ///     io::{self, BufRead, BufReader, Seek},
2117    ///     fs::File,
2118    /// };
2119    ///
2120    /// fn main() -> io::Result<()> {
2121    ///     let mut f = BufReader::new(File::open("foo.txt")?);
2122    ///
2123    ///     let before = f.stream_position()?;
2124    ///     f.read_line(&mut String::new())?;
2125    ///     let after = f.stream_position()?;
2126    ///
2127    ///     println!("The first line was {} bytes long", after - before);
2128    ///     Ok(())
2129    /// }
2130    /// ```
2131    #[stable(feature = "seek_convenience", since = "1.51.0")]
2132    fn stream_position(&mut self) -> Result<u64> {
2133        self.seek(SeekFrom::Current(0))
2134    }
2135
2136    /// Seeks relative to the current position.
2137    ///
2138    /// This is equivalent to `self.seek(SeekFrom::Current(offset))` but
2139    /// doesn't return the new position which can allow some implementations
2140    /// such as [`BufReader`] to perform more efficient seeks.
2141    ///
2142    /// # Example
2143    ///
2144    /// ```no_run
2145    /// use std::{
2146    ///     io::{self, Seek},
2147    ///     fs::File,
2148    /// };
2149    ///
2150    /// fn main() -> io::Result<()> {
2151    ///     let mut f = File::open("foo.txt")?;
2152    ///     f.seek_relative(10)?;
2153    ///     assert_eq!(f.stream_position()?, 10);
2154    ///     Ok(())
2155    /// }
2156    /// ```
2157    ///
2158    /// [`BufReader`]: crate::io::BufReader
2159    #[stable(feature = "seek_seek_relative", since = "1.80.0")]
2160    fn seek_relative(&mut self, offset: i64) -> Result<()> {
2161        self.seek(SeekFrom::Current(offset))?;
2162        Ok(())
2163    }
2164}
2165
2166pub(crate) fn stream_len_default<T: Seek + ?Sized>(self_: &mut T) -> Result<u64> {
2167    let old_pos = self_.stream_position()?;
2168    let len = self_.seek(SeekFrom::End(0))?;
2169
2170    // Avoid seeking a third time when we were already at the end of the
2171    // stream. The branch is usually way cheaper than a seek operation.
2172    if old_pos != len {
2173        self_.seek(SeekFrom::Start(old_pos))?;
2174    }
2175
2176    Ok(len)
2177}
2178
2179/// Enumeration of possible methods to seek within an I/O object.
2180///
2181/// It is used by the [`Seek`] trait.
2182#[derive(Copy, PartialEq, Eq, Clone, Debug)]
2183#[stable(feature = "rust1", since = "1.0.0")]
2184#[cfg_attr(not(test), rustc_diagnostic_item = "SeekFrom")]
2185pub enum SeekFrom {
2186    /// Sets the offset to the provided number of bytes.
2187    #[stable(feature = "rust1", since = "1.0.0")]
2188    Start(#[stable(feature = "rust1", since = "1.0.0")] u64),
2189
2190    /// Sets the offset to the size of this object plus the specified number of
2191    /// bytes.
2192    ///
2193    /// It is possible to seek beyond the end of an object, but it's an error to
2194    /// seek before byte 0.
2195    #[stable(feature = "rust1", since = "1.0.0")]
2196    End(#[stable(feature = "rust1", since = "1.0.0")] i64),
2197
2198    /// Sets the offset to the current position plus the specified number of
2199    /// bytes.
2200    ///
2201    /// It is possible to seek beyond the end of an object, but it's an error to
2202    /// seek before byte 0.
2203    #[stable(feature = "rust1", since = "1.0.0")]
2204    Current(#[stable(feature = "rust1", since = "1.0.0")] i64),
2205}
2206
2207fn read_until<R: BufRead + ?Sized>(r: &mut R, delim: u8, buf: &mut Vec<u8>) -> Result<usize> {
2208    let mut read = 0;
2209    loop {
2210        let (done, used) = {
2211            let available = match r.fill_buf() {
2212                Ok(n) => n,
2213                Err(ref e) if e.is_interrupted() => continue,
2214                Err(e) => return Err(e),
2215            };
2216            match memchr::memchr(delim, available) {
2217                Some(i) => {
2218                    buf.extend_from_slice(&available[..=i]);
2219                    (true, i + 1)
2220                }
2221                None => {
2222                    buf.extend_from_slice(available);
2223                    (false, available.len())
2224                }
2225            }
2226        };
2227        r.consume(used);
2228        read += used;
2229        if done || used == 0 {
2230            return Ok(read);
2231        }
2232    }
2233}
2234
2235fn skip_until<R: BufRead + ?Sized>(r: &mut R, delim: u8) -> Result<usize> {
2236    let mut read = 0;
2237    loop {
2238        let (done, used) = {
2239            let available = match r.fill_buf() {
2240                Ok(n) => n,
2241                Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
2242                Err(e) => return Err(e),
2243            };
2244            match memchr::memchr(delim, available) {
2245                Some(i) => (true, i + 1),
2246                None => (false, available.len()),
2247            }
2248        };
2249        r.consume(used);
2250        read += used;
2251        if done || used == 0 {
2252            return Ok(read);
2253        }
2254    }
2255}
2256
2257/// A `BufRead` is a type of `Read`er which has an internal buffer, allowing it
2258/// to perform extra ways of reading.
2259///
2260/// For example, reading line-by-line is inefficient without using a buffer, so
2261/// if you want to read by line, you'll need `BufRead`, which includes a
2262/// [`read_line`] method as well as a [`lines`] iterator.
2263///
2264/// # Examples
2265///
2266/// A locked standard input implements `BufRead`:
2267///
2268/// ```no_run
2269/// use std::io;
2270/// use std::io::prelude::*;
2271///
2272/// let stdin = io::stdin();
2273/// for line in stdin.lock().lines() {
2274///     println!("{}", line?);
2275/// }
2276/// # std::io::Result::Ok(())
2277/// ```
2278///
2279/// If you have something that implements [`Read`], you can use the [`BufReader`
2280/// type][`BufReader`] to turn it into a `BufRead`.
2281///
2282/// For example, [`File`] implements [`Read`], but not `BufRead`.
2283/// [`BufReader`] to the rescue!
2284///
2285/// [`File`]: crate::fs::File
2286/// [`read_line`]: BufRead::read_line
2287/// [`lines`]: BufRead::lines
2288///
2289/// ```no_run
2290/// use std::io::{self, BufReader};
2291/// use std::io::prelude::*;
2292/// use std::fs::File;
2293///
2294/// fn main() -> io::Result<()> {
2295///     let f = File::open("foo.txt")?;
2296///     let f = BufReader::new(f);
2297///
2298///     for line in f.lines() {
2299///         let line = line?;
2300///         println!("{line}");
2301///     }
2302///
2303///     Ok(())
2304/// }
2305/// ```
2306#[stable(feature = "rust1", since = "1.0.0")]
2307#[cfg_attr(not(test), rustc_diagnostic_item = "IoBufRead")]
2308pub trait BufRead: Read {
2309    /// Returns the contents of the internal buffer, filling it with more data, via `Read` methods, if empty.
2310    ///
2311    /// This is a lower-level method and is meant to be used together with [`consume`],
2312    /// which can be used to mark bytes that should not be returned by subsequent calls to `read`.
2313    ///
2314    /// [`consume`]: BufRead::consume
2315    ///
2316    /// Returns an empty buffer when the stream has reached EOF.
2317    ///
2318    /// # Errors
2319    ///
2320    /// This function will return an I/O error if a `Read` method was called, but returned an error.
2321    ///
2322    /// # Examples
2323    ///
2324    /// A locked standard input implements `BufRead`:
2325    ///
2326    /// ```no_run
2327    /// use std::io;
2328    /// use std::io::prelude::*;
2329    ///
2330    /// let stdin = io::stdin();
2331    /// let mut stdin = stdin.lock();
2332    ///
2333    /// let buffer = stdin.fill_buf()?;
2334    ///
2335    /// // work with buffer
2336    /// println!("{buffer:?}");
2337    ///
2338    /// // mark the bytes we worked with as read
2339    /// let length = buffer.len();
2340    /// stdin.consume(length);
2341    /// # std::io::Result::Ok(())
2342    /// ```
2343    #[stable(feature = "rust1", since = "1.0.0")]
2344    fn fill_buf(&mut self) -> Result<&[u8]>;
2345
2346    /// Marks the given `amount` of additional bytes from the internal buffer as having been read.
2347    /// Subsequent calls to `read` only return bytes that have not been marked as read.
2348    ///
2349    /// This is a lower-level method and is meant to be used together with [`fill_buf`],
2350    /// which can be used to fill the internal buffer via `Read` methods.
2351    ///
2352    /// It is a logic error if `amount` exceeds the number of unread bytes in the internal buffer, which is returned by [`fill_buf`].
2353    ///
2354    /// # Examples
2355    ///
2356    /// Since `consume()` is meant to be used with [`fill_buf`],
2357    /// that method's example includes an example of `consume()`.
2358    ///
2359    /// [`fill_buf`]: BufRead::fill_buf
2360    #[stable(feature = "rust1", since = "1.0.0")]
2361    fn consume(&mut self, amount: usize);
2362
2363    /// Checks if there is any data left to be `read`.
2364    ///
2365    /// This function may fill the buffer to check for data,
2366    /// so this function returns `Result<bool>`, not `bool`.
2367    ///
2368    /// The default implementation calls `fill_buf` and checks that the
2369    /// returned slice is empty (which means that there is no data left,
2370    /// since EOF is reached).
2371    ///
2372    /// # Errors
2373    ///
2374    /// This function will return an I/O error if a `Read` method was called, but returned an error.
2375    ///
2376    /// Examples
2377    ///
2378    /// ```
2379    /// #![feature(buf_read_has_data_left)]
2380    /// use std::io;
2381    /// use std::io::prelude::*;
2382    ///
2383    /// let stdin = io::stdin();
2384    /// let mut stdin = stdin.lock();
2385    ///
2386    /// while stdin.has_data_left()? {
2387    ///     let mut line = String::new();
2388    ///     stdin.read_line(&mut line)?;
2389    ///     // work with line
2390    ///     println!("{line:?}");
2391    /// }
2392    /// # std::io::Result::Ok(())
2393    /// ```
2394    #[unstable(feature = "buf_read_has_data_left", reason = "recently added", issue = "86423")]
2395    fn has_data_left(&mut self) -> Result<bool> {
2396        self.fill_buf().map(|b| !b.is_empty())
2397    }
2398
2399    /// Reads all bytes into `buf` until the delimiter `byte` or EOF is reached.
2400    ///
2401    /// This function will read bytes from the underlying stream until the
2402    /// delimiter or EOF is found. Once found, all bytes up to, and including,
2403    /// the delimiter (if found) will be appended to `buf`.
2404    ///
2405    /// If successful, this function will return the total number of bytes read.
2406    ///
2407    /// This function is blocking and should be used carefully: it is possible for
2408    /// an attacker to continuously send bytes without ever sending the delimiter
2409    /// or EOF.
2410    ///
2411    /// # Errors
2412    ///
2413    /// This function will ignore all instances of [`ErrorKind::Interrupted`] and
2414    /// will otherwise return any errors returned by [`fill_buf`].
2415    ///
2416    /// If an I/O error is encountered then all bytes read so far will be
2417    /// present in `buf` and its length will have been adjusted appropriately.
2418    ///
2419    /// [`fill_buf`]: BufRead::fill_buf
2420    ///
2421    /// # Examples
2422    ///
2423    /// [`std::io::Cursor`][`Cursor`] is a type that implements `BufRead`. In
2424    /// this example, we use [`Cursor`] to read all the bytes in a byte slice
2425    /// in hyphen delimited segments:
2426    ///
2427    /// ```
2428    /// use std::io::{self, BufRead};
2429    ///
2430    /// let mut cursor = io::Cursor::new(b"lorem-ipsum");
2431    /// let mut buf = vec![];
2432    ///
2433    /// // cursor is at 'l'
2434    /// let num_bytes = cursor.read_until(b'-', &mut buf)
2435    ///     .expect("reading from cursor won't fail");
2436    /// assert_eq!(num_bytes, 6);
2437    /// assert_eq!(buf, b"lorem-");
2438    /// buf.clear();
2439    ///
2440    /// // cursor is at 'i'
2441    /// let num_bytes = cursor.read_until(b'-', &mut buf)
2442    ///     .expect("reading from cursor won't fail");
2443    /// assert_eq!(num_bytes, 5);
2444    /// assert_eq!(buf, b"ipsum");
2445    /// buf.clear();
2446    ///
2447    /// // cursor is at EOF
2448    /// let num_bytes = cursor.read_until(b'-', &mut buf)
2449    ///     .expect("reading from cursor won't fail");
2450    /// assert_eq!(num_bytes, 0);
2451    /// assert_eq!(buf, b"");
2452    /// ```
2453    #[stable(feature = "rust1", since = "1.0.0")]
2454    fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize> {
2455        read_until(self, byte, buf)
2456    }
2457
2458    /// Skips all bytes until the delimiter `byte` or EOF is reached.
2459    ///
2460    /// This function will read (and discard) bytes from the underlying stream until the
2461    /// delimiter or EOF is found.
2462    ///
2463    /// If successful, this function will return the total number of bytes read,
2464    /// including the delimiter byte.
2465    ///
2466    /// This is useful for efficiently skipping data such as NUL-terminated strings
2467    /// in binary file formats without buffering.
2468    ///
2469    /// This function is blocking and should be used carefully: it is possible for
2470    /// an attacker to continuously send bytes without ever sending the delimiter
2471    /// or EOF.
2472    ///
2473    /// # Errors
2474    ///
2475    /// This function will ignore all instances of [`ErrorKind::Interrupted`] and
2476    /// will otherwise return any errors returned by [`fill_buf`].
2477    ///
2478    /// If an I/O error is encountered then all bytes read so far will be
2479    /// present in `buf` and its length will have been adjusted appropriately.
2480    ///
2481    /// [`fill_buf`]: BufRead::fill_buf
2482    ///
2483    /// # Examples
2484    ///
2485    /// [`std::io::Cursor`][`Cursor`] is a type that implements `BufRead`. In
2486    /// this example, we use [`Cursor`] to read some NUL-terminated information
2487    /// about Ferris from a binary string, skipping the fun fact:
2488    ///
2489    /// ```
2490    /// use std::io::{self, BufRead};
2491    ///
2492    /// let mut cursor = io::Cursor::new(b"Ferris\0Likes long walks on the beach\0Crustacean\0");
2493    ///
2494    /// // read name
2495    /// let mut name = Vec::new();
2496    /// let num_bytes = cursor.read_until(b'\0', &mut name)
2497    ///     .expect("reading from cursor won't fail");
2498    /// assert_eq!(num_bytes, 7);
2499    /// assert_eq!(name, b"Ferris\0");
2500    ///
2501    /// // skip fun fact
2502    /// let num_bytes = cursor.skip_until(b'\0')
2503    ///     .expect("reading from cursor won't fail");
2504    /// assert_eq!(num_bytes, 30);
2505    ///
2506    /// // read animal type
2507    /// let mut animal = Vec::new();
2508    /// let num_bytes = cursor.read_until(b'\0', &mut animal)
2509    ///     .expect("reading from cursor won't fail");
2510    /// assert_eq!(num_bytes, 11);
2511    /// assert_eq!(animal, b"Crustacean\0");
2512    /// ```
2513    #[stable(feature = "bufread_skip_until", since = "1.83.0")]
2514    fn skip_until(&mut self, byte: u8) -> Result<usize> {
2515        skip_until(self, byte)
2516    }
2517
2518    /// Reads all bytes until a newline (the `0xA` byte) is reached, and append
2519    /// them to the provided `String` buffer.
2520    ///
2521    /// Previous content of the buffer will be preserved. To avoid appending to
2522    /// the buffer, you need to [`clear`] it first.
2523    ///
2524    /// This function will read bytes from the underlying stream until the
2525    /// newline delimiter (the `0xA` byte) or EOF is found. Once found, all bytes
2526    /// up to, and including, the delimiter (if found) will be appended to
2527    /// `buf`.
2528    ///
2529    /// If successful, this function will return the total number of bytes read.
2530    ///
2531    /// If this function returns [`Ok(0)`], the stream has reached EOF.
2532    ///
2533    /// This function is blocking and should be used carefully: it is possible for
2534    /// an attacker to continuously send bytes without ever sending a newline
2535    /// or EOF. You can use [`take`] to limit the maximum number of bytes read.
2536    ///
2537    /// [`Ok(0)`]: Ok
2538    /// [`clear`]: String::clear
2539    /// [`take`]: crate::io::Read::take
2540    ///
2541    /// # Errors
2542    ///
2543    /// This function has the same error semantics as [`read_until`] and will
2544    /// also return an error if the read bytes are not valid UTF-8. If an I/O
2545    /// error is encountered then `buf` may contain some bytes already read in
2546    /// the event that all data read so far was valid UTF-8.
2547    ///
2548    /// [`read_until`]: BufRead::read_until
2549    ///
2550    /// # Examples
2551    ///
2552    /// [`std::io::Cursor`][`Cursor`] is a type that implements `BufRead`. In
2553    /// this example, we use [`Cursor`] to read all the lines in a byte slice:
2554    ///
2555    /// ```
2556    /// use std::io::{self, BufRead};
2557    ///
2558    /// let mut cursor = io::Cursor::new(b"foo\nbar");
2559    /// let mut buf = String::new();
2560    ///
2561    /// // cursor is at 'f'
2562    /// let num_bytes = cursor.read_line(&mut buf)
2563    ///     .expect("reading from cursor won't fail");
2564    /// assert_eq!(num_bytes, 4);
2565    /// assert_eq!(buf, "foo\n");
2566    /// buf.clear();
2567    ///
2568    /// // cursor is at 'b'
2569    /// let num_bytes = cursor.read_line(&mut buf)
2570    ///     .expect("reading from cursor won't fail");
2571    /// assert_eq!(num_bytes, 3);
2572    /// assert_eq!(buf, "bar");
2573    /// buf.clear();
2574    ///
2575    /// // cursor is at EOF
2576    /// let num_bytes = cursor.read_line(&mut buf)
2577    ///     .expect("reading from cursor won't fail");
2578    /// assert_eq!(num_bytes, 0);
2579    /// assert_eq!(buf, "");
2580    /// ```
2581    #[stable(feature = "rust1", since = "1.0.0")]
2582    fn read_line(&mut self, buf: &mut String) -> Result<usize> {
2583        // Note that we are not calling the `.read_until` method here, but
2584        // rather our hardcoded implementation. For more details as to why, see
2585        // the comments in `default_read_to_string`.
2586        unsafe { append_to_string(buf, |b| read_until(self, b'\n', b)) }
2587    }
2588
2589    /// Returns an iterator over the contents of this reader split on the byte
2590    /// `byte`.
2591    ///
2592    /// The iterator returned from this function will return instances of
2593    /// <code>[io::Result]<[Vec]\<u8>></code>. Each vector returned will *not* have
2594    /// the delimiter byte at the end.
2595    ///
2596    /// This function will yield errors whenever [`read_until`] would have
2597    /// also yielded an error.
2598    ///
2599    /// [io::Result]: self::Result "io::Result"
2600    /// [`read_until`]: BufRead::read_until
2601    ///
2602    /// # Examples
2603    ///
2604    /// [`std::io::Cursor`][`Cursor`] is a type that implements `BufRead`. In
2605    /// this example, we use [`Cursor`] to iterate over all hyphen delimited
2606    /// segments in a byte slice
2607    ///
2608    /// ```
2609    /// use std::io::{self, BufRead};
2610    ///
2611    /// let cursor = io::Cursor::new(b"lorem-ipsum-dolor");
2612    ///
2613    /// let mut split_iter = cursor.split(b'-').map(|l| l.unwrap());
2614    /// assert_eq!(split_iter.next(), Some(b"lorem".to_vec()));
2615    /// assert_eq!(split_iter.next(), Some(b"ipsum".to_vec()));
2616    /// assert_eq!(split_iter.next(), Some(b"dolor".to_vec()));
2617    /// assert_eq!(split_iter.next(), None);
2618    /// ```
2619    #[stable(feature = "rust1", since = "1.0.0")]
2620    fn split(self, byte: u8) -> Split<Self>
2621    where
2622        Self: Sized,
2623    {
2624        Split { buf: self, delim: byte }
2625    }
2626
2627    /// Returns an iterator over the lines of this reader.
2628    ///
2629    /// The iterator returned from this function will yield instances of
2630    /// <code>[io::Result]<[String]></code>. Each string returned will *not* have a newline
2631    /// byte (the `0xA` byte) or `CRLF` (`0xD`, `0xA` bytes) at the end.
2632    ///
2633    /// [io::Result]: self::Result "io::Result"
2634    ///
2635    /// # Examples
2636    ///
2637    /// [`std::io::Cursor`][`Cursor`] is a type that implements `BufRead`. In
2638    /// this example, we use [`Cursor`] to iterate over all the lines in a byte
2639    /// slice.
2640    ///
2641    /// ```
2642    /// use std::io::{self, BufRead};
2643    ///
2644    /// let cursor = io::Cursor::new(b"lorem\nipsum\r\ndolor");
2645    ///
2646    /// let mut lines_iter = cursor.lines().map(|l| l.unwrap());
2647    /// assert_eq!(lines_iter.next(), Some(String::from("lorem")));
2648    /// assert_eq!(lines_iter.next(), Some(String::from("ipsum")));
2649    /// assert_eq!(lines_iter.next(), Some(String::from("dolor")));
2650    /// assert_eq!(lines_iter.next(), None);
2651    /// ```
2652    ///
2653    /// # Errors
2654    ///
2655    /// Each line of the iterator has the same error semantics as [`BufRead::read_line`].
2656    #[stable(feature = "rust1", since = "1.0.0")]
2657    fn lines(self) -> Lines<Self>
2658    where
2659        Self: Sized,
2660    {
2661        Lines { buf: self }
2662    }
2663}
2664
2665/// Adapter to chain together two readers.
2666///
2667/// This struct is generally created by calling [`chain`] on a reader.
2668/// Please see the documentation of [`chain`] for more details.
2669///
2670/// [`chain`]: Read::chain
2671#[stable(feature = "rust1", since = "1.0.0")]
2672#[derive(Debug)]
2673pub struct Chain<T, U> {
2674    first: T,
2675    second: U,
2676    done_first: bool,
2677}
2678
2679impl<T, U> Chain<T, U> {
2680    /// Consumes the `Chain`, returning the wrapped readers.
2681    ///
2682    /// # Examples
2683    ///
2684    /// ```no_run
2685    /// use std::io;
2686    /// use std::io::prelude::*;
2687    /// use std::fs::File;
2688    ///
2689    /// fn main() -> io::Result<()> {
2690    ///     let mut foo_file = File::open("foo.txt")?;
2691    ///     let mut bar_file = File::open("bar.txt")?;
2692    ///
2693    ///     let chain = foo_file.chain(bar_file);
2694    ///     let (foo_file, bar_file) = chain.into_inner();
2695    ///     Ok(())
2696    /// }
2697    /// ```
2698    #[stable(feature = "more_io_inner_methods", since = "1.20.0")]
2699    pub fn into_inner(self) -> (T, U) {
2700        (self.first, self.second)
2701    }
2702
2703    /// Gets references to the underlying readers in this `Chain`.
2704    ///
2705    /// Care should be taken to avoid modifying the internal I/O state of the
2706    /// underlying readers as doing so may corrupt the internal state of this
2707    /// `Chain`.
2708    ///
2709    /// # Examples
2710    ///
2711    /// ```no_run
2712    /// use std::io;
2713    /// use std::io::prelude::*;
2714    /// use std::fs::File;
2715    ///
2716    /// fn main() -> io::Result<()> {
2717    ///     let mut foo_file = File::open("foo.txt")?;
2718    ///     let mut bar_file = File::open("bar.txt")?;
2719    ///
2720    ///     let chain = foo_file.chain(bar_file);
2721    ///     let (foo_file, bar_file) = chain.get_ref();
2722    ///     Ok(())
2723    /// }
2724    /// ```
2725    #[stable(feature = "more_io_inner_methods", since = "1.20.0")]
2726    pub fn get_ref(&self) -> (&T, &U) {
2727        (&self.first, &self.second)
2728    }
2729
2730    /// Gets mutable references to the underlying readers in this `Chain`.
2731    ///
2732    /// Care should be taken to avoid modifying the internal I/O state of the
2733    /// underlying readers as doing so may corrupt the internal state of this
2734    /// `Chain`.
2735    ///
2736    /// # Examples
2737    ///
2738    /// ```no_run
2739    /// use std::io;
2740    /// use std::io::prelude::*;
2741    /// use std::fs::File;
2742    ///
2743    /// fn main() -> io::Result<()> {
2744    ///     let mut foo_file = File::open("foo.txt")?;
2745    ///     let mut bar_file = File::open("bar.txt")?;
2746    ///
2747    ///     let mut chain = foo_file.chain(bar_file);
2748    ///     let (foo_file, bar_file) = chain.get_mut();
2749    ///     Ok(())
2750    /// }
2751    /// ```
2752    #[stable(feature = "more_io_inner_methods", since = "1.20.0")]
2753    pub fn get_mut(&mut self) -> (&mut T, &mut U) {
2754        (&mut self.first, &mut self.second)
2755    }
2756}
2757
2758#[stable(feature = "rust1", since = "1.0.0")]
2759impl<T: Read, U: Read> Read for Chain<T, U> {
2760    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2761        if !self.done_first {
2762            match self.first.read(buf)? {
2763                0 if !buf.is_empty() => self.done_first = true,
2764                n => return Ok(n),
2765            }
2766        }
2767        self.second.read(buf)
2768    }
2769
2770    fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize> {
2771        if !self.done_first {
2772            match self.first.read_vectored(bufs)? {
2773                0 if bufs.iter().any(|b| !b.is_empty()) => self.done_first = true,
2774                n => return Ok(n),
2775            }
2776        }
2777        self.second.read_vectored(bufs)
2778    }
2779
2780    #[inline]
2781    fn is_read_vectored(&self) -> bool {
2782        self.first.is_read_vectored() || self.second.is_read_vectored()
2783    }
2784
2785    fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize> {
2786        let mut read = 0;
2787        if !self.done_first {
2788            read += self.first.read_to_end(buf)?;
2789            self.done_first = true;
2790        }
2791        read += self.second.read_to_end(buf)?;
2792        Ok(read)
2793    }
2794
2795    // We don't override `read_to_string` here because an UTF-8 sequence could
2796    // be split between the two parts of the chain
2797
2798    fn read_buf(&mut self, mut buf: BorrowedCursor<'_>) -> Result<()> {
2799        if buf.capacity() == 0 {
2800            return Ok(());
2801        }
2802
2803        if !self.done_first {
2804            let old_len = buf.written();
2805            self.first.read_buf(buf.reborrow())?;
2806
2807            if buf.written() != old_len {
2808                return Ok(());
2809            } else {
2810                self.done_first = true;
2811            }
2812        }
2813        self.second.read_buf(buf)
2814    }
2815}
2816
2817#[stable(feature = "chain_bufread", since = "1.9.0")]
2818impl<T: BufRead, U: BufRead> BufRead for Chain<T, U> {
2819    fn fill_buf(&mut self) -> Result<&[u8]> {
2820        if !self.done_first {
2821            match self.first.fill_buf()? {
2822                buf if buf.is_empty() => self.done_first = true,
2823                buf => return Ok(buf),
2824            }
2825        }
2826        self.second.fill_buf()
2827    }
2828
2829    fn consume(&mut self, amt: usize) {
2830        if !self.done_first { self.first.consume(amt) } else { self.second.consume(amt) }
2831    }
2832
2833    fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize> {
2834        let mut read = 0;
2835        if !self.done_first {
2836            let n = self.first.read_until(byte, buf)?;
2837            read += n;
2838
2839            match buf.last() {
2840                Some(b) if *b == byte && n != 0 => return Ok(read),
2841                _ => self.done_first = true,
2842            }
2843        }
2844        read += self.second.read_until(byte, buf)?;
2845        Ok(read)
2846    }
2847
2848    // We don't override `read_line` here because an UTF-8 sequence could be
2849    // split between the two parts of the chain
2850}
2851
2852impl<T, U> SizeHint for Chain<T, U> {
2853    #[inline]
2854    fn lower_bound(&self) -> usize {
2855        SizeHint::lower_bound(&self.first) + SizeHint::lower_bound(&self.second)
2856    }
2857
2858    #[inline]
2859    fn upper_bound(&self) -> Option<usize> {
2860        match (SizeHint::upper_bound(&self.first), SizeHint::upper_bound(&self.second)) {
2861            (Some(first), Some(second)) => first.checked_add(second),
2862            _ => None,
2863        }
2864    }
2865}
2866
2867/// Reader adapter which limits the bytes read from an underlying reader.
2868///
2869/// This struct is generally created by calling [`take`] on a reader.
2870/// Please see the documentation of [`take`] for more details.
2871///
2872/// [`take`]: Read::take
2873#[stable(feature = "rust1", since = "1.0.0")]
2874#[derive(Debug)]
2875pub struct Take<T> {
2876    inner: T,
2877    len: u64,
2878    limit: u64,
2879}
2880
2881impl<T> Take<T> {
2882    /// Returns the number of bytes that can be read before this instance will
2883    /// return EOF.
2884    ///
2885    /// # Note
2886    ///
2887    /// This instance may reach `EOF` after reading fewer bytes than indicated by
2888    /// this method if the underlying [`Read`] instance reaches EOF.
2889    ///
2890    /// # Examples
2891    ///
2892    /// ```no_run
2893    /// use std::io;
2894    /// use std::io::prelude::*;
2895    /// use std::fs::File;
2896    ///
2897    /// fn main() -> io::Result<()> {
2898    ///     let f = File::open("foo.txt")?;
2899    ///
2900    ///     // read at most five bytes
2901    ///     let handle = f.take(5);
2902    ///
2903    ///     println!("limit: {}", handle.limit());
2904    ///     Ok(())
2905    /// }
2906    /// ```
2907    #[stable(feature = "rust1", since = "1.0.0")]
2908    pub fn limit(&self) -> u64 {
2909        self.limit
2910    }
2911
2912    /// Returns the number of bytes read so far.
2913    #[unstable(feature = "seek_io_take_position", issue = "97227")]
2914    pub fn position(&self) -> u64 {
2915        self.len - self.limit
2916    }
2917
2918    /// Sets the number of bytes that can be read before this instance will
2919    /// return EOF. This is the same as constructing a new `Take` instance, so
2920    /// the amount of bytes read and the previous limit value don't matter when
2921    /// calling this method.
2922    ///
2923    /// # Examples
2924    ///
2925    /// ```no_run
2926    /// use std::io;
2927    /// use std::io::prelude::*;
2928    /// use std::fs::File;
2929    ///
2930    /// fn main() -> io::Result<()> {
2931    ///     let f = File::open("foo.txt")?;
2932    ///
2933    ///     // read at most five bytes
2934    ///     let mut handle = f.take(5);
2935    ///     handle.set_limit(10);
2936    ///
2937    ///     assert_eq!(handle.limit(), 10);
2938    ///     Ok(())
2939    /// }
2940    /// ```
2941    #[stable(feature = "take_set_limit", since = "1.27.0")]
2942    pub fn set_limit(&mut self, limit: u64) {
2943        self.len = limit;
2944        self.limit = limit;
2945    }
2946
2947    /// Consumes the `Take`, returning the wrapped reader.
2948    ///
2949    /// # Examples
2950    ///
2951    /// ```no_run
2952    /// use std::io;
2953    /// use std::io::prelude::*;
2954    /// use std::fs::File;
2955    ///
2956    /// fn main() -> io::Result<()> {
2957    ///     let mut file = File::open("foo.txt")?;
2958    ///
2959    ///     let mut buffer = [0; 5];
2960    ///     let mut handle = file.take(5);
2961    ///     handle.read(&mut buffer)?;
2962    ///
2963    ///     let file = handle.into_inner();
2964    ///     Ok(())
2965    /// }
2966    /// ```
2967    #[stable(feature = "io_take_into_inner", since = "1.15.0")]
2968    pub fn into_inner(self) -> T {
2969        self.inner
2970    }
2971
2972    /// Gets a reference to the underlying reader.
2973    ///
2974    /// Care should be taken to avoid modifying the internal I/O state of the
2975    /// underlying reader as doing so may corrupt the internal limit of this
2976    /// `Take`.
2977    ///
2978    /// # Examples
2979    ///
2980    /// ```no_run
2981    /// use std::io;
2982    /// use std::io::prelude::*;
2983    /// use std::fs::File;
2984    ///
2985    /// fn main() -> io::Result<()> {
2986    ///     let mut file = File::open("foo.txt")?;
2987    ///
2988    ///     let mut buffer = [0; 5];
2989    ///     let mut handle = file.take(5);
2990    ///     handle.read(&mut buffer)?;
2991    ///
2992    ///     let file = handle.get_ref();
2993    ///     Ok(())
2994    /// }
2995    /// ```
2996    #[stable(feature = "more_io_inner_methods", since = "1.20.0")]
2997    pub fn get_ref(&self) -> &T {
2998        &self.inner
2999    }
3000
3001    /// Gets a mutable reference to the underlying reader.
3002    ///
3003    /// Care should be taken to avoid modifying the internal I/O state of the
3004    /// underlying reader as doing so may corrupt the internal limit of this
3005    /// `Take`.
3006    ///
3007    /// # Examples
3008    ///
3009    /// ```no_run
3010    /// use std::io;
3011    /// use std::io::prelude::*;
3012    /// use std::fs::File;
3013    ///
3014    /// fn main() -> io::Result<()> {
3015    ///     let mut file = File::open("foo.txt")?;
3016    ///
3017    ///     let mut buffer = [0; 5];
3018    ///     let mut handle = file.take(5);
3019    ///     handle.read(&mut buffer)?;
3020    ///
3021    ///     let file = handle.get_mut();
3022    ///     Ok(())
3023    /// }
3024    /// ```
3025    #[stable(feature = "more_io_inner_methods", since = "1.20.0")]
3026    pub fn get_mut(&mut self) -> &mut T {
3027        &mut self.inner
3028    }
3029}
3030
3031#[stable(feature = "rust1", since = "1.0.0")]
3032impl<T: Read> Read for Take<T> {
3033    fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
3034        // Don't call into inner reader at all at EOF because it may still block
3035        if self.limit == 0 {
3036            return Ok(0);
3037        }
3038
3039        let max = cmp::min(buf.len() as u64, self.limit) as usize;
3040        let n = self.inner.read(&mut buf[..max])?;
3041        assert!(n as u64 <= self.limit, "number of read bytes exceeds limit");
3042        self.limit -= n as u64;
3043        Ok(n)
3044    }
3045
3046    fn read_buf(&mut self, mut buf: BorrowedCursor<'_>) -> Result<()> {
3047        // Don't call into inner reader at all at EOF because it may still block
3048        if self.limit == 0 {
3049            return Ok(());
3050        }
3051
3052        if self.limit < buf.capacity() as u64 {
3053            // The condition above guarantees that `self.limit` fits in `usize`.
3054            let limit = self.limit as usize;
3055
3056            let extra_init = cmp::min(limit, buf.init_mut().len());
3057
3058            // SAFETY: no uninit data is written to ibuf
3059            let ibuf = unsafe { &mut buf.as_mut()[..limit] };
3060
3061            let mut sliced_buf: BorrowedBuf<'_> = ibuf.into();
3062
3063            // SAFETY: extra_init bytes of ibuf are known to be initialized
3064            unsafe {
3065                sliced_buf.set_init(extra_init);
3066            }
3067
3068            let mut cursor = sliced_buf.unfilled();
3069            let result = self.inner.read_buf(cursor.reborrow());
3070
3071            let new_init = cursor.init_mut().len();
3072            let filled = sliced_buf.len();
3073
3074            // cursor / sliced_buf / ibuf must drop here
3075
3076            unsafe {
3077                // SAFETY: filled bytes have been filled and therefore initialized
3078                buf.advance_unchecked(filled);
3079                // SAFETY: new_init bytes of buf's unfilled buffer have been initialized
3080                buf.set_init(new_init);
3081            }
3082
3083            self.limit -= filled as u64;
3084
3085            result
3086        } else {
3087            let written = buf.written();
3088            let result = self.inner.read_buf(buf.reborrow());
3089            self.limit -= (buf.written() - written) as u64;
3090            result
3091        }
3092    }
3093}
3094
3095#[stable(feature = "rust1", since = "1.0.0")]
3096impl<T: BufRead> BufRead for Take<T> {
3097    fn fill_buf(&mut self) -> Result<&[u8]> {
3098        // Don't call into inner reader at all at EOF because it may still block
3099        if self.limit == 0 {
3100            return Ok(&[]);
3101        }
3102
3103        let buf = self.inner.fill_buf()?;
3104        let cap = cmp::min(buf.len() as u64, self.limit) as usize;
3105        Ok(&buf[..cap])
3106    }
3107
3108    fn consume(&mut self, amt: usize) {
3109        // Don't let callers reset the limit by passing an overlarge value
3110        let amt = cmp::min(amt as u64, self.limit) as usize;
3111        self.limit -= amt as u64;
3112        self.inner.consume(amt);
3113    }
3114}
3115
3116impl<T> SizeHint for Take<T> {
3117    #[inline]
3118    fn lower_bound(&self) -> usize {
3119        cmp::min(SizeHint::lower_bound(&self.inner) as u64, self.limit) as usize
3120    }
3121
3122    #[inline]
3123    fn upper_bound(&self) -> Option<usize> {
3124        match SizeHint::upper_bound(&self.inner) {
3125            Some(upper_bound) => Some(cmp::min(upper_bound as u64, self.limit) as usize),
3126            None => self.limit.try_into().ok(),
3127        }
3128    }
3129}
3130
3131#[stable(feature = "seek_io_take", since = "1.89.0")]
3132impl<T: Seek> Seek for Take<T> {
3133    fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
3134        let new_position = match pos {
3135            SeekFrom::Start(v) => Some(v),
3136            SeekFrom::Current(v) => self.position().checked_add_signed(v),
3137            SeekFrom::End(v) => self.len.checked_add_signed(v),
3138        };
3139        let new_position = match new_position {
3140            Some(v) if v <= self.len => v,
3141            _ => return Err(ErrorKind::InvalidInput.into()),
3142        };
3143        while new_position != self.position() {
3144            if let Some(offset) = new_position.checked_signed_diff(self.position()) {
3145                self.inner.seek_relative(offset)?;
3146                self.limit = self.limit.wrapping_sub(offset as u64);
3147                break;
3148            }
3149            let offset = if new_position > self.position() { i64::MAX } else { i64::MIN };
3150            self.inner.seek_relative(offset)?;
3151            self.limit = self.limit.wrapping_sub(offset as u64);
3152        }
3153        Ok(new_position)
3154    }
3155
3156    fn stream_len(&mut self) -> Result<u64> {
3157        Ok(self.len)
3158    }
3159
3160    fn stream_position(&mut self) -> Result<u64> {
3161        Ok(self.position())
3162    }
3163
3164    fn seek_relative(&mut self, offset: i64) -> Result<()> {
3165        if !self.position().checked_add_signed(offset).is_some_and(|p| p <= self.len) {
3166            return Err(ErrorKind::InvalidInput.into());
3167        }
3168        self.inner.seek_relative(offset)?;
3169        self.limit = self.limit.wrapping_sub(offset as u64);
3170        Ok(())
3171    }
3172}
3173
3174/// An iterator over `u8` values of a reader.
3175///
3176/// This struct is generally created by calling [`bytes`] on a reader.
3177/// Please see the documentation of [`bytes`] for more details.
3178///
3179/// [`bytes`]: Read::bytes
3180#[stable(feature = "rust1", since = "1.0.0")]
3181#[derive(Debug)]
3182pub struct Bytes<R> {
3183    inner: R,
3184}
3185
3186#[stable(feature = "rust1", since = "1.0.0")]
3187impl<R: Read> Iterator for Bytes<R> {
3188    type Item = Result<u8>;
3189
3190    // Not `#[inline]`. This function gets inlined even without it, but having
3191    // the inline annotation can result in worse code generation. See #116785.
3192    fn next(&mut self) -> Option<Result<u8>> {
3193        SpecReadByte::spec_read_byte(&mut self.inner)
3194    }
3195
3196    #[inline]
3197    fn size_hint(&self) -> (usize, Option<usize>) {
3198        SizeHint::size_hint(&self.inner)
3199    }
3200}
3201
3202/// For the specialization of `Bytes::next`.
3203trait SpecReadByte {
3204    fn spec_read_byte(&mut self) -> Option<Result<u8>>;
3205}
3206
3207impl<R> SpecReadByte for R
3208where
3209    Self: Read,
3210{
3211    #[inline]
3212    default fn spec_read_byte(&mut self) -> Option<Result<u8>> {
3213        inlined_slow_read_byte(self)
3214    }
3215}
3216
3217/// Reads a single byte in a slow, generic way. This is used by the default
3218/// `spec_read_byte`.
3219#[inline]
3220fn inlined_slow_read_byte<R: Read>(reader: &mut R) -> Option<Result<u8>> {
3221    let mut byte = 0;
3222    loop {
3223        return match reader.read(slice::from_mut(&mut byte)) {
3224            Ok(0) => None,
3225            Ok(..) => Some(Ok(byte)),
3226            Err(ref e) if e.is_interrupted() => continue,
3227            Err(e) => Some(Err(e)),
3228        };
3229    }
3230}
3231
3232// Used by `BufReader::spec_read_byte`, for which the `inline(ever)` is
3233// important.
3234#[inline(never)]
3235fn uninlined_slow_read_byte<R: Read>(reader: &mut R) -> Option<Result<u8>> {
3236    inlined_slow_read_byte(reader)
3237}
3238
3239trait SizeHint {
3240    fn lower_bound(&self) -> usize;
3241
3242    fn upper_bound(&self) -> Option<usize>;
3243
3244    fn size_hint(&self) -> (usize, Option<usize>) {
3245        (self.lower_bound(), self.upper_bound())
3246    }
3247}
3248
3249impl<T: ?Sized> SizeHint for T {
3250    #[inline]
3251    default fn lower_bound(&self) -> usize {
3252        0
3253    }
3254
3255    #[inline]
3256    default fn upper_bound(&self) -> Option<usize> {
3257        None
3258    }
3259}
3260
3261impl<T> SizeHint for &mut T {
3262    #[inline]
3263    fn lower_bound(&self) -> usize {
3264        SizeHint::lower_bound(*self)
3265    }
3266
3267    #[inline]
3268    fn upper_bound(&self) -> Option<usize> {
3269        SizeHint::upper_bound(*self)
3270    }
3271}
3272
3273impl<T> SizeHint for Box<T> {
3274    #[inline]
3275    fn lower_bound(&self) -> usize {
3276        SizeHint::lower_bound(&**self)
3277    }
3278
3279    #[inline]
3280    fn upper_bound(&self) -> Option<usize> {
3281        SizeHint::upper_bound(&**self)
3282    }
3283}
3284
3285impl SizeHint for &[u8] {
3286    #[inline]
3287    fn lower_bound(&self) -> usize {
3288        self.len()
3289    }
3290
3291    #[inline]
3292    fn upper_bound(&self) -> Option<usize> {
3293        Some(self.len())
3294    }
3295}
3296
3297/// An iterator over the contents of an instance of `BufRead` split on a
3298/// particular byte.
3299///
3300/// This struct is generally created by calling [`split`] on a `BufRead`.
3301/// Please see the documentation of [`split`] for more details.
3302///
3303/// [`split`]: BufRead::split
3304#[stable(feature = "rust1", since = "1.0.0")]
3305#[derive(Debug)]
3306pub struct Split<B> {
3307    buf: B,
3308    delim: u8,
3309}
3310
3311#[stable(feature = "rust1", since = "1.0.0")]
3312impl<B: BufRead> Iterator for Split<B> {
3313    type Item = Result<Vec<u8>>;
3314
3315    fn next(&mut self) -> Option<Result<Vec<u8>>> {
3316        let mut buf = Vec::new();
3317        match self.buf.read_until(self.delim, &mut buf) {
3318            Ok(0) => None,
3319            Ok(_n) => {
3320                if buf[buf.len() - 1] == self.delim {
3321                    buf.pop();
3322                }
3323                Some(Ok(buf))
3324            }
3325            Err(e) => Some(Err(e)),
3326        }
3327    }
3328}
3329
3330/// An iterator over the lines of an instance of `BufRead`.
3331///
3332/// This struct is generally created by calling [`lines`] on a `BufRead`.
3333/// Please see the documentation of [`lines`] for more details.
3334///
3335/// [`lines`]: BufRead::lines
3336#[stable(feature = "rust1", since = "1.0.0")]
3337#[derive(Debug)]
3338#[cfg_attr(not(test), rustc_diagnostic_item = "IoLines")]
3339pub struct Lines<B> {
3340    buf: B,
3341}
3342
3343#[stable(feature = "rust1", since = "1.0.0")]
3344impl<B: BufRead> Iterator for Lines<B> {
3345    type Item = Result<String>;
3346
3347    fn next(&mut self) -> Option<Result<String>> {
3348        let mut buf = String::new();
3349        match self.buf.read_line(&mut buf) {
3350            Ok(0) => None,
3351            Ok(_n) => {
3352                if buf.ends_with('\n') {
3353                    buf.pop();
3354                    if buf.ends_with('\r') {
3355                        buf.pop();
3356                    }
3357                }
3358                Some(Ok(buf))
3359            }
3360            Err(e) => Some(Err(e)),
3361        }
3362    }
3363}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy