compact 0.2.16

Store objects containing dynamic fields either compactly in consecutive memory or using traditional heap pointers
Documentation
use super::Compact;
use compact_vec::CompactVec;

#[derive(Clone)]
pub struct Opaque {
    data: CompactVec<u8>
}

impl Opaque {
    pub fn new<T: Compact>(specific: T) -> Self {
        let data = CompactVec::with_capacity(specific.total_size_bytes());
        unsafe {
            Compact::compact_behind(&mut specific as *mut T, data.as_mut_ptr() as *mut T);
        }
        ::std::mem::forget(specific);
        Opaque {
            data
        }
    }
}

impl Compact for Opaque {
    fn is_still_compact(&self) -> bool {
        self.data.is_still_compact()
    }

    fn dynamic_size_bytes(&self) -> usize {
        self.data.dynamic_size_bytes()
    }

    unsafe fn compact(source: *mut Self, dest: *mut Self, new_dynamic_part: *mut u8) {
        Compact::compact(&mut (*source).data, &mut (*dest).data, new_dynamic_part)
    }

    unsafe fn decompact(source: *const Self) -> Self {
        Opaque {
            data: Compact::decompact(&(*source).data),
        }
    }
}