sized_chunks/ring_buffer/
refpool.rs1use core::mem::MaybeUninit;
2
3use ::refpool::{PoolClone, PoolDefault};
4
5use crate::ring_buffer::index::RawIndex;
6use crate::RingBuffer;
7
8impl<A, const N: usize> PoolDefault for RingBuffer<A, N> {
9 unsafe fn default_uninit(target: &mut MaybeUninit<Self>) {
10 let ptr = target.as_mut_ptr();
11 let origin_ptr: *mut RawIndex<N> = &mut (*ptr).origin;
12 let length_ptr: *mut usize = &mut (*ptr).length;
13 origin_ptr.write(0.into());
14 length_ptr.write(0);
15 }
16}
17
18impl<A, const N: usize> PoolClone for RingBuffer<A, N>
19where
20 A: Clone,
21{
22 unsafe fn clone_uninit(&self, target: &mut MaybeUninit<Self>) {
23 let ptr = target.as_mut_ptr();
24 let origin_ptr: *mut RawIndex<N> = &mut (*ptr).origin;
25 let length_ptr: *mut usize = &mut (*ptr).length;
26 let data_ptr: *mut _ = &mut (*ptr).data;
27 let data_ptr: *mut A = (*data_ptr).as_mut_ptr().cast();
28 origin_ptr.write(self.origin);
29 length_ptr.write(self.length);
30 for index in self.range() {
31 data_ptr
32 .add(index.to_usize())
33 .write((*self.ptr(index)).clone());
34 }
35 }
36}
37
38#[cfg(test)]
39mod test {
40 use super::*;
41 use ::refpool::{Pool, PoolRef};
42 use std::iter::FromIterator;
43
44 #[test]
45 fn default_and_clone() {
46 let pool: Pool<RingBuffer<usize, 64>> = Pool::new(16);
47 let mut ref1 = PoolRef::default(&pool);
48 {
49 let chunk = PoolRef::make_mut(&pool, &mut ref1);
50 chunk.push_back(1);
51 chunk.push_back(2);
52 chunk.push_back(3);
53 }
54 let ref2 = PoolRef::cloned(&pool, &ref1);
55 let ref3 = PoolRef::clone_from(&pool, &RingBuffer::from_iter(1..=3));
56 assert_eq!(RingBuffer::<usize, 64>::from_iter(1..=3), *ref1);
57 assert_eq!(RingBuffer::<usize, 64>::from_iter(1..=3), *ref2);
58 assert_eq!(RingBuffer::<usize, 64>::from_iter(1..=3), *ref3);
59 assert_eq!(ref1, ref2);
60 assert_eq!(ref1, ref3);
61 assert_eq!(ref2, ref3);
62 assert!(!PoolRef::ptr_eq(&ref1, &ref2));
63 }
64}