vecdb/traits/
compressed.rs

1use pco::data_types::Number;
2
3use super::StoredRaw;
4
5pub trait TransparentStoredCompressed<T> {}
6
7pub trait StoredCompressed
8where
9    Self: StoredRaw + Copy + 'static + TransparentStoredCompressed<Self::NumberType>,
10{
11    type NumberType: pco::data_types::Number;
12}
13
14pub trait AsInnerSlice<T>
15where
16    T: Number,
17{
18    fn as_inner_slice(&self) -> &[T];
19}
20
21impl<T> AsInnerSlice<T::NumberType> for [T]
22where
23    T: StoredCompressed,
24{
25    fn as_inner_slice(&self) -> &[T::NumberType] {
26        assert_eq!(
27            std::mem::size_of::<T>(),
28            std::mem::size_of::<T::NumberType>()
29        );
30        assert_eq!(
31            std::mem::align_of::<T>(),
32            std::mem::align_of::<T::NumberType>()
33        );
34        unsafe { std::slice::from_raw_parts(self.as_ptr() as *const T::NumberType, self.len()) }
35    }
36}
37
38pub trait FromInnerSlice<T> {
39    fn from_inner_slice(slice: Vec<T>) -> Vec<Self>
40    where
41        Self: Sized;
42}
43
44impl<T> FromInnerSlice<T::NumberType> for T
45where
46    T: StoredCompressed,
47{
48    fn from_inner_slice(vec: Vec<T::NumberType>) -> Vec<T> {
49        assert_eq!(
50            std::mem::size_of::<T>(),
51            std::mem::size_of::<T::NumberType>()
52        );
53        assert_eq!(
54            std::mem::align_of::<T>(),
55            std::mem::align_of::<T::NumberType>()
56        );
57
58        let mut vec = std::mem::ManuallyDrop::new(vec);
59        unsafe { Vec::from_raw_parts(vec.as_mut_ptr() as *mut T, vec.len(), vec.capacity()) }
60    }
61}
62
63impl TransparentStoredCompressed<u16> for u16 {}
64impl StoredCompressed for u16 {
65    type NumberType = u16;
66}
67impl TransparentStoredCompressed<u32> for u32 {}
68impl StoredCompressed for u32 {
69    type NumberType = u32;
70}
71impl TransparentStoredCompressed<u64> for u64 {}
72impl StoredCompressed for u64 {
73    type NumberType = u64;
74}
75impl TransparentStoredCompressed<i16> for i16 {}
76impl StoredCompressed for i16 {
77    type NumberType = i16;
78}
79impl TransparentStoredCompressed<i32> for i32 {}
80impl StoredCompressed for i32 {
81    type NumberType = i32;
82}
83impl TransparentStoredCompressed<i64> for i64 {}
84impl StoredCompressed for i64 {
85    type NumberType = i64;
86}
87impl TransparentStoredCompressed<f32> for f32 {}
88impl StoredCompressed for f32 {
89    type NumberType = f32;
90}
91impl TransparentStoredCompressed<f64> for f64 {}
92impl StoredCompressed for f64 {
93    type NumberType = f64;
94}
95impl TransparentStoredCompressed<u16> for () {}
96impl StoredCompressed for () {
97    type NumberType = u16;
98}