sized_chunks/sparse_chunk/
refpool.rs

1use core::mem::MaybeUninit;
2
3use bitmaps::{Bitmap, Bits, BitsImpl};
4
5use ::refpool::{PoolClone, PoolDefault};
6
7use crate::SparseChunk;
8
9impl<A, const N: usize> PoolDefault for SparseChunk<A, N>
10where
11    BitsImpl<N>: Bits,
12{
13    unsafe fn default_uninit(target: &mut MaybeUninit<Self>) {
14        let ptr = target.as_mut_ptr();
15        let map_ptr: *mut Bitmap<N> = &mut (*ptr).map;
16        map_ptr.write(Bitmap::new());
17    }
18}
19
20impl<A, const N: usize> PoolClone for SparseChunk<A, N>
21where
22    A: Clone,
23    BitsImpl<N>: Bits,
24{
25    unsafe fn clone_uninit(&self, target: &mut MaybeUninit<Self>) {
26        let ptr = target.as_mut_ptr();
27        let map_ptr: *mut Bitmap<N> = &mut (*ptr).map;
28        let data_ptr: *mut _ = &mut (*ptr).data;
29        let data_ptr: *mut A = (*data_ptr).as_mut_ptr().cast();
30        map_ptr.write(self.map);
31        for index in &self.map {
32            data_ptr.add(index).write(self[index].clone());
33        }
34    }
35}
36
37#[cfg(test)]
38mod test {
39    use super::*;
40    use ::refpool::{Pool, PoolRef};
41
42    #[test]
43    fn default_and_clone() {
44        let pool: Pool<SparseChunk<usize, 64>> = Pool::new(16);
45        let mut ref1 = PoolRef::default(&pool);
46        {
47            let chunk = PoolRef::make_mut(&pool, &mut ref1);
48            chunk.insert(5, 13);
49            chunk.insert(10, 37);
50            chunk.insert(31, 337);
51        }
52        let ref2 = PoolRef::cloned(&pool, &ref1);
53        assert_eq!(ref1, ref2);
54        assert!(!PoolRef::ptr_eq(&ref1, &ref2));
55    }
56}