1use crate::Buffer;
2
3impl Buffer {
4 #[inline]
22 pub fn pop(&mut self) -> Option<u8> {
23 if self.is_empty() {
24 return None;
25 }
26
27 let index = self.len().checked_sub(1)?;
28 let value = self[index];
29
30 self.length = self.length.checked_sub(1)?;
31
32 Some(value)
33 }
34}
35
36#[cfg(test)]
37mod tests {
38 use crate::{Buffer, BufferError};
39
40 #[test]
41 fn pop_values() -> Result<(), BufferError> {
42 let mut buffer = Buffer::new();
43 buffer.push(42)?;
44 buffer.push(65)?;
45
46 assert_eq!(buffer.pop(), Some(65));
47 assert_eq!(buffer.len(), 1);
48 assert_eq!(buffer.pop(), Some(42));
49 assert_eq!(buffer.len(), 0);
50 assert_eq!(buffer.pop(), None);
51 assert_eq!(buffer.len(), 0);
52
53 Ok(())
54 }
55
56 #[test]
57 fn pop_empty() {
58 let mut buffer = Buffer::new();
59 assert_eq!(buffer.pop(), None);
60 assert_eq!(buffer.len(), 0);
61 }
62
63 #[test]
64 fn pop_single() -> Result<(), BufferError> {
65 let mut buffer = Buffer::new();
66 buffer.push(100)?;
67 assert_eq!(buffer.pop(), Some(100));
68 assert_eq!(buffer.len(), 0);
69 assert_eq!(buffer.pop(), None);
70 Ok(())
71 }
72
73 #[test]
74 fn pop_multiple() -> Result<(), BufferError> {
75 let mut buffer = Buffer::new();
76 for i in 0..5 {
77 buffer.push(i)?;
78 }
79
80 for i in (0..5).rev() {
81 assert_eq!(buffer.pop(), Some(i));
82 }
83 assert_eq!(buffer.pop(), None);
84 assert_eq!(buffer.len(), 0);
85
86 Ok(())
87 }
88
89 #[test]
90 fn pop_underflow() -> Result<(), BufferError> {
91 let mut buffer = Buffer::new();
92
93 buffer.push(12)?;
94 buffer.length = 0;
95
96 assert_eq!(buffer.pop(), None);
97
98 Ok(())
99 }
100}