Skip to content

Commit 163fbc9

Browse files
committed
Auto merge of rust-lang#132790 - aDotInTheVoid:ioslice-asslice-rides-again, r=<try>
Add as_slice/into_slice for IoSlice/IoSliceMut. ACP: rust-lang/libs-team#93 Based on a623c52 (CC `@mpdn)` and rust-lang#111277 (CC `@Lucretiel).` Closes: rust-lang#124659 Tracking Issue: TODO try-job: test-various try-job: dist-various-1 try-job: dist-various-2 r? `@ghost`
2 parents 4b198d6 + 4a86fd2 commit 163fbc9

File tree

8 files changed

+95
-6
lines changed

8 files changed

+95
-6
lines changed

library/std/src/io/mod.rs

+45
Original file line numberDiff line numberDiff line change
@@ -1340,6 +1340,25 @@ impl<'a> IoSliceMut<'a> {
13401340
bufs[0].advance(left);
13411341
}
13421342
}
1343+
1344+
/// Get the underlying bytes as a mutable slice with the original lifetime.
1345+
///
1346+
/// # Examples
1347+
///
1348+
/// ```
1349+
/// #![feature(io_slice_as_bytes)]
1350+
/// use std::io::IoSliceMut;
1351+
///
1352+
/// let mut data = *b"abcdef";
1353+
/// let io_slice = IoSliceMut::new(&mut data);
1354+
/// io_slice.into_slice()[0] = b'A';
1355+
///
1356+
/// assert_eq!(&data, b"Abcdef");
1357+
/// ```
1358+
#[unstable(feature = "io_slice_as_bytes", issue = "111277")]
1359+
pub const fn into_slice(self) -> &'a mut [u8] {
1360+
self.0.into_slice()
1361+
}
13431362
}
13441363

13451364
#[stable(feature = "iovec", since = "1.36.0")]
@@ -1482,6 +1501,32 @@ impl<'a> IoSlice<'a> {
14821501
bufs[0].advance(left);
14831502
}
14841503
}
1504+
1505+
/// Get the underlying bytes as a slice with the original lifetime.
1506+
///
1507+
/// This doesn't borrow from `self`, so is less restrictive than calling
1508+
/// `.deref()`, which does.
1509+
///
1510+
/// # Examples
1511+
///
1512+
/// ```
1513+
/// #![feature(io_slice_as_bytes)]
1514+
/// use std::io::IoSlice;
1515+
///
1516+
/// let data = b"abcdef";
1517+
///
1518+
/// let mut io_slice = IoSlice::new(data);
1519+
/// let tail = &io_slice.as_slice()[3..];
1520+
///
1521+
/// // This works because `tail` doesn't borrow `io_slice`
1522+
/// io_slice = IoSlice::new(tail);
1523+
///
1524+
/// assert_eq!(io_slice.as_slice(), b"def");
1525+
/// ```
1526+
#[unstable(feature = "io_slice_as_bytes", issue = "111277")]
1527+
pub const fn as_slice(self) -> &'a [u8] {
1528+
self.0.as_slice()
1529+
}
14851530
}
14861531

14871532
#[stable(feature = "iovec", since = "1.36.0")]

library/std/src/io/tests.rs

+14
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,20 @@ fn io_slice_advance_slices_beyond_total_length() {
531531
assert!(bufs.is_empty());
532532
}
533533

534+
#[test]
535+
fn io_slice_as_slice() {
536+
let buf = [1; 8];
537+
let slice = IoSlice::new(&buf).as_slice();
538+
assert_eq!(slice, buf);
539+
}
540+
541+
#[test]
542+
fn io_slice_into_slice() {
543+
let mut buf = [1; 8];
544+
let slice = IoSliceMut::new(&mut buf).into_slice();
545+
assert_eq!(slice, [1; 8]);
546+
}
547+
534548
/// Creates a new writer that reads from at most `n_bufs` and reads
535549
/// `per_call` bytes (in total) per call to write.
536550
fn test_writer(n_bufs: usize, per_call: usize) -> TestWriter {

library/std/src/sys/pal/hermit/io.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ impl<'a> IoSlice<'a> {
3333
}
3434

3535
#[inline]
36-
pub fn as_slice(&self) -> &[u8] {
36+
pub const fn as_slice(&self) -> &'a [u8] {
3737
unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
3838
}
3939
}
@@ -70,6 +70,11 @@ impl<'a> IoSliceMut<'a> {
7070
unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
7171
}
7272

