Skip to content

Commit 310d3b4

Browse files
authored
Rollup merge of #144090 - thaliaarchi:io-slice-const, r=tgross35
Make `IoSlice` and `IoSliceMut` methods unstably const This enables constructing `IoSlice` and `IoSliceMut` in const contexts without users needing to break the platform abstraction by doing the cast themselves. This is useful for statics. Since all current and plausible future platforms use simple slice-like structs, this should not impose a burden when adding a new platform with a different struct.
2 parents 34f954f + 3cf5b88 commit 310d3b4

File tree

5 files changed

+32
-28
lines changed

5 files changed

+32
-28
lines changed

library/std/src/io/mod.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,8 +1338,9 @@ impl<'a> IoSliceMut<'a> {
13381338
///
13391339
/// Panics on Windows if the slice is larger than 4GB.
13401340
#[stable(feature = "iovec", since = "1.36.0")]
1341+
#[rustc_const_unstable(feature = "io_slice_const", issue = "146459")]
13411342
#[inline]
1342-
pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
1343+
pub const fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
13431344
IoSliceMut(sys::io::IoSliceMut::new(buf))
13441345
}
13451346

@@ -1366,8 +1367,9 @@ impl<'a> IoSliceMut<'a> {
13661367
/// assert_eq!(buf.deref(), [1; 5].as_ref());
13671368
/// ```
13681369
#[stable(feature = "io_slice_advance", since = "1.81.0")]
1370+
#[rustc_const_unstable(feature = "io_slice_const", issue = "146459")]
13691371
#[inline]
1370-
pub fn advance(&mut self, n: usize) {
1372+
pub const fn advance(&mut self, n: usize) {
13711373
self.0.advance(n)
13721374
}
13731375

@@ -1496,9 +1498,10 @@ impl<'a> IoSlice<'a> {
14961498
///
14971499
/// Panics on Windows if the slice is larger than 4GB.
14981500
#[stable(feature = "iovec", since = "1.36.0")]
1501+
#[rustc_const_unstable(feature = "io_slice_const", issue = "146459")]
14991502
#[must_use]
15001503
#[inline]
1501-
pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
1504+
pub const fn new(buf: &'a [u8]) -> IoSlice<'a> {
15021505
IoSlice(sys::io::IoSlice::new(buf))
15031506
}
15041507

@@ -1525,8 +1528,9 @@ impl<'a> IoSlice<'a> {
15251528
/// assert_eq!(buf.deref(), [1; 5].as_ref());
15261529
/// ```
15271530
#[stable(feature = "io_slice_advance", since = "1.81.0")]
1531+
#[rustc_const_unstable(feature = "io_slice_const", issue = "146459")]
15281532
#[inline]
1529-
pub fn advance(&mut self, n: usize) {
1533+
pub const fn advance(&mut self, n: usize) {
15301534
self.0.advance(n)
15311535
}
15321536

library/std/src/sys/io/io_slice/iovec.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,15 @@ pub struct IoSlice<'a> {
1818

1919
impl<'a> IoSlice<'a> {
2020
#[inline]
21-
pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
21+
pub const fn new(buf: &'a [u8]) -> IoSlice<'a> {
2222
IoSlice {
2323
vec: iovec { iov_base: buf.as_ptr() as *mut u8 as *mut c_void, iov_len: buf.len() },
2424
_p: PhantomData,
2525
}
2626
}
2727

2828
#[inline]
29-
pub fn advance(&mut self, n: usize) {
29+
pub const fn advance(&mut self, n: usize) {
3030
if self.vec.iov_len < n {
3131
panic!("advancing IoSlice beyond its length");
3232
}
@@ -51,15 +51,15 @@ pub struct IoSliceMut<'a> {
5151

5252
impl<'a> IoSliceMut<'a> {
5353
#[inline]
54-
pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
54+
pub const fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
5555
IoSliceMut {
5656
vec: iovec { iov_base: buf.as_mut_ptr() as *mut c_void, iov_len: buf.len() },
5757
_p: PhantomData,
5858
}
5959
}
6060

6161
#[inline]
62-
pub fn advance(&mut self, n: usize) {
62+
pub const fn advance(&mut self, n: usize) {
6363
if self.vec.iov_len < n {
6464
panic!("advancing IoSliceMut beyond its length");
6565
}
@@ -71,7 +71,7 @@ impl<'a> IoSliceMut<'a> {
7171
}
7272

7373
#[inline]
74-
pub fn as_slice(&self) -> &[u8] {
74+
pub const fn as_slice(&self) -> &[u8] {
7575
unsafe { slice::from_raw_parts(self.vec.iov_base as *mut u8, self.vec.iov_len) }
7676
}
7777

@@ -81,7 +81,7 @@ impl<'a> IoSliceMut<'a> {
8181
}
8282

8383
#[inline]
84-
pub fn as_mut_slice(&mut self) -> &mut [u8] {
84+
pub const fn as_mut_slice(&mut self) -> &mut [u8] {
8585
unsafe { slice::from_raw_parts_mut(self.vec.iov_base as *mut u8, self.vec.iov_len) }
8686
}
8787
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ pub struct IoSlice<'a>(&'a [u8]);
55

66
impl<'a> IoSlice<'a> {
77
#[inline]
8-
pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
8+
pub const fn new(buf: &'a [u8]) -> IoSlice<'a> {
99
IoSlice(buf)
1010
}
1111

1212
#[inline]
13-
pub fn advance(&mut self, n: usize) {
13+
pub const fn advance(&mut self, n: usize) {
1414
self.0 = &self.0[n..]
1515
}
1616

@@ -24,19 +24,19 @@ pub struct IoSliceMut<'a>(&'a mut [u8]);
2424

2525
impl<'a> IoSliceMut<'a> {
2626
#[inline]
27-
pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
27+
pub const fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
2828
IoSliceMut(buf)
2929
}
3030

3131
#[inline]
32-
pub fn advance(&mut self, n: usize) {
32+
pub const fn advance(&mut self, n: usize) {
3333
let slice = mem::take(&mut self.0);
3434
let (_, remaining) = slice.split_at_mut(n);
3535
self.0 = remaining;
3636
}
3737

3838
#[inline]
39-
pub fn as_slice(&self) -> &[u8] {
39+
pub const fn as_slice(&self) -> &[u8] {
4040
self.0
4141
}
4242

@@ -46,7 +46,7 @@ impl<'a> IoSliceMut<'a> {
4646
}
4747

4848
#[inline]
49-
pub fn as_mut_slice(&mut self) -> &mut [u8] {
49+
pub const fn as_mut_slice(&mut self) -> &mut [u8] {
5050
self.0
5151
}
5252
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ pub struct IoSlice<'a> {
1010

1111
impl<'a> IoSlice<'a> {
1212
#[inline]
13-
pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
13+
pub const fn new(buf: &'a [u8]) -> IoSlice<'a> {
1414
IoSlice { vec: wasi::Ciovec { buf: buf.as_ptr(), buf_len: buf.len() }, _p: PhantomData }
1515
}
1616

1717
#[inline]
18-
pub fn advance(&mut self, n: usize) {
18+
pub const fn advance(&mut self, n: usize) {
1919
if self.vec.buf_len < n {
2020
panic!("advancing IoSlice beyond its length");
2121
}
@@ -40,15 +40,15 @@ pub struct IoSliceMut<'a> {
4040

4141
impl<'a> IoSliceMut<'a> {
4242
#[inline]
43-
pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
43+
pub const fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
4444
IoSliceMut {
4545
vec: wasi::Iovec { buf: buf.as_mut_ptr(), buf_len: buf.len() },
4646
_p: PhantomData,
4747
}
4848
}
4949

5050
#[inline]
51-
pub fn advance(&mut self, n: usize) {
51+
pub const fn advance(&mut self, n: usize) {
5252
if self.vec.buf_len < n {
5353
panic!("advancing IoSlice beyond its length");
5454
}
@@ -60,7 +60,7 @@ impl<'a> IoSliceMut<'a> {
6060
}
6161

6262
#[inline]
63-
pub fn as_slice(&self) -> &[u8] {
63+
pub const fn as_slice(&self) -> &[u8] {
6464
unsafe { slice::from_raw_parts(self.vec.buf as *const u8, self.vec.buf_len) }
6565
}
6666

@@ -70,7 +70,7 @@ impl<'a> IoSliceMut<'a> {
7070
}
7171

7272
#[inline]
73-
pub fn as_mut_slice(&mut self) -> &mut [u8] {
73+
pub const fn as_mut_slice(&mut self) -> &mut [u8] {
7474
unsafe { slice::from_raw_parts_mut(self.vec.buf as *mut u8, self.vec.buf_len) }
7575
}
7676
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub struct IoSlice<'a> {
1111

1212
impl<'a> IoSlice<'a> {
1313
#[inline]
14-
pub fn new(buf: &'a [u8]) -> IoSlice<'a> {
14+
pub const fn new(buf: &'a [u8]) -> IoSlice<'a> {
1515
assert!(buf.len() <= u32::MAX as usize);
1616
IoSlice {
1717
vec: c::WSABUF { len: buf.len() as u32, buf: buf.as_ptr() as *mut u8 },
@@ -20,7 +20,7 @@ impl<'a> IoSlice<'a> {
2020
}
2121

2222
#[inline]
23-
pub fn advance(&mut self, n: usize) {
23+
pub const fn advance(&mut self, n: usize) {
2424
if (self.vec.len as usize) < n {
2525
panic!("advancing IoSlice beyond its length");
2626
}
@@ -45,7 +45,7 @@ pub struct IoSliceMut<'a> {
4545

4646
impl<'a> IoSliceMut<'a> {
4747
#[inline]
48-
pub fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
48+
pub const fn new(buf: &'a mut [u8]) -> IoSliceMut<'a> {
4949
assert!(buf.len() <= u32::MAX as usize);
5050
IoSliceMut {
5151
vec: c::WSABUF { len: buf.len() as u32, buf: buf.as_mut_ptr() },
@@ -54,7 +54,7 @@ impl<'a> IoSliceMut<'a> {
5454
}
5555

5656
#[inline]
57-
pub fn advance(&mut self, n: usize) {
57+
pub const fn advance(&mut self, n: usize) {
5858
if (self.vec.len as usize) < n {
5959
panic!("advancing IoSliceMut beyond its length");
6060
}
@@ -66,7 +66,7 @@ impl<'a> IoSliceMut<'a> {
6666
}
6767

6868
#[inline]
69-
pub fn as_slice(&self) -> &[u8] {
69+
pub const fn as_slice(&self) -> &[u8] {
7070
unsafe { slice::from_raw_parts(self.vec.buf, self.vec.len as usize) }
7171
}
7272

@@ -76,7 +76,7 @@ impl<'a> IoSliceMut<'a> {
7676
}
7777

7878
#[inline]
79-
pub fn as_mut_slice(&mut self) -> &mut [u8] {
79+
pub const fn as_mut_slice(&mut self) -> &mut [u8] {
8080
unsafe { slice::from_raw_parts_mut(self.vec.buf, self.vec.len as usize) }
8181
}
8282
}

0 commit comments

Comments
 (0)