From 5dbb93455c3ca6ea3891cc898941731ca573c6a6 Mon Sep 17 00:00:00 2001 From: YK Date: Sun, 8 Dec 2024 00:38:20 +0300 Subject: [PATCH] a bad linked list (chapter 1) --- src/bad.rs | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 15 +----------- 2 files changed, 73 insertions(+), 14 deletions(-) create mode 100644 src/bad.rs diff --git a/src/bad.rs b/src/bad.rs new file mode 100644 index 0000000..55fdac3 --- /dev/null +++ b/src/bad.rs @@ -0,0 +1,72 @@ + +pub struct List { + head: Link +} + +enum Link { + Empty, + More (Box) +} + +struct Node { + val: i32, + next: List +} + + +impl List { + fn new () -> Self { + List { head: Link::Empty } + } + + fn push (&mut self, val: i32) { + let new_node = Box::new(Node { val, next: List { head: std::mem::replace(&mut self.head, Link::Empty) } }); + self.head = Link::More(new_node); + } + + fn pop (&mut self) -> Option { + match std::mem::replace(&mut self.head, Link::Empty) { + Link::Empty => None, + Link::More(v) => { + self.head = v.next.head; + Some(v.val) + } + } + } +} + + +#[cfg(test)] +mod test { + use super::List; + + #[test] + fn basics () { + let mut list = List::new(); + + // Check empty list behaves right + assert_eq!(list.pop(), None); + + // Populate list + list.push(1); + list.push(2); + list.push(3); + + // Check normal removal + assert_eq!(list.pop(), Some(3)); + assert_eq!(list.pop(), Some(2)); + + // Push some more just to make sure nothing's corrupted + list.push(4); + list.push(5); + + // Check normal removal + assert_eq!(list.pop(), Some(5)); + assert_eq!(list.pop(), Some(4)); + + // Check exhaustion + assert_eq!(list.pop(), Some(1)); + assert_eq!(list.pop(), None); + + } +} diff --git a/src/lib.rs b/src/lib.rs index b93cf3f..1aef305 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1 @@ -pub fn add(left: u64, right: u64) -> u64 { - left + right -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} +pub mod bad;