brk_vecs 0.0.85

A KISS index/value store
Documentation
use pco::data_types::Number;

use super::StoredRaw;

pub trait TransparentStoredCompressed<T> {}

pub trait StoredCompressed
where
    Self: StoredRaw + Copy + 'static + TransparentStoredCompressed<Self::NumberType>,
{
    type NumberType: pco::data_types::Number;
}

pub trait AsInnerSlice<T>
where
    T: Number,
{
    fn as_inner_slice(&self) -> &[T];
}

impl<T> AsInnerSlice<T::NumberType> for [T]
where
    T: StoredCompressed,
{
    fn as_inner_slice(&self) -> &[T::NumberType] {
        assert_eq!(
            std::mem::size_of::<T>(),
            std::mem::size_of::<T::NumberType>()
        );
        assert_eq!(
            std::mem::align_of::<T>(),
            std::mem::align_of::<T::NumberType>()
        );
        unsafe { std::slice::from_raw_parts(self.as_ptr() as *const T::NumberType, self.len()) }
    }
}

pub trait FromInnerSlice<T> {
    fn from_inner_slice(slice: Vec<T>) -> Vec<Self>
    where
        Self: Sized;
}

impl<T> FromInnerSlice<T::NumberType> for T
where
    T: StoredCompressed,
{
    fn from_inner_slice(vec: Vec<T::NumberType>) -> Vec<T> {
        assert_eq!(
            std::mem::size_of::<T>(),
            std::mem::size_of::<T::NumberType>()
        );
        assert_eq!(
            std::mem::align_of::<T>(),
            std::mem::align_of::<T::NumberType>()
        );

        let mut vec = std::mem::ManuallyDrop::new(vec);
        unsafe { Vec::from_raw_parts(vec.as_mut_ptr() as *mut T, vec.len(), vec.capacity()) }
    }
}

impl TransparentStoredCompressed<u16> for u16 {}
impl StoredCompressed for u16 {
    type NumberType = u16;
}
impl TransparentStoredCompressed<u32> for u32 {}
impl StoredCompressed for u32 {
    type NumberType = u32;
}
impl TransparentStoredCompressed<u64> for u64 {}
impl StoredCompressed for u64 {
    type NumberType = u64;
}
impl TransparentStoredCompressed<i16> for i16 {}
impl StoredCompressed for i16 {
    type NumberType = i16;
}
impl TransparentStoredCompressed<i32> for i32 {}
impl StoredCompressed for i32 {
    type NumberType = i32;
}
impl TransparentStoredCompressed<i64> for i64 {}
impl StoredCompressed for i64 {
    type NumberType = i64;
}
impl TransparentStoredCompressed<f32> for f32 {}
impl StoredCompressed for f32 {
    type NumberType = f32;
}
impl TransparentStoredCompressed<f64> for f64 {}
impl StoredCompressed for f64 {
    type NumberType = f64;
}
impl TransparentStoredCompressed<u16> for () {}
impl StoredCompressed for () {
    type NumberType = u16;
}