From 9f714ef03567d588fbb63c662670fd9326d7348e Mon Sep 17 00:00:00 2001 From: Alan Egerton Date: Sat, 27 Nov 2021 16:40:47 +0000 Subject: Delegate from `map_id` to `try_map_id` --- compiler/rustc_data_structures/src/functor.rs | 63 +++------------------------ compiler/rustc_data_structures/src/lib.rs | 1 + 2 files changed, 7 insertions(+), 57 deletions(-) (limited to 'compiler/rustc_data_structures/src') diff --git a/compiler/rustc_data_structures/src/functor.rs b/compiler/rustc_data_structures/src/functor.rs index d3715a998ce..8f441a1841e 100644 --- a/compiler/rustc_data_structures/src/functor.rs +++ b/compiler/rustc_data_structures/src/functor.rs @@ -5,9 +5,13 @@ use std::ptr; pub trait IdFunctor: Sized { type Inner; - fn map_id(self, f: F) -> Self + #[inline] + fn map_id(self, mut f: F) -> Self where - F: FnMut(Self::Inner) -> Self::Inner; + F: FnMut(Self::Inner) -> Self::Inner, + { + self.try_map_id::<_, !>(|value| Ok(f(value))).into_ok() + } fn try_map_id(self, f: F) -> Result where @@ -17,25 +21,6 @@ pub trait IdFunctor: Sized { impl IdFunctor for Box { type Inner = T; - #[inline] - fn map_id(self, mut f: F) -> Self - where - F: FnMut(Self::Inner) -> Self::Inner, - { - let raw = Box::into_raw(self); - unsafe { - // SAFETY: The raw pointer points to a valid value of type `T`. - let value = ptr::read(raw); - // SAFETY: Converts `Box` to `Box>` which is the - // inverse of `Box::assume_init()` and should be safe. - let mut raw: Box> = Box::from_raw(raw.cast()); - // SAFETY: Write the mapped value back into the `Box`. - raw.write(f(value)); - // SAFETY: We just initialized `raw`. - raw.assume_init() - } - } - #[inline] fn try_map_id(self, mut f: F) -> Result where @@ -59,26 +44,6 @@ impl IdFunctor for Box { impl IdFunctor for Vec { type Inner = T; - #[inline] - fn map_id(mut self, mut f: F) -> Self - where - F: FnMut(Self::Inner) -> Self::Inner, - { - // FIXME: We don't really care about panics here and leak - // far more than we should, but that should be fine for now. - let len = self.len(); - unsafe { - self.set_len(0); - let start = self.as_mut_ptr(); - for i in 0..len { - let p = start.add(i); - ptr::write(p, f(ptr::read(p))); - } - self.set_len(len); - } - self - } - #[inline] fn try_map_id(mut self, mut f: F) -> Result where @@ -119,14 +84,6 @@ impl IdFunctor for Vec { impl IdFunctor for Box<[T]> { type Inner = T; - #[inline] - fn map_id(self, f: F) -> Self - where - F: FnMut(Self::Inner) -> Self::Inner, - { - Vec::from(self).map_id(f).into() - } - #[inline] fn try_map_id(self, f: F) -> Result where @@ -139,14 +96,6 @@ impl IdFunctor for Box<[T]> { impl IdFunctor for IndexVec { type Inner = T; - #[inline] - fn map_id(self, f: F) -> Self - where - F: FnMut(Self::Inner) -> Self::Inner, - { - IndexVec::from_raw(self.raw.map_id(f)) - } - #[inline] fn try_map_id(self, f: F) -> Result where diff --git a/compiler/rustc_data_structures/src/lib.rs b/compiler/rustc_data_structures/src/lib.rs index 77784bf1705..d4eb622e780 100644 --- a/compiler/rustc_data_structures/src/lib.rs +++ b/compiler/rustc_data_structures/src/lib.rs @@ -25,6 +25,7 @@ #![feature(once_cell)] #![feature(test)] #![feature(thread_id_value)] +#![feature(unwrap_infallible)] #![allow(rustc::default_hash_types)] #![deny(unaligned_references)] -- cgit 1.4.1-3-g733a5