vecdb/traits/
compressed.rs1use 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}