ps_buffer/shared/implementations/
clone.rs

1use crate::{Buffer, SharedBuffer};
2
3impl Clone for SharedBuffer {
4    fn clone(&self) -> Self {
5        Self {
6            arc: self.arc.clone(),
7            buffer: Buffer {
8                capacity: self.buffer.capacity,
9                length: self.buffer.length,
10                ptr: self.buffer.ptr,
11            },
12        }
13    }
14}
15
16#[cfg(test)]
17mod tests {
18    use ps_alloc::DeallocationError;
19
20    use crate::{BufferError, SharedBuffer, ToBuffer};
21
22    #[test]
23    fn is_freed() -> Result<(), BufferError> {
24        let buffer1: SharedBuffer = "Hello, world!".to_buffer()?.into();
25        let buffer2 = buffer1.clone();
26        let buffer3 = buffer2.clone();
27
28        assert_eq!(&buffer1.slice(..), b"Hello, world!");
29        assert_eq!(&buffer2.slice(..), b"Hello, world!");
30        assert_eq!(&buffer3.slice(..), b"Hello, world!");
31
32        drop(buffer3);
33        drop(buffer1);
34
35        assert_eq!(&buffer2.slice(..), b"Hello, world!");
36
37        let ptr = buffer2.ptr;
38
39        drop(buffer2);
40
41        assert!(matches!(
42            ps_alloc::free(ptr),
43            Err(DeallocationError::DoubleFree | DeallocationError::InvalidAllocation)
44        ));
45
46        Ok(())
47    }
48}