mod green; mod red; mod syntax; mod builder; use std::{ sync::{Arc, Weak}, mem }; pub(crate) use self::{ green::{GreenNode, GreenNodeBuilder}, red::RedNode, syntax::SyntaxError, builder::GreenBuilder, }; pub use self::syntax::SyntaxNode; // This could be just `*const T`, but we use `Weak` for additional checks #[derive(Debug)] pub(crate) struct Ptr(Weak); impl Clone for Ptr { fn clone(&self) -> Self { Ptr(self.0.clone()) } } impl Ptr { fn clone(self_: &Ptr) -> Ptr { Ptr(Weak::clone(&self_.0)) } fn new(arc: &Arc) -> Ptr { Ptr(Arc::downgrade(arc)) } unsafe fn get(&self) -> &T { let t = self.0.upgrade() .expect("caller must guarantee that Ptr is not null"); let t: &T = &*t; mem::transmute(t) } }