single-threaded interior mutably wrapper for internpool
This commit is contained in:
parent
f5fc8195f4
commit
8c95a2ba3d
|
@ -402,6 +402,73 @@ impl Index {
|
|||
}
|
||||
}
|
||||
|
||||
pub struct InternPoolWrapper(core::cell::UnsafeCell<InternPool>);
|
||||
|
||||
impl InternPoolWrapper {
|
||||
pub fn as_mut(&self) -> &mut InternPool {
|
||||
unsafe { &mut *self.0.get() }
|
||||
}
|
||||
pub fn as_ref(&self) -> &InternPool {
|
||||
unsafe { &*self.0.get() }
|
||||
}
|
||||
|
||||
pub fn new() -> Self {
|
||||
InternPool::new().into()
|
||||
}
|
||||
}
|
||||
|
||||
impl From<InternPool> for InternPoolWrapper {
|
||||
fn from(value: InternPool) -> Self {
|
||||
Self(core::cell::UnsafeCell::new(value))
|
||||
}
|
||||
}
|
||||
|
||||
impl core::ops::Deref for InternPoolWrapper {
|
||||
type Target = InternPool;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
unsafe { &*self.0.get() }
|
||||
}
|
||||
}
|
||||
|
||||
impl core::ops::DerefMut for InternPoolWrapper {
|
||||
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||
self.as_mut()
|
||||
}
|
||||
}
|
||||
|
||||
impl AsRef<InternPool> for InternPoolWrapper {
|
||||
fn as_ref(&self) -> &InternPool {
|
||||
Self::as_ref(self)
|
||||
}
|
||||
}
|
||||
|
||||
impl AsRef<InternPool> for InternPool {
|
||||
fn as_ref(&self) -> &InternPool {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
// impl AsMut<InternPool> for InternPoolWrapper {
|
||||
// fn as_mut(&mut self) -> &mut InternPool {
|
||||
// Self::as_mut(self)
|
||||
// }
|
||||
// }
|
||||
|
||||
// impl AsMut<InternPool> for InternPool {
|
||||
// fn as_mut(&mut self) -> &mut InternPool {
|
||||
// self
|
||||
// }
|
||||
// }
|
||||
|
||||
impl core::fmt::Debug for InternPoolWrapper {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.debug_tuple("InternPoolWrapper")
|
||||
.field(self.as_ref())
|
||||
.finish()
|
||||
}
|
||||
}
|
||||
|
||||
pub struct InternPool {
|
||||
tags: Vec<Tag>,
|
||||
indices: Vec<u32>,
|
||||
|
@ -1308,6 +1375,13 @@ impl InternPool {
|
|||
})
|
||||
}
|
||||
|
||||
pub fn try_get_pointee_type(&self, pointer: Index) -> Option<Index> {
|
||||
match self.get_key(pointer) {
|
||||
Key::PointerType { pointee, .. } | Key::ArrayType { pointee, .. } => Some(pointee),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_pointer_type(&mut self, pointee: Index, flags: Option<PointerFlags>) -> Index {
|
||||
let key = Key::PointerType {
|
||||
pointee,
|
||||
|
@ -1316,13 +1390,6 @@ impl InternPool {
|
|||
self.get_or_insert(key)
|
||||
}
|
||||
|
||||
pub fn try_get_pointee_type(&self, pointer: Index) -> Option<Index> {
|
||||
match self.get_key(pointer) {
|
||||
Key::PointerType { pointee, .. } | Key::ArrayType { pointee, .. } => Some(pointee),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn try_get_pointer_type(
|
||||
&self,
|
||||
pointee: Index,
|
||||
|
|
Loading…
Reference in a new issue