Rollup merge of #129329 - eduardosm:rc-from-mut-slice, r=dtolnay
Implement `From<&mut {slice}>` for `Box/Rc/Arc<{slice}>` ACP: https://github.com/rust-lang/libs-team/issues/424 New API: ```rust impl<T: Clone> From<&mut [T]> for Box<[T]> impl From<&mut str> for Box<str> impl From<&mut CStr> for Box<CStr> impl From<&mut OsStr> for Box<OsStr> impl From<&mut Path> for Box<Path> impl<T: Clone> From<&mut [T]> for Rc<[T]> impl From<&mut str> for Rc<str> impl From<&mut CStr> for Rc<CStr> impl From<&mut OsStr> for Rc<OsStr> impl From<&mut Path> for Rc<Path> impl<T: Clone> From<&mut [T]> for Arc<[T]> impl From<&mut str> for Arc<str> impl From<&mut CStr> for Arc<CStr> impl From<&mut OsStr> for Arc<OsStr> impl From<&mut Path> for Arc<Path> ``` Since they are trait implementations, I think these are insta-stable. As mentioned in https://github.com/rust-lang/libs-team/issues/424#issuecomment-2299415749, a crater run might be needed.
This commit is contained in:
commit
957f6c3973
@ -109,6 +109,29 @@ fn from(slice: &[T]) -> Box<[T]> {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "box_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl<T: Clone> From<&mut [T]> for Box<[T]> {
|
||||
/// Converts a `&mut [T]` into a `Box<[T]>`
|
||||
///
|
||||
/// This conversion allocates on the heap
|
||||
/// and performs a copy of `slice` and its contents.
|
||||
///
|
||||
/// # Examples
|
||||
/// ```rust
|
||||
/// // create a &mut [u8] which will be used to create a Box<[u8]>
|
||||
/// let mut array = [104, 101, 108, 108, 111];
|
||||
/// let slice: &mut [u8] = &mut array;
|
||||
/// let boxed_slice: Box<[u8]> = Box::from(slice);
|
||||
///
|
||||
/// println!("{boxed_slice:?}");
|
||||
/// ```
|
||||
#[inline]
|
||||
fn from(slice: &mut [T]) -> Box<[T]> {
|
||||
Self::from(&*slice)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "box_from_cow", since = "1.45.0")]
|
||||
impl<T: Clone> From<Cow<'_, [T]>> for Box<[T]> {
|
||||
@ -147,6 +170,28 @@ fn from(s: &str) -> Box<str> {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "box_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut str> for Box<str> {
|
||||
/// Converts a `&mut str` into a `Box<str>`
|
||||
///
|
||||
/// This conversion allocates on the heap
|
||||
/// and performs a copy of `s`.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust
|
||||
/// let mut original = String::from("hello");
|
||||
/// let original: &mut str = &mut original;
|
||||
/// let boxed: Box<str> = Box::from(original);
|
||||
/// println!("{boxed}");
|
||||
/// ```
|
||||
#[inline]
|
||||
fn from(s: &mut str) -> Box<str> {
|
||||
Self::from(&*s)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "box_from_cow", since = "1.45.0")]
|
||||
impl From<Cow<'_, str>> for Box<str> {
|
||||
|
@ -772,6 +772,16 @@ fn from(s: &CStr) -> Box<CStr> {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[stable(feature = "box_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut CStr> for Box<CStr> {
|
||||
/// Converts a `&mut CStr` into a `Box<CStr>`,
|
||||
/// by copying the contents into a newly allocated [`Box`].
|
||||
fn from(s: &mut CStr) -> Box<CStr> {
|
||||
Self::from(&*s)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "box_from_cow", since = "1.45.0")]
|
||||
impl From<Cow<'_, CStr>> for Box<CStr> {
|
||||
/// Converts a `Cow<'a, CStr>` into a `Box<CStr>`,
|
||||
@ -910,6 +920,17 @@ fn from(s: &CStr) -> Arc<CStr> {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_has_atomic = "ptr")]
|
||||
#[stable(feature = "shared_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut CStr> for Arc<CStr> {
|
||||
/// Converts a `&mut CStr` into a `Arc<CStr>`,
|
||||
/// by copying the contents into a newly allocated [`Arc`].
|
||||
#[inline]
|
||||
fn from(s: &mut CStr) -> Arc<CStr> {
|
||||
Arc::from(&*s)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "shared_from_slice2", since = "1.24.0")]
|
||||
impl From<CString> for Rc<CStr> {
|
||||
/// Converts a [`CString`] into an <code>[Rc]<[CStr]></code> by moving the [`CString`]
|
||||
@ -932,6 +953,16 @@ fn from(s: &CStr) -> Rc<CStr> {
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "shared_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut CStr> for Rc<CStr> {
|
||||
/// Converts a `&mut CStr` into a `Rc<CStr>`,
|
||||
/// by copying the contents into a newly allocated [`Rc`].
|
||||
#[inline]
|
||||
fn from(s: &mut CStr) -> Rc<CStr> {
|
||||
Rc::from(&*s)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "more_rc_default_impls", since = "1.80.0")]
|
||||
impl Default for Rc<CStr> {
|
||||
|
@ -2657,6 +2657,26 @@ fn from(v: &[T]) -> Rc<[T]> {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "shared_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl<T: Clone> From<&mut [T]> for Rc<[T]> {
|
||||
/// Allocates a reference-counted slice and fills it by cloning `v`'s items.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// # use std::rc::Rc;
|
||||
/// let mut original = [1, 2, 3];
|
||||
/// let original: &mut [i32] = &mut original;
|
||||
/// let shared: Rc<[i32]> = Rc::from(original);
|
||||
/// assert_eq!(&[1, 2, 3], &shared[..]);
|
||||
/// ```
|
||||
#[inline]
|
||||
fn from(v: &mut [T]) -> Rc<[T]> {
|
||||
Rc::from(&*v)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "shared_from_slice", since = "1.21.0")]
|
||||
impl From<&str> for Rc<str> {
|
||||
@ -2676,6 +2696,26 @@ fn from(v: &str) -> Rc<str> {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "shared_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut str> for Rc<str> {
|
||||
/// Allocates a reference-counted string slice and copies `v` into it.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// # use std::rc::Rc;
|
||||
/// let mut original = String::from("statue");
|
||||
/// let original: &mut str = &mut original;
|
||||
/// let shared: Rc<str> = Rc::from(original);
|
||||
/// assert_eq!("statue", &shared[..]);
|
||||
/// ```
|
||||
#[inline]
|
||||
fn from(v: &mut str) -> Rc<str> {
|
||||
Rc::from(&*v)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "shared_from_slice", since = "1.21.0")]
|
||||
impl From<String> for Rc<str> {
|
||||
|
@ -3614,6 +3614,26 @@ fn from(v: &[T]) -> Arc<[T]> {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "shared_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl<T: Clone> From<&mut [T]> for Arc<[T]> {
|
||||
/// Allocates a reference-counted slice and fills it by cloning `v`'s items.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// # use std::sync::Arc;
|
||||
/// let mut original = [1, 2, 3];
|
||||
/// let original: &mut [i32] = &mut original;
|
||||
/// let shared: Arc<[i32]> = Arc::from(original);
|
||||
/// assert_eq!(&[1, 2, 3], &shared[..]);
|
||||
/// ```
|
||||
#[inline]
|
||||
fn from(v: &mut [T]) -> Arc<[T]> {
|
||||
Arc::from(&*v)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "shared_from_slice", since = "1.21.0")]
|
||||
impl From<&str> for Arc<str> {
|
||||
@ -3633,6 +3653,26 @@ fn from(v: &str) -> Arc<str> {
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "shared_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut str> for Arc<str> {
|
||||
/// Allocates a reference-counted `str` and copies `v` into it.
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// # use std::sync::Arc;
|
||||
/// let mut original = String::from("eggplant");
|
||||
/// let original: &mut str = &mut original;
|
||||
/// let shared: Arc<str> = Arc::from(original);
|
||||
/// assert_eq!("eggplant", &shared[..]);
|
||||
/// ```
|
||||
#[inline]
|
||||
fn from(v: &mut str) -> Arc<str> {
|
||||
Arc::from(&*v)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(no_global_oom_handling))]
|
||||
#[stable(feature = "shared_from_slice", since = "1.21.0")]
|
||||
impl From<String> for Arc<str> {
|
||||
|
@ -1225,6 +1225,15 @@ fn from(s: &OsStr) -> Box<OsStr> {
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "box_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut OsStr> for Box<OsStr> {
|
||||
/// Copies the string into a newly allocated <code>[Box]<[OsStr]></code>.
|
||||
#[inline]
|
||||
fn from(s: &mut OsStr) -> Box<OsStr> {
|
||||
Self::from(&*s)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "box_from_cow", since = "1.45.0")]
|
||||
impl From<Cow<'_, OsStr>> for Box<OsStr> {
|
||||
/// Converts a `Cow<'a, OsStr>` into a <code>[Box]<[OsStr]></code>,
|
||||
@ -1296,6 +1305,15 @@ fn from(s: &OsStr) -> Arc<OsStr> {
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "shared_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut OsStr> for Arc<OsStr> {
|
||||
/// Copies the string into a newly allocated <code>[Arc]<[OsStr]></code>.
|
||||
#[inline]
|
||||
fn from(s: &mut OsStr) -> Arc<OsStr> {
|
||||
Arc::from(&*s)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "shared_from_slice2", since = "1.24.0")]
|
||||
impl From<OsString> for Rc<OsStr> {
|
||||
/// Converts an [`OsString`] into an <code>[Rc]<[OsStr]></code> by moving the [`OsString`]
|
||||
@ -1317,6 +1335,15 @@ fn from(s: &OsStr) -> Rc<OsStr> {
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "shared_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut OsStr> for Rc<OsStr> {
|
||||
/// Copies the string into a newly allocated <code>[Rc]<[OsStr]></code>.
|
||||
#[inline]
|
||||
fn from(s: &mut OsStr) -> Rc<OsStr> {
|
||||
Rc::from(&*s)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "cow_from_osstr", since = "1.28.0")]
|
||||
impl<'a> From<OsString> for Cow<'a, OsStr> {
|
||||
/// Moves the string into a [`Cow::Owned`].
|
||||
|
@ -1762,6 +1762,16 @@ fn from(path: &Path) -> Box<Path> {
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "box_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut Path> for Box<Path> {
|
||||
/// Creates a boxed [`Path`] from a reference.
|
||||
///
|
||||
/// This will allocate and clone `path` to it.
|
||||
fn from(path: &mut Path) -> Box<Path> {
|
||||
Self::from(&*path)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "box_from_cow", since = "1.45.0")]
|
||||
impl From<Cow<'_, Path>> for Box<Path> {
|
||||
/// Creates a boxed [`Path`] from a clone-on-write pointer.
|
||||
@ -1990,6 +2000,15 @@ fn from(s: &Path) -> Arc<Path> {
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "shared_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut Path> for Arc<Path> {
|
||||
/// Converts a [`Path`] into an [`Arc`] by copying the [`Path`] data into a new [`Arc`] buffer.
|
||||
#[inline]
|
||||
fn from(s: &mut Path) -> Arc<Path> {
|
||||
Arc::from(&*s)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "shared_from_slice2", since = "1.24.0")]
|
||||
impl From<PathBuf> for Rc<Path> {
|
||||
/// Converts a [`PathBuf`] into an <code>[Rc]<[Path]></code> by moving the [`PathBuf`] data into
|
||||
@ -2011,6 +2030,15 @@ fn from(s: &Path) -> Rc<Path> {
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "shared_from_mut_slice", since = "CURRENT_RUSTC_VERSION")]
|
||||
impl From<&mut Path> for Rc<Path> {
|
||||
/// Converts a [`Path`] into an [`Rc`] by copying the [`Path`] data into a new [`Rc`] buffer.
|
||||
#[inline]
|
||||
fn from(s: &mut Path) -> Rc<Path> {
|
||||
Rc::from(&*s)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl ToOwned for Path {
|
||||
type Owned = PathBuf;
|
||||
|
Loading…
Reference in New Issue
Block a user