nnapi 0.2.0

Provides a safe abstraction of the Android NNAPI FFI bindings.
Documentation
use nnapi_sys::{
    ANeuralNetworksBurst, ANeuralNetworksBurst_create, ANeuralNetworksBurst_free, ResultCode,
};
use std::{
    ops::{Deref, DerefMut},
    ptr::{null_mut, NonNull},
};

use crate::{Compilation, IntoResult};

pub struct Burst {
    inner: NonNull<ANeuralNetworksBurst>,
}

impl Burst {
    pub fn new(compilation: &mut Compilation) -> crate::Result<Burst> {
        let mut burst = null_mut();
        unsafe { ANeuralNetworksBurst_create(&mut **compilation, &mut burst) }.into_result()?;

        Ok(Burst {
            inner: NonNull::new(burst).ok_or(ResultCode::ANEURALNETWORKS_UNEXPECTED_NULL)?,
        })
    }
}

impl Deref for Burst {
    type Target = ANeuralNetworksBurst;

    #[inline]
    fn deref(&self) -> &Self::Target {
        unsafe { self.inner.as_ref() }
    }
}

impl DerefMut for Burst {
    #[inline]
    fn deref_mut(&mut self) -> &mut Self::Target {
        unsafe { self.inner.as_mut() }
    }
}

impl Drop for Burst {
    fn drop(&mut self) {
        unsafe {
            ANeuralNetworksBurst_free(self.inner.as_mut());
        }
    }
}