use crate::error::{check_cuvs, Result};
use std::fmt;
use std::io::{stderr, Write};
pub struct SearchParams(pub ffi::cuvsIvfFlatSearchParams_t);
impl SearchParams {
pub fn new() -> Result<SearchParams> {
unsafe {
let mut params = std::mem::MaybeUninit::<ffi::cuvsIvfFlatSearchParams_t>::uninit();
check_cuvs(ffi::cuvsIvfFlatSearchParamsCreate(params.as_mut_ptr()))?;
Ok(SearchParams(params.assume_init()))
}
}
pub fn set_n_probes(self, n_probes: u32) -> SearchParams {
unsafe {
(*self.0).n_probes = n_probes;
}
self
}
}
impl fmt::Debug for SearchParams {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "SearchParams {{ params: {:?} }}", unsafe { *self.0 })
}
}
impl Drop for SearchParams {
fn drop(&mut self) {
if let Err(e) = check_cuvs(unsafe { ffi::cuvsIvfFlatSearchParamsDestroy(self.0) }) {
write!(
stderr(),
"failed to call cuvsIvfFlatSearchParamsDestroy {:?}",
e
)
.expect("failed to write to stderr");
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_search_params() {
let params = SearchParams::new().unwrap().set_n_probes(128);
unsafe {
assert_eq!((*params.0).n_probes, 128);
}
}
}