#![allow(unsafe_code)]
use std::sync::Once;
pub(crate) fn register_sqlite_vec() {
static ONCE: Once = Once::new();
ONCE.call_once(|| {
type SqliteInitFn = unsafe extern "C" fn(
*mut rusqlite::ffi::sqlite3,
*mut *mut std::os::raw::c_char,
*const rusqlite::ffi::sqlite3_api_routines,
) -> std::os::raw::c_int;
unsafe {
rusqlite::ffi::sqlite3_auto_extension(Some(std::mem::transmute::<
*const (),
SqliteInitFn,
>(
sqlite_vec::sqlite3_vec_init as *const (),
)));
}
});
}
pub(crate) fn f32s_as_bytes(v: &[f32]) -> Vec<u8> {
let mut out = Vec::with_capacity(v.len() * 4);
for x in v {
out.extend_from_slice(&x.to_le_bytes());
}
out
}
pub(crate) fn bytes_as_f32s(bytes: &[u8]) -> Vec<f32> {
bytes
.chunks_exact(4)
.map(|c| f32::from_le_bytes([c[0], c[1], c[2], c[3]]))
.collect()
}