use crate::rocfft::error::{Error, Result, check_error};
use crate::rocfft::ffi;
use std::marker::PhantomData;
use std::ptr;
pub struct ExecutionInfo {
handle: ffi::rocfft_execution_info,
_marker: PhantomData<*mut ()>, }
impl ExecutionInfo {
pub fn new() -> Result<Self> {
let mut handle: ffi::rocfft_execution_info = ptr::null_mut();
unsafe {
check_error(ffi::rocfft_execution_info_create(&mut handle))?;
}
Ok(ExecutionInfo {
handle,
_marker: PhantomData,
})
}
pub unsafe fn set_work_buffer(
&mut self,
buffer: *mut std::ffi::c_void,
size_in_bytes: usize,
) -> Result<()> {
if self.handle.is_null() {
return Err(Error::ObjectDestroyed);
}
if buffer.is_null() && size_in_bytes > 0 {
return Err(Error::NullPointer);
}
unsafe {
check_error(ffi::rocfft_execution_info_set_work_buffer(
self.handle,
buffer,
size_in_bytes,
))
}
}
pub unsafe fn set_stream(&mut self, stream: *mut std::ffi::c_void) -> Result<()> {
if self.handle.is_null() {
return Err(Error::ObjectDestroyed);
}
unsafe { check_error(ffi::rocfft_execution_info_set_stream(self.handle, stream)) }
}
pub fn set_load_callback(
&mut self,
callbacks: &mut [*mut std::ffi::c_void],
user_data: &mut [*mut std::ffi::c_void],
shared_mem_bytes: usize,
) -> Result<()> {
if self.handle.is_null() {
return Err(Error::ObjectDestroyed);
}
unsafe {
check_error(ffi::rocfft_execution_info_set_load_callback(
self.handle,
callbacks.as_mut_ptr(),
user_data.as_mut_ptr(),
shared_mem_bytes,
))
}
}
pub fn set_store_callback(
&mut self,
callbacks: &mut [*mut std::ffi::c_void],
user_data: &mut [*mut std::ffi::c_void],
shared_mem_bytes: usize,
) -> Result<()> {
if self.handle.is_null() {
return Err(Error::ObjectDestroyed);
}
unsafe {
check_error(ffi::rocfft_execution_info_set_store_callback(
self.handle,
callbacks.as_mut_ptr(),
user_data.as_mut_ptr(),
shared_mem_bytes,
))
}
}
pub(crate) fn as_ptr(&self) -> ffi::rocfft_execution_info {
self.handle
}
}
impl Drop for ExecutionInfo {
fn drop(&mut self) {
if !self.handle.is_null() {
unsafe {
ffi::rocfft_execution_info_destroy(self.handle);
}
self.handle = ptr::null_mut();
}
}
}