diff --git a/src/listhead.rs b/src/listhead.rs index f63d959..7c3711a 100644 --- a/src/listhead.rs +++ b/src/listhead.rs @@ -15,20 +15,39 @@ impl ListHead { next: Weak::>>::new(), data: Weak::>::new(), })); - this.borrow_mut().prev = Rc::downgrade(&this); - this.borrow_mut().next = Rc::downgrade(&this); + this.borrow_mut().init(); return this; } - pub fn data(&self) -> &Weak::> { - return &self.data; + fn get_rc_refcell(&self) -> Rc::>> { + let cell_rc: &Rc>> = &self.next.upgrade().unwrap(); + let head: &ListHead = &*cell_rc.borrow(); + let cell_start = cell_rc.as_ptr() as *const u8; + let data_start = head as *const ListHead as *const u8; + let cell_offset = unsafe { data_start.offset_from(cell_start) }; + unsafe { + return Rc::from_raw(cell_start as *const RefCell::>); + }; } - pub fn del(&mut self) { + fn init(&mut self) { + self.prev = Rc::downgrade(&self.get_rc_refcell()); + self.next = Rc::downgrade(&self.get_rc_refcell()); + } + + pub fn data(&self) -> Weak::> { + return self.data.clone(); + } + + pub fn del_init(&mut self) { self.next.upgrade().unwrap().borrow_mut().prev = self.prev.clone(); self.prev.upgrade().unwrap().borrow_mut().next = self.next.clone(); } + pub fn empty(&self) -> bool { + return self as *const ListHead == self.next.upgrade().unwrap().as_ptr(); + } + pub fn add_tail(head: &mut Rc::>>, pnew: &mut Rc::>>) { let prev = &mut head.borrow_mut().prev; @@ -40,47 +59,17 @@ impl ListHead { prev.upgrade().unwrap().borrow_mut().next = Rc::downgrade(pnew); } -} -/* -pub struct ListHead { - prev: Weak::>, - next: Weak::>, - data: Weak::>, -} - -impl ListHead { - - pub fn new() -> RefCell::>> { - let mut this = Rc::new(ListHead{ - prev: Weak::>::new(), - next: Weak::>::new(), - data: Weak::>::new(), - }); - let p = RefCell::new(this); - //this.prev = Rc::downgrade(&this).clone(); - //this.prev = Weak::>::new(); - //this.next = Rc::downgrade(&this); - //p.borrow_mut().prev = Rc::downgrade(&p.borrow()); - p.borrow_mut().prev = Weak::>::new(); - return p; - } - /* - pub fn data(&self) -> &Weak::> { - return &self.data; - } - - pub fn del(&mut self) { - self.next.upgrade().unwrap().borrow_mut().prev = self.prev.clone(); - self.prev.upgrade().unwrap().borrow_mut().next = self.next.clone(); - } - - pub fn add_tail(&mut self, pnew: &mut ListHead) { - let prev = &mut self.prev; - unsafe { - let next = Weak::from_raw(&self); - //next.upgrade().unwrap().borrow_mut().prev = Weak::from_raw(pnew); + pub fn first_entry(&self) -> Weak::> { + if self.empty() { } + return self.next.upgrade().unwrap().borrow().data(); } - */ + + pub fn replace_init(head: &mut Rc::>>, + pnew: &mut Rc::>>) { + pnew.borrow_mut().next = head.borrow_mut().next.clone(); + pnew.borrow_mut().next.upgrade().unwrap().borrow_mut().prev = Rc::downgrade(pnew); + pnew.borrow_mut().prev = head.borrow_mut().prev.clone(); + } + } -*/