diff options
| author | bors <bors@rust-lang.org> | 2022-05-01 06:41:59 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-05-01 06:41:59 +0000 |
| commit | f75d884046e07bb26edeaba9b8c982dc97485fd5 (patch) | |
| tree | ec7af6facaaf19507588491c412d869a524cc789 | |
| parent | 61469b682c2b0bf9cebc4622f1859e2bb3b7ebca (diff) | |
| parent | 100006bec9262a3774bfeb34a7ac5867b422b896 (diff) | |
| download | rust-f75d884046e07bb26edeaba9b8c982dc97485fd5.tar.gz rust-f75d884046e07bb26edeaba9b8c982dc97485fd5.zip | |
Auto merge of #96078 - udoprog:refcounted-str-to-u8, r=dtolnay
Implement str to [u8] conversion for refcounted containers This seems motivated to complete the APIs for shared containers since we already have similar allocation-free conversions for strings like `From<Box<[u8]>> for Box<str>`. Insta-stable since it's a new trait impl?
| -rw-r--r-- | library/alloc/src/rc.rs | 19 | ||||
| -rw-r--r-- | library/alloc/src/sync.rs | 19 |
2 files changed, 38 insertions, 0 deletions
diff --git a/library/alloc/src/rc.rs b/library/alloc/src/rc.rs index a42f1c3b4bb..4bcc78ae0f4 100644 --- a/library/alloc/src/rc.rs +++ b/library/alloc/src/rc.rs @@ -1956,6 +1956,25 @@ where } } +#[stable(feature = "shared_from_str", since = "1.62.0")] +impl From<Rc<str>> for Rc<[u8]> { + /// Converts a reference-counted string slice into a byte slice. + /// + /// # Example + /// + /// ``` + /// # use std::rc::Rc; + /// let string: Rc<str> = Rc::from("eggplant"); + /// let bytes: Rc<[u8]> = Rc::from(string); + /// assert_eq!("eggplant".as_bytes(), bytes.as_ref()); + /// ``` + #[inline] + fn from(rc: Rc<str>) -> Self { + // SAFETY: `str` has the same layout as `[u8]`. + unsafe { Rc::from_raw(Rc::into_raw(rc) as *const [u8]) } + } +} + #[stable(feature = "boxed_slice_try_from", since = "1.43.0")] impl<T, const N: usize> TryFrom<Rc<[T]>> for Rc<[T; N]> { type Error = Rc<[T]>; diff --git a/library/alloc/src/sync.rs b/library/alloc/src/sync.rs index a19999cd725..1e2caddcacb 100644 --- a/library/alloc/src/sync.rs +++ b/library/alloc/src/sync.rs @@ -2556,6 +2556,25 @@ where } } +#[stable(feature = "shared_from_str", since = "1.62.0")] +impl From<Arc<str>> for Arc<[u8]> { + /// Converts an atomically reference-counted string slice into a byte slice. + /// + /// # Example + /// + /// ``` + /// # use std::sync::Arc; + /// let string: Arc<str> = Arc::from("eggplant"); + /// let bytes: Arc<[u8]> = Arc::from(string); + /// assert_eq!("eggplant".as_bytes(), bytes.as_ref()); + /// ``` + #[inline] + fn from(rc: Arc<str>) -> Self { + // SAFETY: `str` has the same layout as `[u8]`. + unsafe { Arc::from_raw(Arc::into_raw(rc) as *const [u8]) } + } +} + #[stable(feature = "boxed_slice_try_from", since = "1.43.0")] impl<T, const N: usize> TryFrom<Arc<[T]>> for Arc<[T; N]> { type Error = Arc<[T]>; |
