| 49 | // Use non-generic function to avoid monomorphization. |
| 50 | #[inline(never)] |
| 51 | fn inner(me: &mut Registry, type_id: TypeId, create: fn() -> ErasedBox) -> *mut () { |
| 52 | // Use sorted Vec + binary search because we expect fewer insertions than lookups. |
| 53 | // We could use a HashMap, but that seems like overkill. |
| 54 | match me.0.binary_search_by_key(&type_id, |(k, _)| *k) { |
| 55 | Ok(i) => me.0[i].1.ptr, |
| 56 | Err(i) => { |
| 57 | #[cold] |
| 58 | #[inline(never)] |
| 59 | fn cold( |
| 60 | me: &mut Registry, |
| 61 | i: usize, |
| 62 | type_id: TypeId, |
| 63 | create: fn() -> ErasedBox, |
| 64 | ) -> *mut () { |
| 65 | me.0.insert(i, (type_id, create())); |
| 66 | me.0[i].1.ptr |
| 67 | } |
| 68 | cold(me, i, type_id, create) |
| 69 | } |
| 70 | } |
| 71 | } |
| 72 | let erased_ptr = inner(self, non_static_type_id::<T>(), || { |
| 73 | // Safety: Caller upholds any lifetime requirements. |
| 74 | ErasedBox::new(T::default()) |