cds 0.10.0

Collection of Optimized Data Structures
Documentation
use crate::{
    len::LengthType,
    mem::SpareMemoryPolicy,
    smallvec::{clone_from_slice_unchecked, SmallVec, DOHAE},
};
use core::{clone::Clone, mem};

impl<T, L, SM, const C: usize> Clone for SmallVec<T, C, L, SM>
where
    T: Clone,
    L: LengthType,
    SM: SpareMemoryPolicy<T>,
{
    #[inline]
    fn clone(&self) -> Self {
        let src = self.as_slice();
        let src_len = src.len();
        let mut tmp = Self::new();
        let (len, p) = if mem::size_of::<T>() == 0 || src_len <= C {
            (&mut tmp.capacity, tmp.buf.local_mut_ptr())
        } else {
            tmp.try_reserve_exact_impl::<DOHAE>(src_len)
                .expect("smallvec clone failed to reserve")
        };
        unsafe {
            clone_from_slice_unchecked(src, len, p);
        }
        tmp
    }

    #[inline]
    fn clone_from(&mut self, source: &Self) {
        self.clear();
        let src = source.as_slice();
        let src_len = src.len();

        let cap = self.capacity.as_usize();
        let (len, p) = if mem::size_of::<T>() == 0 || cap <= C {
            if mem::size_of::<T>() == 0 || src_len <= C {
                (&mut self.capacity, self.buf.local_mut_ptr())
            } else {
                self.try_reserve_exact_impl::<DOHAE>(src_len)
                    .expect("smallvec clone_from failed to reserve")
            }
        } else if src_len <= cap {
            self.buf.heap_mut_len_mut_p()
        } else {
            self.try_reserve_exact_impl::<DOHAE>(src_len)
                .expect("smallvec clone_from failed to reserve")
        };

        unsafe {
            clone_from_slice_unchecked(src, len, p);
        }
    }
}