diff options
| author | bors <bors@rust-lang.org> | 2024-01-26 10:20:59 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-01-26 10:20:59 +0000 |
| commit | 1fc46f3a8f12622c077f533da9e6dc3c227bbbb2 (patch) | |
| tree | 4d2ab1d6171682ea1b2b1bc8adc7181e2e2b1d7a /library/core/src | |
| parent | 69db514ed9238bb11f5d2c576fe26020e3b99a52 (diff) | |
| parent | ee2a2a3f31662d09e821b9a86151650d607550a6 (diff) | |
| download | rust-1fc46f3a8f12622c077f533da9e6dc3c227bbbb2.tar.gz rust-1fc46f3a8f12622c077f533da9e6dc3c227bbbb2.zip | |
Auto merge of #120365 - matthiaskrgr:rollup-ly2w0d5, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - #107464 (Add `str::Lines::remainder`) - #118803 (Add the `min_exhaustive_patterns` feature gate) - #119466 (Initial implementation of `str::from_raw_parts[_mut]`) - #120053 (Specialize `Bytes` on `StdinLock<'_>`) - #120124 (Split assembly tests for ELF and MachO) - #120204 (Builtin macros effectively have implicit #[collapse_debuginfo(yes)]) - #120322 (Don't manually resolve async closures in `rustc_resolve`) - #120356 (Fix broken markdown in csky-unknown-linux-gnuabiv2.md) r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'library/core/src')
| -rw-r--r-- | library/core/src/str/converts.rs | 40 | ||||
| -rw-r--r-- | library/core/src/str/iter.rs | 25 | ||||
| -rw-r--r-- | library/core/src/str/mod.rs | 3 |
3 files changed, 67 insertions, 1 deletions
diff --git a/library/core/src/str/converts.rs b/library/core/src/str/converts.rs index 0f23cf7ae23..ba282f09d20 100644 --- a/library/core/src/str/converts.rs +++ b/library/core/src/str/converts.rs @@ -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) } +} diff --git a/library/core/src/str/iter.rs b/library/core/src/str/iter.rs index dd2efb00516..4d6239e11a3 100644 --- a/library/core/src/str/iter.rs +++ b/library/core/src/str/iter.rs @@ -1187,6 +1187,31 @@ impl<'a> DoubleEndedIterator for Lines<'a> { #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for Lines<'_> {} +impl<'a> Lines<'a> { + /// Returns the remaining lines of the split string. + /// + /// # Examples + /// + /// ``` + /// #![feature(str_lines_remainder)] + /// + /// let mut lines = "a\nb\nc\nd".lines(); + /// assert_eq!(lines.remainder(), Some("a\nb\nc\nd")); + /// + /// lines.next(); + /// assert_eq!(lines.remainder(), Some("b\nc\nd")); + /// + /// lines.by_ref().for_each(drop); + /// assert_eq!(lines.remainder(), None); + /// ``` + #[inline] + #[must_use] + #[unstable(feature = "str_lines_remainder", issue = "77998")] + pub fn remainder(&self) -> Option<&'a str> { + self.0.iter.remainder() + } +} + /// Created with the method [`lines_any`]. /// /// [`lines_any`]: str::lines_any diff --git a/library/core/src/str/mod.rs b/library/core/src/str/mod.rs index 80c5fe0de8d..ecc0613d7b9 100644 --- a/library/core/src/str/mod.rs +++ b/library/core/src/str/mod.rs @@ -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}; |
