opus-codec 0.1.2

Safe Rust bindings for the Opus audio codec
Documentation
use crate::Ownership;
use std::ptr::NonNull;

pub(crate) type DropFn<T> = unsafe extern "C" fn(*mut T);

pub(crate) struct RawHandle<T> {
    ptr: NonNull<T>,
    ownership: Ownership,
    drop_fn: DropFn<T>,
}

impl<T> RawHandle<T> {
    pub(crate) fn new(ptr: NonNull<T>, ownership: Ownership, drop_fn: DropFn<T>) -> Self {
        Self {
            ptr,
            ownership,
            drop_fn,
        }
    }

    pub(crate) fn as_ptr(&self) -> *mut T {
        self.ptr.as_ptr()
    }
}

impl<T> Drop for RawHandle<T> {
    fn drop(&mut self) {
        if self.ownership == Ownership::Owned {
            unsafe { (self.drop_fn)(self.ptr.as_ptr()) };
        }
    }
}