sized_chunks/ring_buffer/
refpool.rs

1use 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}