rc::Rc,
};
+use crate::{
+ loc::Loc,
+ loc_set::{LocSet, LocSetMaxConflictsWith},
+};
+
#[derive(Clone)]
pub struct Interned<T: ?Sized> {
ptr: Rc<T>,
#[derive(Default)]
struct Interners {
str: Interner<str>,
+ loc_set: Interner<LocSet>,
+ loc_set_max_conflicts_with_loc_set: Interner<LocSetMaxConflictsWith<Interned<LocSet>>>,
+ loc_set_max_conflicts_with_loc: Interner<LocSetMaxConflictsWith<Loc>>,
}
-pub struct GlobalArena {
+pub struct GlobalState {
interners: Interners,
}
-scoped_tls::scoped_thread_local!(static GLOBAL_ARENA: GlobalArena);
+scoped_tls::scoped_thread_local!(static GLOBAL_STATE: GlobalState);
-impl GlobalArena {
+impl GlobalState {
pub fn scope<R>(f: impl FnOnce() -> R) -> R {
- GLOBAL_ARENA.set(
- &GlobalArena {
+ GLOBAL_STATE.set(
+ &GlobalState {
interners: Interners::default(),
},
f,
)
}
- pub fn get<R>(f: impl for<'a> FnOnce(&'a GlobalArena) -> R) -> R {
- GLOBAL_ARENA.with(f)
+ pub fn get<R>(f: impl for<'a> FnOnce(&'a GlobalState) -> R) -> R {
+ GLOBAL_STATE.with(f)
}
}
}
pub trait InternTarget: Intern<Target = Self> + Hash + Eq {
- fn get_interner(global_arena: &GlobalArena) -> &Interner<Self>;
- fn into_interned(input: Self, global_arena: &GlobalArena) -> Interned<Self>
+ fn get_interner(global_state: &GlobalState) -> &Interner<Self>;
+ fn into_interned(input: Self, global_state: &GlobalState) -> Interned<Self>
where
Self: Sized,
{
- Self::get_interner(global_arena).intern(InternInput {
+ Self::get_interner(global_state).intern(InternInput {
input,
borrow: |v| v,
into_rc: Rc::new,
})
}
- fn rc_into_interned(input: Rc<Self>, global_arena: &GlobalArena) -> Interned<Self> {
- Self::get_interner(global_arena).intern(InternInput {
+ fn rc_into_interned(input: Rc<Self>, global_state: &GlobalState) -> Interned<Self> {
+ Self::get_interner(global_state).intern(InternInput {
input,
borrow: |v| &**v,
into_rc: |v| v,
})
}
- fn rc_to_interned(input: &Rc<Self>, global_arena: &GlobalArena) -> Interned<Self> {
- Self::get_interner(global_arena).intern(InternInput {
+ fn rc_to_interned(input: &Rc<Self>, global_state: &GlobalState) -> Interned<Self> {
+ Self::get_interner(global_state).intern(InternInput {
input,
borrow: |v| &***v,
into_rc: |v| v.clone(),
}
impl InternTarget for str {
- fn get_interner(global_arena: &GlobalArena) -> &Interner<Self> {
- &global_arena.interners.str
+ fn get_interner(global_state: &GlobalState) -> &Interner<Self> {
+ &global_state.interners.str
}
}
v.into()
}
- fn to_interned(&self, global_arena: &GlobalArena) -> Interned<Self::Target> {
- Self::get_interner(global_arena).intern(InternInput {
+ fn to_interned(&self, global_state: &GlobalState) -> Interned<Self::Target> {
+ Self::get_interner(global_state).intern(InternInput {
input: self,
borrow: |v| &**v,
into_rc: Self::to_rc_target,
Rc::from(*v)
}
- fn to_interned(&self, global_arena: &GlobalArena) -> Interned<Self::Target> {
- Self::Target::to_interned(self, global_arena)
+ fn to_interned(&self, global_state: &GlobalState) -> Interned<Self::Target> {
+ Self::Target::to_interned(self, global_state)
}
- fn into_interned(self, global_arena: &GlobalArena) -> Interned<Self::Target>
+ fn into_interned(self, global_state: &GlobalState) -> Interned<Self::Target>
where
Self: Sized,
{
- Self::Target::to_interned(self, global_arena)
+ Self::Target::to_interned(self, global_state)
}
}
Rc::from(&**v)
}
- fn to_interned(&self, global_arena: &GlobalArena) -> Interned<Self::Target> {
- Self::Target::to_interned(self, global_arena)
+ fn to_interned(&self, global_state: &GlobalState) -> Interned<Self::Target> {
+ Self::Target::to_interned(self, global_state)
}
- fn into_interned(self, global_arena: &GlobalArena) -> Interned<Self::Target>
+ fn into_interned(self, global_state: &GlobalState) -> Interned<Self::Target>
where
Self: Sized,
{
- Self::Target::to_interned(self, global_arena)
+ Self::Target::to_interned(self, global_state)
}
}
Rc::from(&**v)
}
- fn to_interned(&self, global_arena: &GlobalArena) -> Interned<Self::Target> {
- Self::Target::to_interned(self, global_arena)
+ fn to_interned(&self, global_state: &GlobalState) -> Interned<Self::Target> {
+ Self::Target::to_interned(self, global_state)
}
fn into_rc_target(v: Self) -> Rc<Self::Target>
Rc::from(v)
}
- fn into_interned(self, global_arena: &GlobalArena) -> Interned<Self::Target>
+ fn into_interned(self, global_state: &GlobalState) -> Interned<Self::Target>
where
Self: Sized,
{
- Self::Target::to_interned(&self, global_arena)
+ Self::Target::to_interned(&self, global_state)
}
}
Self::to_rc_target(&v)
}
fn to_rc_target(v: &Self) -> Rc<Self::Target>;
- fn into_interned(self, global_arena: &GlobalArena) -> Interned<Self::Target>
+ fn into_interned(self, global_state: &GlobalState) -> Interned<Self::Target>
where
Self: Sized,
{
<<Self as Intern>::Target as InternTarget>::rc_into_interned(
Self::into_rc_target(self),
- global_arena,
+ global_state,
)
}
- fn to_interned(&self, global_arena: &GlobalArena) -> Interned<Self::Target> {
- Self::Target::rc_into_interned(Self::to_rc_target(self), global_arena)
+ fn to_interned(&self, global_state: &GlobalState) -> Interned<Self::Target> {
+ Self::Target::rc_into_interned(Self::to_rc_target(self), global_state)
}
}
v.into()
}
- fn into_interned(self, global_arena: &GlobalArena) -> Interned<Self::Target>
+ fn into_interned(self, global_state: &GlobalState) -> Interned<Self::Target>
where
Self: Sized,
{
- InternTarget::into_interned(self, global_arena)
+ InternTarget::into_interned(self, global_state)
}
- fn to_interned(&self, global_arena: &GlobalArena) -> Interned<Self::Target> {
- InternTarget::get_interner(global_arena).intern(InternInput {
+ fn to_interned(&self, global_state: &GlobalState) -> Interned<Self::Target> {
+ InternTarget::get_interner(global_state).intern(InternInput {
input: self,
borrow: |v| &**v,
into_rc: |v| v.clone().into(),
})
}
}
+
+impl InternTarget for LocSet {
+ fn get_interner(global_state: &GlobalState) -> &Interner<Self> {
+ &global_state.interners.loc_set
+ }
+}
+
+impl InternTarget for LocSetMaxConflictsWith<Interned<LocSet>> {
+ fn get_interner(global_state: &GlobalState) -> &Interner<Self> {
+ &global_state.interners.loc_set_max_conflicts_with_loc_set
+ }
+}
+
+impl InternTarget for LocSetMaxConflictsWith<Loc> {
+ fn get_interner(global_state: &GlobalState) -> &Interner<Self> {
+ &global_state.interners.loc_set_max_conflicts_with_loc
+ }
+}