about summary refs log tree commit diff
path: root/library/alloc/src
diff options
context:
space:
mode:
authorJohn-John Tedro <udoprog@tedro.se>2022-04-15 14:34:54 +0200
committerJohn-John Tedro <udoprog@tedro.se>2022-04-15 15:38:37 +0200
commit594be707c43f626538ff11b22c35b858c3323cf2 (patch)
treee282c6b29689baf8b26d5b1c535789599f8d0240 /library/alloc/src
parente7575f9670f3c837def3d186ae09366c75c7632e (diff)
downloadrust-594be707c43f626538ff11b22c35b858c3323cf2.tar.gz
rust-594be707c43f626538ff11b22c35b858c3323cf2.zip
Implement str to [u8] conversion for refcounted containers
Diffstat (limited to 'library/alloc/src')
-rw-r--r--library/alloc/src/rc.rs19
-rw-r--r--library/alloc/src/sync.rs19
2 files changed, 38 insertions, 0 deletions
diff --git a/library/alloc/src/rc.rs b/library/alloc/src/rc.rs
index d0d37c08d13..488b74d388e 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.61.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..a8ed31b776b 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.61.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]>;