73+
#[inline]
74+
pub const fn into_slice(self) -> &'a mut [u8] {
75+
unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }
76+
}
77+
7378
#[inline]
7479
pub fn as_mut_slice(&mut self) -> &mut [u8] {
7580
unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }

library/std/src/sys/pal/solid/io.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ impl<'a> IoSlice<'a> {
3333
}
3434

3535
#[inline]
36-
pub fn as_slice(&self) -> &[u8] {
36+
pub const fn as_slice(&self) -> &'a [u8] {
3737
unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
3838
}
3939
}
@@ -70,6 +70,11 @@ impl<'a> IoSliceMut<'a> {
7070
unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
7171
}
7272

73+
#[inline]
74+
pub const fn into_slice(self) -> &'a mut [u8] {
75+
unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }
76+
}
77+
7378
#[inline]
7479
pub fn as_mut_slice(&mut self) -> &mut [u8] {
7580
unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }

library/std/src/sys/pal/unix/io.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ impl<'a> IoSlice<'a> {
3333
}
3434

3535
#[inline]
36-
pub fn as_slice(&self) -> &[u8] {
36+
pub const fn as_slice(&self) -> &'a [u8] {
3737
unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
3838
}
3939
}
@@ -70,6 +70,11 @@ impl<'a> IoSliceMut<'a> {
7070
unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
7171
}
7272

73+
#[inline]
74+
pub const fn into_slice(self) -> &'a mut [u8] {
75+
unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }
76+
}
77+
7378
#[inline]
7479
pub fn as_mut_slice(&mut self) -> &mut [u8] {
7580
unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }

library/std/src/sys/pal/unsupported/io.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ impl<'a> IoSlice<'a> {
1515
}
1616

1717
#[inline]
18-
pub fn as_slice(&self) -> &[u8] {
18+
pub const fn as_slice(&self) -> &'a [u8] {
1919
self.0
2020
}
2121
}
@@ -40,6 +40,11 @@ impl<'a> IoSliceMut<'a> {
4040
self.0
4141
}
4242

43+
#[inline]
44+
pub const fn into_slice(self) -> &'a mut [u8] {
45+
self.0
46+
}
47+
4348
#[inline]
4449
pub fn as_mut_slice(&mut self) -> &mut [u8] {
4550
self.0

library/std/src/sys/pal/wasi/io.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl<'a> IoSlice<'a> {
3030
}
3131

3232
#[inline]
33-
pub fn as_slice(&self) -> &[u8] {
33+
pub const fn as_slice(&self) -> &'a [u8] {
3434
unsafe { slice::from_raw_parts(self.vec.buf as *const u8, self.vec.buf_len) }
3535
}
3636
}
@@ -67,6 +67,11 @@ impl<'a> IoSliceMut<'a> {
6767
unsafe { slice::from_raw_parts(self.vec.buf as *const u8, self.vec.buf_len) }
6868
}
6969

70+
#[inline]
71+
pub const fn into_slice(self) -> &'a mut [u8] {
72+
unsafe { slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.buf_len) }
73+
}
74+
7075
#[inline]
7176
pub fn as_mut_slice(&mut self) -> &mut [u8] {
7277
unsafe { slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.buf_len) }

library/std/src/sys/pal/windows/io.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl<'a> IoSlice<'a> {
3636
}
3737

3838
#[inline]
39-
pub fn as_slice(&self) -> &[u8] {
39+
pub const fn as_slice(&self) -> &'a [u8] {
4040
unsafe { slice::from_raw_parts(self.vec.buf, self.vec.len as usize) }
4141
}
4242
}
@@ -74,6 +74,11 @@ impl<'a> IoSliceMut<'a> {
7474
unsafe { slice::from_raw_parts(self.vec.buf, self.vec.len as usize) }
7575
}
7676

77+
#[inline]
78+
pub const fn into_slice(self) -> &'a mut [u8] {
79+
unsafe { slice::from_raw_parts_mut(self.vec.buf, self.vec.len as usize) }
80+
}
81+
7782
#[inline]
7883
pub fn as_mut_slice(&mut self) -> &mut [u8] {
7984
unsafe { slice::from_raw_parts_mut(self.vec.buf, self.vec.len as usize) }

0 commit comments

Comments
 (0)