use crate::error::{KunQuantError, Result};
use crate::ffi;
use std::collections::HashMap;
use std::ffi::CString;
pub struct BufferNameMap {
handle: ffi::KunBufferNameMapHandle,
_buffer_names: HashMap<String, CString>,
}
impl BufferNameMap {
pub fn new() -> Result<Self> {
let handle = unsafe { ffi::kunCreateBufferNameMap() };
if handle.is_null() {
return Err(KunQuantError::BufferNameMapCreationFailed);
}
Ok(BufferNameMap {
handle,
_buffer_names: HashMap::new(),
})
}
pub unsafe fn set_buffer<N: AsRef<str>>(&mut self, name: N, buffer: *mut f32) -> Result<()> {
let name_str = name.as_ref();
let c_name = CString::new(name_str)?;
unsafe {
ffi::kunSetBufferNameMap(self.handle, c_name.as_ptr(), buffer);
}
self._buffer_names.insert(name_str.to_string(), c_name);
Ok(())
}
pub fn set_buffer_slice<N: AsRef<str>>(&mut self, name: N, buffer: &mut [f32]) -> Result<()> {
unsafe { self.set_buffer(name, buffer.as_mut_ptr()) }
}
pub fn erase_buffer<N: AsRef<str>>(&mut self, name: N) -> Result<()> {
let name_str = name.as_ref();
if let Some(c_name) = self._buffer_names.get(name_str) {
unsafe {
ffi::kunEraseBufferNameMap(self.handle, c_name.as_ptr());
}
self._buffer_names.remove(name_str);
}
Ok(())
}
pub(crate) fn handle(&self) -> ffi::KunBufferNameMapHandle {
self.handle
}
}
impl Drop for BufferNameMap {
fn drop(&mut self) {
if !self.handle.is_null() {
unsafe {
ffi::kunDestoryBufferNameMap(self.handle);
}
}
}
}
impl Default for BufferNameMap {
fn default() -> Self {
Self::new().expect("Failed to create BufferNameMap")
}
}