use std;
use std::os::raw::c_void;
use std::ptr::null_mut;
pub enum ListResult<T> {
Item(T),
End,
Error,
}
#[inline]
pub(crate) fn unwrap_optional_callback<T>(cb: Option<(T, *mut c_void)>) -> (Option<T>, *mut c_void) {
match cb {
Some((f, d)) => (Some(f), d),
None => (None, null_mut::<c_void>()),
}
}
pub(crate) struct MultiUseCallback<ClosureProto: ?Sized, ProxyProto> {
saved: Option<*mut Box<ClosureProto>>,
proxy: std::marker::PhantomData<*const ProxyProto>,
}
impl<ClosureProto: ?Sized, ProxyProto> Default for MultiUseCallback<ClosureProto, ProxyProto> {
fn default() -> Self {
MultiUseCallback::<ClosureProto, ProxyProto> { saved: None, proxy: std::marker::PhantomData }
}
}
impl<ClosureProto: ?Sized, ProxyProto> MultiUseCallback<ClosureProto, ProxyProto> {
pub fn new(cb: Option<Box<ClosureProto>>) -> MultiUseCallback<ClosureProto, ProxyProto> {
match cb {
Some(f) => MultiUseCallback::<ClosureProto, ProxyProto> {
saved: Some(Box::into_raw(Box::new(f))),
proxy: std::marker::PhantomData,
},
None => Default::default(),
}
}
pub fn get_capi_params(&self, proxy: ProxyProto) -> (Option<ProxyProto>, *mut c_void) {
match self.saved {
Some(ref f) => (Some(proxy), *f as *mut c_void),
None => (None, std::ptr::null_mut::<c_void>()),
}
}
}
impl<ClosureProto: ?Sized, ProxyProto> Drop for MultiUseCallback<ClosureProto, ProxyProto> {
fn drop(&mut self) {
if self.saved.is_some() {
let _to_drop = unsafe { Box::from_raw(self.saved.unwrap()) };
}
}
}