ps_buffer/shared/implementations/
clone.rs1use 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}