use std::{any::TypeId, ptr::NonNull};
use rustc_hash::FxHashMap;
use crate::{ExtractionMetadata, extractable::ExtractableType};
pub struct Extractor {
pub(crate) offsets: FxHashMap<TypeId, usize>,
pub(crate) dropper: unsafe fn(NonNull<u8>),
}
impl Extractor {
pub(crate) fn new_type(target: &ExtractableType) -> Self {
Self {
offsets: ExtractionMetadata::flatten(target.metadata),
dropper: target.dropper,
}
}
#[inline(always)]
pub(crate) unsafe fn extract_ptr<T: 'static>(&self, data: NonNull<u8>) -> Option<NonNull<T>> {
let type_id = const { TypeId::of::<T>() };
let offset = self.offsets.get(&type_id)?;
Some(unsafe { data.add(*offset).cast::<T>() })
}
}