Skip to content

Commit f1a74be

Browse files
committed
liballoc/{String,Vec}: constify existing functions instead
1 parent 09dfd2e commit f1a74be

File tree

3 files changed

+24
-144
lines changed

3 files changed

+24
-144
lines changed

library/alloc/src/raw_vec.rs

+2-10
Original file line numberDiff line numberDiff line change
@@ -273,15 +273,7 @@ impl<T, A: Allocator> RawVec<T, A> {
273273
/// `Unique::dangling()` if `capacity == 0` or `T` is zero-sized. In the former case, you must
274274
/// be careful.
275275
#[inline]
276-
pub fn ptr(&self) -> *mut T {
277-
self.ptr.as_ptr()
278-
}
279-
280-
/// Gets a const raw pointer to the start of the allocation. Note that this is
281-
/// `Unique::dangling()` if `capacity == 0` or `T` is zero-sized. In the former case, you must
282-
/// be careful.
283-
#[inline]
284-
pub const fn ptr_const(&self) -> *mut T {
276+
pub const fn ptr(&self) -> *mut T {
285277
self.ptr.as_ptr()
286278
}
287279

@@ -294,7 +286,7 @@ impl<T, A: Allocator> RawVec<T, A> {
294286
///
295287
/// This will always be `usize::MAX` if `T` is zero-sized.
296288
#[inline(always)]
297-
pub fn capacity(&self) -> usize {
289+
pub const fn capacity(&self) -> usize {
298290
if T::IS_ZST { usize::MAX } else { self.cap.0 }
299291
}
300292

library/alloc/src/string.rs

+12-37
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,8 @@ impl String {
10061006
#[inline]
10071007
#[must_use = "`self` will be dropped if the result is not used"]
10081008
#[stable(feature = "rust1", since = "1.0.0")]
1009-
pub fn into_bytes(self) -> Vec<u8> {
1009+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
1010+
pub const fn into_bytes(self) -> Vec<u8> {
10101011
self.vec
10111012
}
10121013

@@ -1022,38 +1023,8 @@ impl String {
10221023
#[inline]
10231024
#[must_use]
10241025
#[stable(feature = "string_as_str", since = "1.7.0")]
1025-
pub fn as_str(&self) -> &str {
1026-
self.as_str_const()
1027-
}
1028-
1029-
/// Extracts a const string slice containing the entire `String`.
1030-
///
1031-
/// # Examples
1032-
///
1033-
/// ```
1034-
/// # use std::borrow::Cow;
1035-
/// // `Deref`, `AsRef`, and `as_str` are not available in `const` contexts, so this doesn't otherwise work.
1036-
/// const fn cow_str<'c, 's>(c: &Cow<'s, str>) -> &'c str
1037-
/// where 's: 'c {
1038-
/// match c {
1039-
/// Cow::Borrowed(s) => s,
1040-
/// Cow::Owned(s) => s.as_str_const(),
1041-
/// }
1042-
/// }
1043-
///
1044-
/// const STRING: Cow<'static, str> = Cow::Owned(String::new());
1045-
/// const STR: Cow<'static, str> = Cow::Borrowed("foo");
1046-
///
1047-
/// const SLICED_STRING: &'static str = cow_str(&STRING);
1048-
/// const SLICED_STR: &'static str = cow_str(&STR);
1049-
///
1050-
/// assert_eq!(SLICED_STRING, "");
1051-
/// assert_eq!(SLICED_STR, "foo");
1052-
/// ```
1053-
#[inline]
1054-
#[must_use]
1055-
#[unstable(feature = "const_vec_string_slice", issue = "none")]
1056-
pub const fn as_str_const(&self) -> &str {
1026+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
1027+
pub const fn as_str(&self) -> &str {
10571028
unsafe { str::from_utf8_unchecked(self.vec.as_slice_const()) }
10581029
}
10591030

@@ -1143,7 +1114,8 @@ impl String {
11431114
#[inline]
11441115
#[must_use]
11451116
#[stable(feature = "rust1", since = "1.0.0")]
1146-
pub fn capacity(&self) -> usize {
1117+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
1118+
pub const fn capacity(&self) -> usize {
11471119
self.vec.capacity()
11481120
}
11491121

@@ -1406,7 +1378,8 @@ impl String {
14061378
#[inline]
14071379
#[must_use]
14081380
#[stable(feature = "rust1", since = "1.0.0")]
1409-
pub fn as_bytes(&self) -> &[u8] {
1381+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
1382+
pub const fn as_bytes(&self) -> &[u8] {
14101383
&self.vec
14111384
}
14121385

@@ -1779,8 +1752,9 @@ impl String {
17791752
#[inline]
17801753
#[must_use]
17811754
#[stable(feature = "rust1", since = "1.0.0")]
1755+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
17821756
#[rustc_confusables("length", "size")]
1783-
pub fn len(&self) -> usize {
1757+
pub const fn len(&self) -> usize {
17841758
self.vec.len()
17851759
}
17861760

@@ -1798,7 +1772,8 @@ impl String {
17981772
#[inline]
17991773
#[must_use]
18001774
#[stable(feature = "rust1", since = "1.0.0")]
1801-
pub fn is_empty(&self) -> bool {
1775+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
1776+
pub const fn is_empty(&self) -> bool {
18021777
self.len() == 0
18031778
}
18041779

library/alloc/src/vec/mod.rs

+10-97
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,8 @@ impl<T, A: Allocator> Vec<T, A> {
944944
/// ```
945945
#[inline]
946946
#[stable(feature = "rust1", since = "1.0.0")]
947-
pub fn capacity(&self) -> usize {
947+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
948+
pub const fn capacity(&self) -> usize {
948949
self.buf.capacity()
949950
}
950951

@@ -1251,37 +1252,8 @@ impl<T, A: Allocator> Vec<T, A> {
12511252
/// ```
12521253
#[inline]
12531254
#[stable(feature = "vec_as_slice", since = "1.7.0")]
1254-
pub fn as_slice(&self) -> &[T] {
1255-
self.as_slice_const()
1256-
}
1257-
1258-
/// Extracts a slice containing the entire vector.
1259-
///
1260-
/// # Examples
1261-
///
1262-
/// ```
1263-
/// # use std::borrow::Cow;
1264-
/// // `Deref`, `AsRef`, and `as_slice` are not available in `const` contexts, so this doesn't otherwise work.
1265-
/// const fn cow_slice<'c, 's>(c: &Cow<'s, [u8]>) -> &'c [u8]
1266-
/// where 's: 'c {
1267-
/// match c {
1268-
/// Cow::Borrowed(s) => s,
1269-
/// Cow::Owned(s) => s.as_slice_const(),
1270-
/// }
1271-
/// }
1272-
///
1273-
/// const VEC: Cow<'static, [u8]> = Cow::Owned(Vec::new());
1274-
/// const SLICE: Cow<'static, [u8]> = Cow::Borrowed(b"foo");
1275-
///
1276-
/// const SLICED_VEC: &'static [u8] = cow_slice(&VEC);
1277-
/// const SLICED_SLICE: &'static [u8] = cow_slice(&SLICE);
1278-
///
1279-
/// assert_eq!(SLICED_VEC, b"");
1280-
/// assert_eq!(SLICED_SLICE, b"foo");
1281-
/// ```
1282-
#[inline]
1283-
#[unstable(feature = "const_vec_string_slice", issue = "none")]
1284-
pub const fn as_slice_const(&self) -> &[T] {
1255+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
1256+
pub const fn as_slice(&self) -> &[T] {
12851257
unsafe { slice::from_raw_parts(self.as_ptr_const(), self.len) }
12861258
}
12871259

@@ -1354,76 +1326,15 @@ impl<T, A: Allocator> Vec<T, A> {
13541326
/// [`as_mut_ptr`]: Vec::as_mut_ptr
13551327
/// [`as_ptr`]: Vec::as_ptr
13561328
#[stable(feature = "vec_as_ptr", since = "1.37.0")]
1329+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
13571330
#[rustc_never_returns_null_ptr]
13581331
#[inline]
1359-
pub fn as_ptr(&self) -> *const T {
1332+
pub const fn as_ptr(&self) -> *const T {
13601333
// We shadow the slice method of the same name to avoid going through
13611334
// `deref`, which creates an intermediate reference.
13621335
self.buf.ptr()
13631336
}
13641337

1365-
/// Returns a raw pointer to the vector's buffer, or a dangling raw pointer
1366-
/// valid for zero sized reads if the vector didn't allocate.
1367-
///
1368-
/// This is a `const` version of [`as_ptr`].
1369-
///
1370-
/// The caller must ensure that the vector outlives the pointer this
1371-
/// function returns, or else it will end up pointing to garbage.
1372-
/// Modifying the vector may cause its buffer to be reallocated,
1373-
/// which would also make any pointers to it invalid.
1374-
///
1375-
/// The caller must also ensure that the memory the pointer (non-transitively) points to
1376-
/// is never written to (except inside an `UnsafeCell`) using this pointer or any pointer
1377-
/// derived from it. If you need to mutate the contents of the slice, use [`as_mut_ptr`].
1378-
///
1379-
/// This method guarantees that for the purpose of the aliasing model, this method
1380-
/// does not materialize a reference to the underlying slice, and thus the returned pointer
1381-
/// will remain valid when mixed with other calls to [`as_ptr`] and [`as_mut_ptr`].
1382-
/// Note that calling other methods that materialize mutable references to the slice,
1383-
/// or mutable references to specific elements you are planning on accessing through this pointer,
1384-
/// as well as writing to those elements, may still invalidate this pointer.
1385-
/// See the second example below for how this guarantee can be used.
1386-
///
1387-
///
1388-
/// # Examples
1389-
///
1390-
/// ```
1391-
/// let x = vec![1, 2, 4];
1392-
/// let x_ptr = x.as_ptr_const();
1393-
///
1394-
/// unsafe {
1395-
/// for i in 0..x.len() {
1396-
/// assert_eq!(*x_ptr.add(i), 1 << i);
1397-
/// }
1398-
/// }
1399-
/// ```
1400-
///
1401-
/// Due to the aliasing guarantee, the following code is legal:
1402-
///
1403-
/// ```rust
1404-
/// unsafe {
1405-
/// let mut v = vec![0, 1, 2];
1406-
/// let ptr1 = v.as_ptr_const();
1407-
/// let _ = ptr1.read();
1408-
/// let ptr2 = v.as_mut_ptr().offset(2);
1409-
/// ptr2.write(2);
1410-
/// // Notably, the write to `ptr2` did *not* invalidate `ptr1`
1411-
/// // because it mutated a different element:
1412-
/// let _ = ptr1.read();
1413-
/// }
1414-
/// ```
1415-
///
1416-
/// [`as_mut_ptr`]: Vec::as_mut_ptr
1417-
/// [`as_ptr_const`]: Vec::as_ptr
1418-
#[rustc_never_returns_null_ptr]
1419-
#[unstable(feature = "const_vec_string_slice", issue = "none")]
1420-
#[inline]
1421-
pub const fn as_ptr_const(&self) -> *const T {
1422-
// We shadow the slice method of the same name to avoid going through
1423-
// `deref`, which creates an intermediate reference.
1424-
self.buf.ptr_const()
1425-
}
1426-
14271338
/// Returns an unsafe mutable pointer to the vector's buffer, or a dangling
14281339
/// raw pointer valid for zero sized reads if the vector didn't allocate.
14291340
///
@@ -2352,8 +2263,9 @@ impl<T, A: Allocator> Vec<T, A> {
23522263
/// ```
23532264
#[inline]
23542265
#[stable(feature = "rust1", since = "1.0.0")]
2266+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
23552267
#[rustc_confusables("length", "size")]
2356-
pub fn len(&self) -> usize {
2268+
pub const fn len(&self) -> usize {
23572269
self.len
23582270
}
23592271

@@ -2369,7 +2281,8 @@ impl<T, A: Allocator> Vec<T, A> {
23692281
/// assert!(!v.is_empty());
23702282
/// ```
23712283
#[stable(feature = "rust1", since = "1.0.0")]
2372-
pub fn is_empty(&self) -> bool {
2284+
#[rustc_const_unstable(feature = "const_vec_string_slice")]
2285+
pub const fn is_empty(&self) -> bool {
23732286
self.len() == 0
23742287
}
23752288

0 commit comments

Comments
 (0)