| use std::borrow::Borrow; | 
 | use std::ops::Deref; | 
 | use std::sync::Arc; | 
 |  | 
 | /// An owned slice. | 
 | /// | 
 | /// This is similar to `Arc<[u8]>` but allows slicing and using anything as the | 
 | /// backing buffer. | 
 | /// | 
 | /// See [`slice_owned`] for `OwnedSlice` construction and examples. | 
 | /// | 
 | /// --------------------------------------------------------------------------- | 
 | /// | 
 | /// This is essentially a replacement for `owning_ref` which is a lot simpler | 
 | /// and even sound! 🌸 | 
 | #[derive(Clone)] | 
 | pub struct OwnedSlice { | 
 |     /// This is conceptually a `&'self.owner [u8]`. | 
 |     bytes: *const [u8], | 
 |  | 
 |     // +---------------------------------------+ | 
 |     // | We expect `dead_code` lint here,      | | 
 |     // | because we don't want to accidentally | | 
 |     // | touch the owner — otherwise the owner | | 
 |     // | could invalidate out `bytes` pointer  | | 
 |     // |                                       | | 
 |     // | so be quiet                           | | 
 |     // +----+  +-------------------------------+ | 
 |     //       \/ | 
 |     //      ⊂(´・◡・⊂ )∘˚˳° (I am the phantom remnant of #97770) | 
 |     #[expect(dead_code)] | 
 |     owner: Arc<dyn Send + Sync>, | 
 | } | 
 |  | 
 | /// Makes an [`OwnedSlice`] out of an `owner` and a `slicer` function. | 
 | /// | 
 | /// ## Examples | 
 | /// | 
 | /// ```rust | 
 | /// # use rustc_data_structures::owned_slice::{OwnedSlice, slice_owned}; | 
 | /// let vec = vec![1, 2, 3, 4]; | 
 | /// | 
 | /// // Identical to slicing via `&v[1..3]` but produces an owned slice | 
 | /// let slice: OwnedSlice = slice_owned(vec, |v| &v[1..3]); | 
 | /// assert_eq!(&*slice, [2, 3]); | 
 | /// ``` | 
 | /// | 
 | /// ```rust | 
 | /// # use rustc_data_structures::owned_slice::{OwnedSlice, slice_owned}; | 
 | /// # use std::ops::Deref; | 
 | /// let vec = vec![1, 2, 3, 4]; | 
 | /// | 
 | /// // Identical to slicing via `&v[..]` but produces an owned slice | 
 | /// let slice: OwnedSlice = slice_owned(vec, Deref::deref); | 
 | /// assert_eq!(&*slice, [1, 2, 3, 4]); | 
 | /// ``` | 
 | pub fn slice_owned<O, F>(owner: O, slicer: F) -> OwnedSlice | 
 | where | 
 |     O: Send + Sync + 'static, | 
 |     F: FnOnce(&O) -> &[u8], | 
 | { | 
 |     try_slice_owned(owner, |x| Ok::<_, !>(slicer(x))).into_ok() | 
 | } | 
 |  | 
 | /// Makes an [`OwnedSlice`] out of an `owner` and a `slicer` function that can fail. | 
 | /// | 
 | /// See [`slice_owned`] for the infallible version. | 
 | pub fn try_slice_owned<O, F, E>(owner: O, slicer: F) -> Result<OwnedSlice, E> | 
 | where | 
 |     O: Send + Sync + 'static, | 
 |     F: FnOnce(&O) -> Result<&[u8], E>, | 
 | { | 
 |     // We wrap the owner of the bytes in, so it doesn't move. | 
 |     // | 
 |     // Since the owner does not move and we don't access it in any way | 
 |     // before dropping, there is nothing that can invalidate the bytes pointer. | 
 |     // | 
 |     // Thus, "extending" the lifetime of the reference returned from `F` is fine. | 
 |     // We pretend that we pass it a reference that lives as long as the returned slice. | 
 |     // | 
 |     // N.B. the HRTB on the `slicer` is important — without it the caller could provide | 
 |     // a short lived slice, unrelated to the owner. | 
 |  | 
 |     let owner = Arc::new(owner); | 
 |     let bytes = slicer(&*owner)?; | 
 |  | 
 |     Ok(OwnedSlice { bytes, owner }) | 
 | } | 
 |  | 
 | impl OwnedSlice { | 
 |     /// Slice this slice by `slicer`. | 
 |     /// | 
 |     /// # Examples | 
 |     /// | 
 |     /// ```rust | 
 |     /// # use rustc_data_structures::owned_slice::{OwnedSlice, slice_owned}; | 
 |     /// let vec = vec![1, 2, 3, 4]; | 
 |     /// | 
 |     /// // Identical to slicing via `&v[1..3]` but produces an owned slice | 
 |     /// let slice: OwnedSlice = slice_owned(vec, |v| &v[..]); | 
 |     /// assert_eq!(&*slice, [1, 2, 3, 4]); | 
 |     /// | 
 |     /// let slice = slice.slice(|slice| &slice[1..][..2]); | 
 |     /// assert_eq!(&*slice, [2, 3]); | 
 |     /// ``` | 
 |     /// | 
 |     pub fn slice(self, slicer: impl FnOnce(&[u8]) -> &[u8]) -> OwnedSlice { | 
 |         // This is basically identical to `try_slice_owned`, | 
 |         // `slicer` can only return slices of its argument or some static data, | 
 |         // both of which are valid while `owner` is alive. | 
 |  | 
 |         let bytes = slicer(&self); | 
 |         OwnedSlice { bytes, ..self } | 
 |     } | 
 | } | 
 |  | 
 | impl Deref for OwnedSlice { | 
 |     type Target = [u8]; | 
 |  | 
 |     #[inline] | 
 |     fn deref(&self) -> &[u8] { | 
 |         // Safety: | 
 |         // `self.bytes` is valid per the construction in `slice_owned` | 
 |         // (which is the only constructor) | 
 |         unsafe { &*self.bytes } | 
 |     } | 
 | } | 
 |  | 
 | impl Borrow<[u8]> for OwnedSlice { | 
 |     #[inline] | 
 |     fn borrow(&self) -> &[u8] { | 
 |         self | 
 |     } | 
 | } | 
 |  | 
 | // Safety: `OwnedSlice` is conceptually `(&'self.1 [u8], Arc<dyn Send + Sync>)`, which is `Send` | 
 | unsafe impl Send for OwnedSlice {} | 
 |  | 
 | // Safety: `OwnedSlice` is conceptually `(&'self.1 [u8], Arc<dyn Send + Sync>)`, which is `Sync` | 
 | unsafe impl Sync for OwnedSlice {} | 
 |  | 
 | #[cfg(test)] | 
 | mod tests; |