ps_buffer/methods/
pop.rs

1use crate::Buffer;
2
3impl Buffer {
4    /// Removes and returns the last byte from this [`Buffer`], if any.
5    ///
6    /// This method retrieves the byte at the end of this [`Buffer`] and reduces the buffer's length by one.
7    /// If the buffer is empty, it returns `None`.
8    ///
9    /// # Examples
10    ///
11    /// ```
12    /// # use ps_buffer::{Buffer, BufferError};
13    /// let mut buffer = Buffer::new();
14    /// buffer.push(42)?;
15    /// buffer.push(65)?;
16    /// assert_eq!(buffer.pop(), Some(65));
17    /// assert_eq!(buffer.pop(), Some(42));
18    /// assert_eq!(buffer.pop(), None);
19    /// # Ok::<(), BufferError>(())
20    /// ```
21    #[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}