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 {
|
pub struct InternPool {
|
||||||
tags: Vec<Tag>,
|
tags: Vec<Tag>,
|
||||||
indices: Vec<u32>,
|
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 {
|
pub fn get_pointer_type(&mut self, pointee: Index, flags: Option<PointerFlags>) -> Index {
|
||||||
let key = Key::PointerType {
|
let key = Key::PointerType {
|
||||||
pointee,
|
pointee,
|
||||||
|
@ -1316,13 +1390,6 @@ impl InternPool {
|
||||||
self.get_or_insert(key)
|
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(
|
pub fn try_get_pointer_type(
|
||||||
&self,
|
&self,
|
||||||
pointee: Index,
|
pointee: Index,
|
||||||
|
|
Loading…
Reference in a new issue