@@ -53,15 +53,6 @@ pub trait LLWeight {
5353 fn ll_weight ( & self ) -> usize ;
5454}
5555
56- /*
57- impl<T> LLWeight for T {
58- #[inline]
59- default fn ll_weight(&self) -> usize {
60- 1
61- }
62- }
63- */
64-
6556#[ derive( Clone , Debug ) ]
6657pub ( crate ) struct LL < K >
6758where
@@ -138,8 +129,7 @@ impl<K> LLNodeOwned<K>
138129where
139130 K : LLWeight + Clone + Debug ,
140131{
141- #[ allow( clippy:: wrong_self_convention) ]
142- fn into_inner ( & mut self ) -> * mut LLNode < K > {
132+ fn into_inner ( mut self ) -> * mut LLNode < K > {
143133 let x = self . inner ;
144134 self . inner = ptr:: null_mut ( ) ;
145135 x
@@ -187,7 +177,7 @@ where
187177 debug_assert ! ( ( * self . inner) . next. is_null( ) ) ;
188178 debug_assert ! ( ( * self . inner) . prev. is_null( ) ) ;
189179 }
190- panic ! ( "dropping LLNodeOwned<K>" ) ;
180+ panic ! ( "dropping LLNodeOwned<K> which has valid content, this should never happen! " ) ;
191181 }
192182 }
193183}
@@ -234,18 +224,28 @@ where
234224 }
235225
236226 // Append an arbitrary node into this set.
237- pub ( crate ) fn append_n ( & mut self , mut owned : LLNodeOwned < K > ) -> LLNodeRef < K > {
227+ pub ( crate ) fn append_n ( & mut self , owned : LLNodeOwned < K > ) -> LLNodeRef < K > {
238228 // Who is to the left of tail?
239229 let n = owned. into_inner ( ) ;
240230 unsafe {
241231 self . size += ( * ( * n) . k . as_ptr ( ) ) . ll_weight ( ) ;
242232 // must be untagged
243233 // assert!((*n).tag == 0);
234+ // Tail has no trailing nodes.
244235 debug_assert ! ( ( * self . tail) . next. is_null( ) ) ;
236+ // Tail must have a previous node.
245237 debug_assert ! ( !( * self . tail) . prev. is_null( ) ) ;
238+ // What is that predecessor?
246239 let pred = ( * self . tail ) . prev ;
247240 debug_assert ! ( !pred. is_null( ) ) ;
241+ // Assert that the predecessor points at tail correctly.
242+ // We know now that:
243+ //
244+ // pred <-> tail
248245 debug_assert ! ( ( * pred) . next == self . tail) ;
246+
247+ // Tell our node where we are.
248+ // pred <-> n <-> tail
249249 ( * n) . prev = pred;
250250 ( * n) . next = self . tail ;
251251 // (*n).tag = self.tag;
@@ -259,6 +259,7 @@ where
259259 debug_assert ! ( !( * ( * n) . next) . prev. is_null( ) ) ;
260260 debug_assert ! ( ( * ( * n) . prev) . next == n) ;
261261 debug_assert ! ( ( * ( * n) . next) . prev == n) ;
262+ // We have asserted the list is sane.
262263 } ;
263264 LLNodeRef { inner : n }
264265 }
@@ -275,13 +276,28 @@ where
275276 }
276277
277278 // remove this node from the ll, and return it's ptr.
278- pub ( crate ) fn pop ( & mut self ) -> LLNodeOwned < K > {
279- let n = unsafe { ( * self . head ) . next } ;
280- let owned = self . extract ( LLNodeRef { inner : n } ) ;
281- debug_assert ! ( !owned. is_null( ) ) ;
282- debug_assert ! ( owned. inner != self . head) ;
283- debug_assert ! ( owned. inner != self . tail) ;
284- owned
279+ pub ( crate ) fn pop ( & mut self ) -> Option < LLNodeOwned < K > > {
280+ let next = unsafe { ( * self . head ) . next } ;
281+ if next == self . tail {
282+ None
283+ } else {
284+ let n = unsafe { ( * self . head ) . next } ;
285+ let owned = self . extract ( LLNodeRef { inner : n } ) ;
286+ debug_assert ! ( !owned. is_null( ) ) ;
287+ debug_assert ! ( owned. inner != self . head) ;
288+ debug_assert ! ( owned. inner != self . tail) ;
289+ Some ( owned)
290+ }
291+ }
292+
293+ pub ( crate ) fn pop_n_free ( & mut self ) -> Option < K > {
294+ if let Some ( owned) = self . pop ( ) {
295+ let ll_node = owned. into_inner ( ) ;
296+ let k = LLNode :: into_inner ( ll_node) ;
297+ Some ( k)
298+ } else {
299+ None
300+ }
285301 }
286302
287303 // Cut a node out from this list from any location.
@@ -293,6 +309,10 @@ where
293309 debug_assert ! ( !( * n. inner) . prev. is_null( ) ) ;
294310 debug_assert ! ( !( * n. inner) . next. is_null( ) ) ;
295311 // And that prev's next is us, and next's prev is us.
312+ // This is asserting that we have a proper construction
313+ //
314+ // prev <-> n <-> next
315+ //
296316 debug_assert ! ( !( * ( * n. inner) . prev) . next. is_null( ) ) ;
297317 debug_assert ! ( !( * ( * n. inner) . next) . prev. is_null( ) ) ;
298318 debug_assert ! ( ( * ( * n. inner) . prev) . next == n. inner) ;
@@ -305,14 +325,24 @@ where
305325 unsafe {
306326 let prev = ( * n. inner ) . prev ;
307327 let next = ( * n. inner ) . next ;
328+ // Currently is:
329+ //
308330 // prev <-> n <-> next
309331 ( * next) . prev = prev;
310332 ( * prev) . next = next;
333+ // Now is
334+ // prev <-> next
335+
311336 // Null things for paranoia.
312337 if cfg ! ( test) || cfg ! ( debug_assertions) {
313338 ( * n. inner ) . prev = ptr:: null_mut ( ) ;
314339 ( * n. inner ) . next = ptr:: null_mut ( ) ;
315340 }
341+ // Finally, we have
342+ //
343+ // null <- n -> null
344+ // prev <-> next
345+
316346 // (*n).tag = 0;
317347 }
318348
@@ -324,10 +354,7 @@ where
324354 }
325355
326356 pub ( crate ) fn drop_head ( & mut self ) {
327- assert ! ( self . size > 0 ) ;
328- let next = unsafe { ( * self . head ) . next } ;
329- if next != self . tail {
330- let mut owned = self . pop ( ) ;
357+ while let Some ( owned) = self . pop ( ) {
331358 let n = owned. into_inner ( ) ;
332359 LLNode :: free ( n) ;
333360 }
@@ -446,13 +473,20 @@ where
446473 }
447474
448475 #[ inline]
449- fn free ( v : * mut Self ) {
476+ fn into_inner ( v : * mut Self ) -> K {
450477 debug_assert ! ( !v. is_null( ) ) ;
451478 let llnode = unsafe { Box :: from_raw ( v) } ;
452- // drop the inner k.
453- let _ = unsafe { llnode. k . assume_init ( ) } ;
479+ let k = unsafe { llnode. k . assume_init ( ) } ;
454480 #[ cfg( all( test, not( miri) ) ) ]
455- release_nid ( llnode. nid )
481+ release_nid ( llnode. nid ) ;
482+
483+ k
484+ }
485+
486+ #[ inline]
487+ fn free ( v : * mut Self ) {
488+ // drop the inner k.
489+ let _ = Self :: into_inner ( v) ;
456490 }
457491
458492 #[ inline]
@@ -552,7 +586,7 @@ mod tests {
552586 assert ! ( ll. peek_tail( ) . unwrap( ) . as_ref( ) == & 1 ) ;
553587
554588 // pop from head
555- let n3 = ll. pop ( ) ;
589+ let n3 = ll. pop ( ) . unwrap ( ) ;
556590 assert ! ( ll. len( ) == 3 ) ;
557591 assert ! ( ll. peek_head( ) . unwrap( ) . as_ref( ) == & 4 ) ;
558592 assert ! ( ll. peek_tail( ) . unwrap( ) . as_ref( ) == & 1 ) ;
@@ -574,7 +608,7 @@ mod tests {
574608 assert ! ( ll. peek_head( ) . unwrap( ) . as_ref( ) == & 4 ) ;
575609 assert ! ( ll. peek_tail( ) . unwrap( ) . as_ref( ) == & 4 ) ;
576610 // Remove last
577- let n4 = ll. pop ( ) ;
611+ let n4 = ll. pop ( ) . unwrap ( ) ;
578612 assert ! ( ll. len( ) == 0 ) ;
579613 assert ! ( ll. peek_head( ) . is_none( ) ) ;
580614 assert ! ( ll. peek_tail( ) . is_none( ) ) ;
@@ -610,9 +644,9 @@ mod tests {
610644 assert ! ( ll. len( ) == 8 ) ;
611645 let _n2 = ll. append_k ( Weighted { _i : 2 } ) ;
612646 assert ! ( ll. len( ) == 16 ) ;
613- let n1 = ll. pop ( ) ;
647+ let n1 = ll. pop ( ) . unwrap ( ) ;
614648 assert ! ( ll. len( ) == 8 ) ;
615- let n2 = ll. pop ( ) ;
649+ let n2 = ll. pop ( ) . unwrap ( ) ;
616650 assert ! ( ll. len( ) == 0 ) ;
617651 // Add back so they drop
618652 ll. append_n ( n1) ;
0 commit comments