Rollup merge of #132039 - a1phyr:vecdeque_read_exact, r=Noratrieb · qinheping/verify-rust-std@e62b2cc (original) (raw)
`@@ -453,6 +453,29 @@ impl<A: Allocator> Read for VecDeque<u8, A> {
`
453
453
`Ok(n)
`
454
454
`}
`
455
455
``
``
456
`+
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
`
``
457
`+
let (front, back) = self.as_slices();
`
``
458
+
``
459
`` +
// Use only the front buffer if it is big enough to fill buf
, else use
``
``
460
`+
// the back buffer too.
`
``
461
`+
match buf.split_at_mut_checked(front.len()) {
`
``
462
`+
None => buf.copy_from_slice(&front[..buf.len()]),
`
``
463
`+
Some((buf_front, buf_back)) => match back.split_at_checked(buf_back.len()) {
`
``
464
`+
Some((back, _)) => {
`
``
465
`+
buf_front.copy_from_slice(front);
`
``
466
`+
buf_back.copy_from_slice(back);
`
``
467
`+
}
`
``
468
`+
None => {
`
``
469
`+
self.clear();
`
``
470
`+
return Err(io::Error::READ_EXACT_EOF);
`
``
471
`+
}
`
``
472
`+
},
`
``
473
`+
}
`
``
474
+
``
475
`+
self.drain(..buf.len());
`
``
476
`+
Ok(())
`
``
477
`+
}
`
``
478
+
456
479
`#[inline]
`
457
480
`fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> io::Result<()> {
`
458
481
`let (ref mut front, _) = self.as_slices();
`
`@@ -462,6 +485,29 @@ impl<A: Allocator> Read for VecDeque<u8, A> {
`
462
485
`Ok(())
`
463
486
`}
`
464
487
``
``
488
`+
fn read_buf_exact(&mut self, mut cursor: BorrowedCursor<'_>) -> io::Result<()> {
`
``
489
`+
let len = cursor.capacity();
`
``
490
`+
let (front, back) = self.as_slices();
`
``
491
+
``
492
`+
match front.split_at_checked(cursor.capacity()) {
`
``
493
`+
Some((front, _)) => cursor.append(front),
`
``
494
`+
None => {
`
``
495
`+
cursor.append(front);
`
``
496
`+
match back.split_at_checked(cursor.capacity()) {
`
``
497
`+
Some((back, _)) => cursor.append(back),
`
``
498
`+
None => {
`
``
499
`+
cursor.append(back);
`
``
500
`+
self.clear();
`
``
501
`+
return Err(io::Error::READ_EXACT_EOF);
`
``
502
`+
}
`
``
503
`+
}
`
``
504
`+
}
`
``
505
`+
}
`
``
506
+
``
507
`+
self.drain(..len);
`
``
508
`+
Ok(())
`
``
509
`+
}
`
``
510
+
465
511
`#[inline]
`
466
512
`fn read_to_end(&mut self, buf: &mut Vec) -> io::Result {
`
467
513
`// The total len is known upfront so we can reserve it in a single call.
`