use crate::rocfft::bindings;
use crate::rocfft::error::{Error, Result, check_dimensions, check_error};
use std::marker::PhantomData;
use std::ptr;
pub struct Brick {
handle: bindings::rocfft_brick,
_marker: PhantomData<*mut ()>, }
impl Brick {
pub fn new(
field_lower: &[usize],
field_upper: &[usize],
brick_stride: &[usize],
device_id: i32,
) -> Result<Self> {
if field_lower.len() != field_upper.len() || field_lower.len() != brick_stride.len() {
return Err(Error::InvalidDimensions);
}
for (i, (&lower, &upper)) in field_lower.iter().zip(field_upper.iter()).enumerate() {
if lower >= upper {
return Err(Error::InvalidDimensions);
}
}
let dim = field_lower.len();
let mut handle: bindings::rocfft_brick = ptr::null_mut();
unsafe {
check_error(bindings::rocfft_brick_create(
&mut handle,
field_lower.as_ptr(),
field_upper.as_ptr(),
brick_stride.as_ptr(),
dim,
device_id,
))?;
}
Ok(Brick {
handle,
_marker: PhantomData,
})
}
pub(crate) fn as_ptr(&self) -> bindings::rocfft_brick {
self.handle
}
}
impl Drop for Brick {
fn drop(&mut self) {
if !self.handle.is_null() {
unsafe {
bindings::rocfft_brick_destroy(self.handle);
}
self.handle = ptr::null_mut();
}
}
}
pub struct Field {
handle: bindings::rocfft_field,
_marker: PhantomData<*mut ()>, }
impl Field {
pub fn new() -> Result<Self> {
let mut handle: bindings::rocfft_field = ptr::null_mut();
unsafe {
check_error(bindings::rocfft_field_create(&mut handle))?;
}
Ok(Field {
handle,
_marker: PhantomData,
})
}
pub fn add_brick(&mut self, brick: &Brick) -> Result<()> {
if self.handle.is_null() {
return Err(Error::ObjectDestroyed);
}
unsafe {
check_error(bindings::rocfft_field_add_brick(
self.handle,
brick.as_ptr(),
))
}
}
pub(crate) fn as_ptr(&self) -> bindings::rocfft_field {
self.handle
}
}
impl Drop for Field {
fn drop(&mut self) {
if !self.handle.is_null() {
unsafe {
bindings::rocfft_field_destroy(self.handle);
}
self.handle = ptr::null_mut();
}
}
}