chiark / gitweb /
move free to pop_front
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 15 Nov 2024 16:12:52 +0000 (16:12 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 15 Nov 2024 16:24:39 +0000 (16:24 +0000)
src/test/demo.rs

index 8185e412e4b23201f177f75f5afc5782333c4d68..f0b05c5381b519784561df90d3659ff51f69b205 100644 (file)
@@ -82,12 +82,14 @@ impl<T: Debug> List<T> {
     }
 
     pub fn pop_front(&mut self) -> Option<T> {
-        let tok = self.noalias.token_mut();
-        Self::pop_front_inner(
-            tok,
+        let mut tok = self.noalias.token_mut();
+        let deleted = Self::pop_front_inner(
+            tok.as_mut(),
             &mut self.head,
             &mut self.tail,
-        )
+        )?;
+        let deleted = unsafe { deleted.free_heap_return(&mut tok) };
+        Some(deleted.data)
     }
 
     pub fn head_and_tail_mut(&mut self) -> HeadAndTail<&mut T> {
@@ -131,13 +133,11 @@ impl<T: Debug> List<T> {
         })
     }
 
-    // We wouldn't do this, since it's daft, but
-    // it lets us demonstrate passing a token.
     fn pop_front_inner<'a>(
         mut tok: TokenMut<'a>,
         head: &mut Option<P<T>>,
         tail: &mut Option<P<T>>,
-    ) -> Option<T> {
+    ) -> Option<P<T>> {
         let deleting = (*head)?;
         let new_head = deleting.borrow(&tok).next;
         *head = new_head;
@@ -146,8 +146,7 @@ impl<T: Debug> List<T> {
         } else {
             *tail = None;
         }
-        let deleted = unsafe { deleting.free_heap_return(&mut tok) };
-        Some(deleted.data)
+        Some(deleting)
     }
 
     fn iter_ptrs<'i, I: 'i>(