ps_buffer/methods/
reserve.rs

1use ps_alloc::HEADER_SIZE;
2
3use crate::{Buffer, BufferError};
4
5impl Buffer {
6    /// Reserves at least `self.len() + num_bytes` bytes.
7    /// # Errors
8    /// - `BufferError` is propagated from [`Buffer::reserve_total`]
9    pub fn reserve(&mut self, num_bytes: usize) -> Result<&mut Self, BufferError> {
10        let size = self
11            .len()
12            .saturating_add(num_bytes)
13            .saturating_add(HEADER_SIZE)
14            .min(MAX_SIZE)
15            .next_power_of_two()
16            .saturating_sub(HEADER_SIZE);
17
18        self.reserve_total(size)
19    }
20}
21
22const MAX_SIZE: usize = ((isize::MAX >> 1) as usize).next_power_of_two() - HEADER_SIZE;
23
24#[cfg(test)]
25mod tests {
26    use ps_alloc::HEADER_SIZE;
27
28    use crate::{Buffer, BufferError};
29
30    #[test]
31    fn capacity() -> Result<(), BufferError> {
32        let mut buffer = Buffer::new();
33
34        for i in 8..32 {
35            buffer.reserve(1 << i)?;
36
37            assert_eq!(
38                buffer.capacity(),
39                (1 << (i + 1)) - HEADER_SIZE,
40                "Incorrect capacity at i={i}"
41            );
42        }
43
44        Ok(())
45    }
46}