Skip to content

Commit 31ee680

Browse files
authored
Rollup merge of #85802 - Thomasdezeeuw:ioslice-advance, r=m-ou-se
Rename IoSlice(Mut)::advance to advance_slice and add IoSlice(Mut)::advance Also changes the signature of `advance_slice` to accept a `&mut &mut [IoSlice]`, not returning anything. This will better match the `IoSlice::advance` function. Updates #62726.
2 parents 36b9a6e + 5e7a8c6 commit 31ee680

File tree

2 files changed

+81
-30
lines changed

2 files changed

+81
-30
lines changed

library/std/src/io/mod.rs

+63-12
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ mod tests;
253253

254254
use crate::cmp;
255255
use crate::fmt;
256+
use crate::mem::replace;
256257
use crate::ops::{Deref, DerefMut};
257258
use crate::ptr;
258259
use crate::slice;
@@ -1044,6 +1045,32 @@ impl<'a> IoSliceMut<'a> {
10441045

10451046
/// Advance the internal cursor of the slice.
10461047
///
1048+
/// Also see [`IoSliceMut::advance_slices`] to advance the cursors of
1049+
/// multiple buffers.
1050+
///
1051+
/// # Examples
1052+
///
1053+
/// ```
1054+
/// #![feature(io_slice_advance)]
1055+
///
1056+
/// use std::io::IoSliceMut;
1057+
/// use std::ops::Deref;
1058+
///
1059+
/// let mut data = [1; 8];
1060+
/// let mut buf = IoSliceMut::new(&mut data);
1061+
///
1062+
/// // Mark 3 bytes as read.
1063+
/// buf.advance(3);
1064+
/// assert_eq!(buf.deref(), [1; 5].as_ref());
1065+
/// ```
1066+
#[unstable(feature = "io_slice_advance", issue = "62726")]
1067+
#[inline]
1068+
pub fn advance(&mut self, n: usize) {
1069+
self.0.advance(n)
1070+
}
1071+
1072+
/// Advance the internal cursor of the slices.
1073+
///
10471074
/// # Notes
10481075
///
10491076
/// Elements in the slice may be modified if the cursor is not advanced to
@@ -1070,13 +1097,13 @@ impl<'a> IoSliceMut<'a> {
10701097
/// ][..];
10711098
///
10721099
/// // Mark 10 bytes as read.
1073-
/// bufs = IoSliceMut::advance(bufs, 10);
1100+
/// IoSliceMut::advance_slices(&mut bufs, 10);
10741101
/// assert_eq!(bufs[0].deref(), [2; 14].as_ref());
10751102
/// assert_eq!(bufs[1].deref(), [3; 8].as_ref());
10761103
/// ```
10771104
#[unstable(feature = "io_slice_advance", issue = "62726")]
10781105
#[inline]
1079-
pub fn advance<'b>(bufs: &'b mut [IoSliceMut<'a>], n: usize) -> &'b mut [IoSliceMut<'a>] {
1106+
pub fn advance_slices(bufs: &mut &mut [IoSliceMut<'a>], n: usize) {
10801107
// Number of buffers to remove.
10811108
let mut remove = 0;
10821109
// Total length of all the to be removed buffers.
@@ -1090,11 +1117,10 @@ impl<'a> IoSliceMut<'a> {
10901117
}
10911118
}
10921119

1093-
let bufs = &mut bufs[remove..];
1120+
*bufs = &mut replace(bufs, &mut [])[remove..];
10941121
if !bufs.is_empty() {
1095-
bufs[0].0.advance(n - accumulated_len)
1122+
bufs[0].advance(n - accumulated_len)
10961123
}
1097-
bufs
10981124
}
10991125
}
11001126

@@ -1153,6 +1179,32 @@ impl<'a> IoSlice<'a> {
11531179

11541180
/// Advance the internal cursor of the slice.
11551181
///
1182+
/// Also see [`IoSlice::advance_slices`] to advance the cursors of multiple
1183+
/// buffers.
1184+
///
1185+
/// # Examples
1186+
///
1187+
/// ```
1188+
/// #![feature(io_slice_advance)]
1189+
///
1190+
/// use std::io::IoSlice;
1191+
/// use std::ops::Deref;
1192+
///
1193+
/// let mut data = [1; 8];
1194+
/// let mut buf = IoSlice::new(&mut data);
1195+
///
1196+
/// // Mark 3 bytes as read.
1197+
/// buf.advance(3);
1198+
/// assert_eq!(buf.deref(), [1; 5].as_ref());
1199+
/// ```
1200+
#[unstable(feature = "io_slice_advance", issue = "62726")]
1201+
#[inline]
1202+
pub fn advance(&mut self, n: usize) {
1203+
self.0.advance(n)
1204+
}
1205+
1206+
/// Advance the internal cursor of the slices.
1207+
///
11561208
/// # Notes
11571209
///
11581210
/// Elements in the slice may be modified if the cursor is not advanced to
@@ -1179,12 +1231,12 @@ impl<'a> IoSlice<'a> {
11791231
/// ][..];
11801232
///
11811233
/// // Mark 10 bytes as written.
1182-
/// bufs = IoSlice::advance(bufs, 10);
1234+
/// IoSlice::advance_slices(&mut bufs, 10);
11831235
/// assert_eq!(bufs[0].deref(), [2; 14].as_ref());
11841236
/// assert_eq!(bufs[1].deref(), [3; 8].as_ref());
11851237
#[unstable(feature = "io_slice_advance", issue = "62726")]
11861238
#[inline]
1187-
pub fn advance<'b>(bufs: &'b mut [IoSlice<'a>], n: usize) -> &'b mut [IoSlice<'a>] {
1239+
pub fn advance_slices(bufs: &mut &mut [IoSlice<'a>], n: usize) {
11881240
// Number of buffers to remove.
11891241
let mut remove = 0;
11901242
// Total length of all the to be removed buffers.
@@ -1198,11 +1250,10 @@ impl<'a> IoSlice<'a> {
11981250
}
11991251
}
12001252

1201-
let bufs = &mut bufs[remove..];
1253+
*bufs = &mut replace(bufs, &mut [])[remove..];
12021254
if !bufs.is_empty() {
1203-
bufs[0].0.advance(n - accumulated_len)
1255+
bufs[0].advance(n - accumulated_len)
12041256
}
1205-
bufs
12061257
}
12071258
}
12081259

@@ -1511,7 +1562,7 @@ pub trait Write {
15111562
fn write_all_vectored(&mut self, mut bufs: &mut [IoSlice<'_>]) -> Result<()> {
15121563
// Guarantee that bufs is empty if it contains no data,
15131564
// to avoid calling write_vectored if there is no data to be written.
1514-
bufs = IoSlice::advance(bufs, 0);
1565+
IoSlice::advance_slices(&mut bufs, 0);
15151566
while !bufs.is_empty() {
15161567
match self.write_vectored(bufs) {
15171568
Ok(0) => {
@@ -1520,7 +1571,7 @@ pub trait Write {
15201571
&"failed to write whole buffer",
15211572
));
15221573
}
1523-
Ok(n) => bufs = IoSlice::advance(bufs, n),
1574+
Ok(n) => IoSlice::advance_slices(&mut bufs, n),
15241575
Err(ref e) if e.kind() == ErrorKind::Interrupted => {}
15251576
Err(e) => return Err(e),
15261577
}

library/std/src/io/tests.rs

+18-18
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ fn test_read_to_end_capacity() -> io::Result<()> {
353353
}
354354

355355
#[test]
356-
fn io_slice_mut_advance() {
356+
fn io_slice_mut_advance_slices() {
357357
let mut buf1 = [1; 8];
358358
let mut buf2 = [2; 16];
359359
let mut buf3 = [3; 8];
@@ -364,75 +364,75 @@ fn io_slice_mut_advance() {
364364
][..];
365365

366366
// Only in a single buffer..
367-
bufs = IoSliceMut::advance(bufs, 1);
367+
IoSliceMut::advance_slices(&mut bufs, 1);
368368
assert_eq!(bufs[0].deref(), [1; 7].as_ref());
369369
assert_eq!(bufs[1].deref(), [2; 16].as_ref());
370370
assert_eq!(bufs[2].deref(), [3; 8].as_ref());
371371

372372
// Removing a buffer, leaving others as is.
373-
bufs = IoSliceMut::advance(bufs, 7);
373+
IoSliceMut::advance_slices(&mut bufs, 7);
374374
assert_eq!(bufs[0].deref(), [2; 16].as_ref());
375375
assert_eq!(bufs[1].deref(), [3; 8].as_ref());
376376

377377
// Removing a buffer and removing from the next buffer.
378-
bufs = IoSliceMut::advance(bufs, 18);
378+
IoSliceMut::advance_slices(&mut bufs, 18);
379379
assert_eq!(bufs[0].deref(), [3; 6].as_ref());
380380
}
381381

382382
#[test]
383-
fn io_slice_mut_advance_empty_slice() {
384-
let empty_bufs = &mut [][..];
383+
fn io_slice_mut_advance_slices_empty_slice() {
384+
let mut empty_bufs = &mut [][..];
385385
// Shouldn't panic.
386-
IoSliceMut::advance(empty_bufs, 1);
386+
IoSliceMut::advance_slices(&mut empty_bufs, 1);
387387
}
388388

389389
#[test]
390-
fn io_slice_mut_advance_beyond_total_length() {
390+
fn io_slice_mut_advance_slices_beyond_total_length() {
391391
let mut buf1 = [1; 8];
392392
let mut bufs = &mut [IoSliceMut::new(&mut buf1)][..];
393393

394394
// Going beyond the total length should be ok.
395-
bufs = IoSliceMut::advance(bufs, 9);
395+
IoSliceMut::advance_slices(&mut bufs, 9);
396396
assert!(bufs.is_empty());
397397
}
398398

399399
#[test]
400-
fn io_slice_advance() {
400+
fn io_slice_advance_slices() {
401401
let buf1 = [1; 8];
402402
let buf2 = [2; 16];
403403
let buf3 = [3; 8];
404404
let mut bufs = &mut [IoSlice::new(&buf1), IoSlice::new(&buf2), IoSlice::new(&buf3)][..];
405405

406406
// Only in a single buffer..
407-
bufs = IoSlice::advance(bufs, 1);
407+
IoSlice::advance_slices(&mut bufs, 1);
408408
assert_eq!(bufs[0].deref(), [1; 7].as_ref());
409409
assert_eq!(bufs[1].deref(), [2; 16].as_ref());
410410
assert_eq!(bufs[2].deref(), [3; 8].as_ref());
411411

412412
// Removing a buffer, leaving others as is.
413-
bufs = IoSlice::advance(bufs, 7);
413+
IoSlice::advance_slices(&mut bufs, 7);
414414
assert_eq!(bufs[0].deref(), [2; 16].as_ref());
415415
assert_eq!(bufs[1].deref(), [3; 8].as_ref());
416416

417417
// Removing a buffer and removing from the next buffer.
418-
bufs = IoSlice::advance(bufs, 18);
418+
IoSlice::advance_slices(&mut bufs, 18);
419419
assert_eq!(bufs[0].deref(), [3; 6].as_ref());
420420
}
421421

422422
#[test]
423-
fn io_slice_advance_empty_slice() {
424-
let empty_bufs = &mut [][..];
423+
fn io_slice_advance_slices_empty_slice() {
424+
let mut empty_bufs = &mut [][..];
425425
// Shouldn't panic.
426-
IoSlice::advance(empty_bufs, 1);
426+
IoSlice::advance_slices(&mut empty_bufs, 1);
427427
}
428428

429429
#[test]
430-
fn io_slice_advance_beyond_total_length() {
430+
fn io_slice_advance_slices_beyond_total_length() {
431431
let buf1 = [1; 8];
432432
let mut bufs = &mut [IoSlice::new(&buf1)][..];
433433

434434
// Going beyond the total length should be ok.
435-
bufs = IoSlice::advance(bufs, 9);
435+
IoSlice::advance_slices(&mut bufs, 9);
436436
assert!(bufs.is_empty());
437437
}
438438

0 commit comments

Comments
 (0)