chiark / gitweb /
add prepend
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 15 Nov 2024 16:22:21 +0000 (16:22 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 15 Nov 2024 16:24:39 +0000 (16:24 +0000)
src/test/demo.rs

index f0b05c5381b519784561df90d3659ff51f69b205..1a611161f38e85ec26d57d6d31c92467f6c2b794 100644 (file)
@@ -69,6 +69,28 @@ impl<T: Debug> List<T> {
         self.tail = Some(node);
     }
 
+    pub fn prepend(&mut self, data: T) {
+        let node = Node {
+            back: None,
+            next: None,
+            data,
+        };
+        let node = Ptr::new_heap(node);
+        self.prepend_raw(node)
+    }
+
+    fn prepend_raw(&mut self, node: P<T>) {
+        let mut tok = self.noalias.token_mut();
+        node.borrow_mut(&mut tok).back = None;
+        node.borrow_mut(&mut tok).next = self.head;
+        if let Some(old_head) = self.head {
+            old_head.borrow_mut(&mut tok).back = Some(node);
+        } else {
+            self.tail = Some(node);
+        };
+        self.head = Some(node);
+    }
+
     pub fn front(&self) -> Option<&T> {
         let tok = self.noalias.token_ref();
         let head = self.head?;