Rollup merge of #119466 - Sky9x:str_from_raw_parts, r=dtolnay
Initial implementation of `str::from_raw_parts[_mut]` ACP (accepted): rust-lang/libs-team#167 Tracking issue: #119206 Thanks to ``@Kixiron`` for previous work on this (#107207) ``@rustbot`` label +T-libs-api -T-libs r? ``@thomcc`` Closes #107207.
This commit is contained in:
commit
912877d009
@ -30,6 +30,8 @@ pub use core::str::SplitAsciiWhitespace;
|
||||
pub use core::str::SplitInclusive;
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub use core::str::SplitWhitespace;
|
||||
#[unstable(feature = "str_from_raw_parts", issue = "119206")]
|
||||
pub use core::str::{from_raw_parts, from_raw_parts_mut};
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub use core::str::{from_utf8, from_utf8_mut, Bytes, CharIndices, Chars};
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
@ -1,6 +1,6 @@
|
||||
//! Ways to create a `str` from bytes slice.
|
||||
|
||||
use crate::mem;
|
||||
use crate::{mem, ptr};
|
||||
|
||||
use super::validations::run_utf8_validation;
|
||||
use super::Utf8Error;
|
||||
@ -205,3 +205,41 @@ pub const unsafe fn from_utf8_unchecked_mut(v: &mut [u8]) -> &mut str {
|
||||
// comes from a reference which is guaranteed to be valid for writes.
|
||||
unsafe { &mut *(v as *mut [u8] as *mut str) }
|
||||
}
|
||||
|
||||
/// Creates an `&str` from a pointer and a length.
|
||||
///
|
||||
/// The pointed-to bytes must be valid UTF-8.
|
||||
/// If this might not be the case, use `str::from_utf8(slice::from_raw_parts(ptr, len))`,
|
||||
/// which will return an `Err` if the data isn't valid UTF-8.
|
||||
///
|
||||
/// This function is the `str` equivalent of [`slice::from_raw_parts`](crate::slice::from_raw_parts).
|
||||
/// See that function's documentation for safety concerns and examples.
|
||||
///
|
||||
/// The mutable version of this function is [`from_raw_parts_mut`].
|
||||
#[inline]
|
||||
#[must_use]
|
||||
#[unstable(feature = "str_from_raw_parts", issue = "119206")]
|
||||
#[rustc_const_unstable(feature = "str_from_raw_parts", issue = "119206")]
|
||||
pub const unsafe fn from_raw_parts<'a>(ptr: *const u8, len: usize) -> &'a str {
|
||||
// SAFETY: the caller must uphold the safety contract for `from_raw_parts`.
|
||||
unsafe { &*ptr::from_raw_parts(ptr.cast(), len) }
|
||||
}
|
||||
|
||||
/// Creates an `&mut str` from a pointer and a length.
|
||||
///
|
||||
/// The pointed-to bytes must be valid UTF-8.
|
||||
/// If this might not be the case, use `str::from_utf8_mut(slice::from_raw_parts_mut(ptr, len))`,
|
||||
/// which will return an `Err` if the data isn't valid UTF-8.
|
||||
///
|
||||
/// This function is the `str` equivalent of [`slice::from_raw_parts_mut`](crate::slice::from_raw_parts_mut).
|
||||
/// See that function's documentation for safety concerns and examples.
|
||||
///
|
||||
/// The immutable version of this function is [`from_raw_parts`].
|
||||
#[inline]
|
||||
#[must_use]
|
||||
#[unstable(feature = "str_from_raw_parts", issue = "119206")]
|
||||
#[rustc_const_unstable(feature = "const_str_from_raw_parts_mut", issue = "119206")]
|
||||
pub const unsafe fn from_raw_parts_mut<'a>(ptr: *mut u8, len: usize) -> &'a str {
|
||||
// SAFETY: the caller must uphold the safety contract for `from_raw_parts_mut`.
|
||||
unsafe { &mut *ptr::from_raw_parts_mut(ptr.cast(), len) }
|
||||
}
|
||||
|
@ -33,6 +33,9 @@ pub use converts::{from_utf8, from_utf8_unchecked};
|
||||
#[stable(feature = "str_mut_extras", since = "1.20.0")]
|
||||
pub use converts::{from_utf8_mut, from_utf8_unchecked_mut};
|
||||
|
||||
#[unstable(feature = "str_from_raw_parts", issue = "119206")]
|
||||
pub use converts::{from_raw_parts, from_raw_parts_mut};
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub use error::{ParseBoolError, Utf8Error};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user