use {
super::{config::PrimitiveConfig, Direction, Operation, PropType},
crate::{engine::Engine, error::DnnlError},
onednnl_sys::{dnnl_primitive_desc_destroy, dnnl_primitive_desc_t},
std::{marker::PhantomData, sync::Arc},
};
pub struct PrimitiveDescriptor<
'a,
D: Direction,
P: PropType<D>,
C: PrimitiveConfig<'a, D, P> + Sized,
> {
pub handle: dnnl_primitive_desc_t,
pub config: C,
pub(crate) _marker_a: PhantomData<&'a ()>,
pub(crate) _marker_d: PhantomData<D>,
pub(crate) _marker_p: PhantomData<P>,
}
impl<'a, D: Direction, P: PropType<D>, C: PrimitiveConfig<'a, D, P> + Sized>
PrimitiveDescriptor<'a, D, P, C>
{
pub fn new<O: Operation<'a, D, P, OperationConfig = C>>(
config: O::OperationConfig,
engine: Arc<Engine>,
) -> Result<PrimitiveDescriptor<'a, D, P, C>, DnnlError> {
config.create_primitive_desc(engine)
}
}
impl<'a, D: Direction, P: PropType<D>, C: PrimitiveConfig<'a, D, P>> Drop
for PrimitiveDescriptor<'a, D, P, C>
{
fn drop(&mut self) {
unsafe { dnnl_primitive_desc_destroy(self.handle) };
}
}