@@ -946,7 +946,8 @@ impl<T, A: Allocator> Vec<T, A> {
946
946
/// ```
947
947
#[ inline]
948
948
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
949
- pub fn capacity ( & self ) -> usize {
949
+ #[ rustc_const_unstable( feature = "const_vec_string_slice" ) ]
950
+ pub const fn capacity ( & self ) -> usize {
950
951
self . buf . capacity ( )
951
952
}
952
953
@@ -1253,37 +1254,8 @@ impl<T, A: Allocator> Vec<T, A> {
1253
1254
/// ```
1254
1255
#[ inline]
1255
1256
#[ stable( feature = "vec_as_slice" , since = "1.7.0" ) ]
1256
- pub fn as_slice ( & self ) -> & [ T ] {
1257
- self . as_slice_const ( )
1258
- }
1259
-
1260
- /// Extracts a slice containing the entire vector.
1261
- ///
1262
- /// # Examples
1263
- ///
1264
- /// ```
1265
- /// # use std::borrow::Cow;
1266
- /// // `Deref`, `AsRef`, and `as_slice` are not available in `const` contexts, so this doesn't otherwise work.
1267
- /// const fn cow_slice<'c, 's>(c: &Cow<'s, [u8]>) -> &'c [u8]
1268
- /// where 's: 'c {
1269
- /// match c {
1270
- /// Cow::Borrowed(s) => s,
1271
- /// Cow::Owned(s) => s.as_slice_const(),
1272
- /// }
1273
- /// }
1274
- ///
1275
- /// const VEC: Cow<'static, [u8]> = Cow::Owned(Vec::new());
1276
- /// const SLICE: Cow<'static, [u8]> = Cow::Borrowed(b"foo");
1277
- ///
1278
- /// const SLICED_VEC: &'static [u8] = cow_slice(&VEC);
1279
- /// const SLICED_SLICE: &'static [u8] = cow_slice(&SLICE);
1280
- ///
1281
- /// assert_eq!(SLICED_VEC, b"");
1282
- /// assert_eq!(SLICED_SLICE, b"foo");
1283
- /// ```
1284
- #[ inline]
1285
- #[ unstable( feature = "const_vec_string_slice" , issue = "none" ) ]
1286
- pub const fn as_slice_const ( & self ) -> & [ T ] {
1257
+ #[ rustc_const_unstable( feature = "const_vec_string_slice" ) ]
1258
+ pub const fn as_slice ( & self ) -> & [ T ] {
1287
1259
unsafe { slice:: from_raw_parts ( self . as_ptr_const ( ) , self . len ) }
1288
1260
}
1289
1261
@@ -1356,76 +1328,15 @@ impl<T, A: Allocator> Vec<T, A> {
1356
1328
/// [`as_mut_ptr`]: Vec::as_mut_ptr
1357
1329
/// [`as_ptr`]: Vec::as_ptr
1358
1330
#[ stable( feature = "vec_as_ptr" , since = "1.37.0" ) ]
1331
+ #[ rustc_const_unstable( feature = "const_vec_string_slice" ) ]
1359
1332
#[ rustc_never_returns_null_ptr]
1360
1333
#[ inline]
1361
- pub fn as_ptr ( & self ) -> * const T {
1334
+ pub const fn as_ptr ( & self ) -> * const T {
1362
1335
// We shadow the slice method of the same name to avoid going through
1363
1336
// `deref`, which creates an intermediate reference.
1364
1337
self . buf . ptr ( )
1365
1338
}
1366
1339
1367
- /// Returns a raw pointer to the vector's buffer, or a dangling raw pointer
1368
- /// valid for zero sized reads if the vector didn't allocate.
1369
- ///
1370
- /// This is a `const` version of [`as_ptr`].
1371
- ///
1372
- /// The caller must ensure that the vector outlives the pointer this
1373
- /// function returns, or else it will end up pointing to garbage.
1374
- /// Modifying the vector may cause its buffer to be reallocated,
1375
- /// which would also make any pointers to it invalid.
1376
- ///
1377
- /// The caller must also ensure that the memory the pointer (non-transitively) points to
1378
- /// is never written to (except inside an `UnsafeCell`) using this pointer or any pointer
1379
- /// derived from it. If you need to mutate the contents of the slice, use [`as_mut_ptr`].
1380
- ///
1381
- /// This method guarantees that for the purpose of the aliasing model, this method
1382
- /// does not materialize a reference to the underlying slice, and thus the returned pointer
1383
- /// will remain valid when mixed with other calls to [`as_ptr`] and [`as_mut_ptr`].
1384
- /// Note that calling other methods that materialize mutable references to the slice,
1385
- /// or mutable references to specific elements you are planning on accessing through this pointer,
1386
- /// as well as writing to those elements, may still invalidate this pointer.
1387
- /// See the second example below for how this guarantee can be used.
1388
- ///
1389
- ///
1390
- /// # Examples
1391
- ///
1392
- /// ```
1393
- /// let x = vec![1, 2, 4];
1394
- /// let x_ptr = x.as_ptr_const();
1395
- ///
1396
- /// unsafe {
1397
- /// for i in 0..x.len() {
1398
- /// assert_eq!(*x_ptr.add(i), 1 << i);
1399
- /// }
1400
- /// }
1401
- /// ```
1402
- ///
1403
- /// Due to the aliasing guarantee, the following code is legal:
1404
- ///
1405
- /// ```rust
1406
- /// unsafe {
1407
- /// let mut v = vec![0, 1, 2];
1408
- /// let ptr1 = v.as_ptr_const();
1409
- /// let _ = ptr1.read();
1410
- /// let ptr2 = v.as_mut_ptr().offset(2);
1411
- /// ptr2.write(2);
1412
- /// // Notably, the write to `ptr2` did *not* invalidate `ptr1`
1413
- /// // because it mutated a different element:
1414
- /// let _ = ptr1.read();
1415
- /// }
1416
- /// ```
1417
- ///
1418
- /// [`as_mut_ptr`]: Vec::as_mut_ptr
1419
- /// [`as_ptr_const`]: Vec::as_ptr
1420
- #[ rustc_never_returns_null_ptr]
1421
- #[ unstable( feature = "const_vec_string_slice" , issue = "none" ) ]
1422
- #[ inline]
1423
- pub const fn as_ptr_const ( & self ) -> * const T {
1424
- // We shadow the slice method of the same name to avoid going through
1425
- // `deref`, which creates an intermediate reference.
1426
- self . buf . ptr_const ( )
1427
- }
1428
-
1429
1340
/// Returns an unsafe mutable pointer to the vector's buffer, or a dangling
1430
1341
/// raw pointer valid for zero sized reads if the vector didn't allocate.
1431
1342
///
@@ -2354,8 +2265,9 @@ impl<T, A: Allocator> Vec<T, A> {
2354
2265
/// ```
2355
2266
#[ inline]
2356
2267
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2268
+ #[ rustc_const_unstable( feature = "const_vec_string_slice" ) ]
2357
2269
#[ rustc_confusables( "length" , "size" ) ]
2358
- pub fn len ( & self ) -> usize {
2270
+ pub const fn len ( & self ) -> usize {
2359
2271
self . len
2360
2272
}
2361
2273
@@ -2371,7 +2283,8 @@ impl<T, A: Allocator> Vec<T, A> {
2371
2283
/// assert!(!v.is_empty());
2372
2284
/// ```
2373
2285
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2374
- pub fn is_empty ( & self ) -> bool {
2286
+ #[ rustc_const_unstable( feature = "const_vec_string_slice" ) ]
2287
+ pub const fn is_empty ( & self ) -> bool {
2375
2288
self . len ( ) == 0
2376
2289
}
2377
2290
0 commit comments