Auto merge of #122393 - a1phyr:specialize_read_buf_exact, r=joboet · rust-lang/rust@e908cfd (original) (raw)

`@@ -582,6 +582,29 @@ where

`

582

582

`Ok(())

`

583

583

`}

`

584

584

``

``

585

`+

pub(crate) fn default_read_buf_exact<R: Read + ?Sized>(

`

``

586

`+

this: &mut R,

`

``

587

`+

mut cursor: BorrowedCursor<'_>,

`

``

588

`+

) -> Result<()> {

`

``

589

`+

while cursor.capacity() > 0 {

`

``

590

`+

let prev_written = cursor.written();

`

``

591

`+

match this.read_buf(cursor.reborrow()) {

`

``

592

`+

Ok(()) => {}

`

``

593

`+

Err(e) if e.is_interrupted() => continue,

`

``

594

`+

Err(e) => return Err(e),

`

``

595

`+

}

`

``

596

+

``

597

`+

if cursor.written() == prev_written {

`

``

598

`+

return Err(error::const_io_error!(

`

``

599

`+

ErrorKind::UnexpectedEof,

`

``

600

`+

"failed to fill whole buffer"

`

``

601

`+

));

`

``

602

`+

}

`

``

603

`+

}

`

``

604

+

``

605

`+

Ok(())

`

``

606

`+

}

`

``

607

+

585

608

`` /// The Read trait allows for reading bytes from a source.

``

586

609

`///

`

587

610

`` /// Implementors of the Read trait are called 'readers'.

``

`@@ -978,24 +1001,8 @@ pub trait Read {

`

978

1001

`///

`

979

1002

`` /// If this function returns an error, all bytes read will be appended to cursor.

``

980

1003

`#[unstable(feature = "read_buf", issue = "78485")]

`

981

``

`-

fn read_buf_exact(&mut self, mut cursor: BorrowedCursor<'_>) -> Result<()> {

`

982

``

`-

while cursor.capacity() > 0 {

`

983

``

`-

let prev_written = cursor.written();

`

984

``

`-

match self.read_buf(cursor.reborrow()) {

`

985

``

`-

Ok(()) => {}

`

986

``

`-

Err(e) if e.is_interrupted() => continue,

`

987

``

`-

Err(e) => return Err(e),

`

988

``

`-

}

`

989

``

-

990

``

`-

if cursor.written() == prev_written {

`

991

``

`-

return Err(error::const_io_error!(

`

992

``

`-

ErrorKind::UnexpectedEof,

`

993

``

`-

"failed to fill whole buffer"

`

994

``

`-

));

`

995

``

`-

}

`

996

``

`-

}

`

997

``

-

998

``

`-

Ok(())

`

``

1004

`+

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<()> {

`

``

1005

`+

default_read_buf_exact(self, cursor)

`

999

1006

`}

`

1000

1007

``

1001

1008

`` /// Creates a "by reference" adaptor for this instance of Read.

``