use libc::{c_uint, c_void, size_t};
use crate::{core_foundation::CFTypeID, object};
use super::CGFloat;
pub type CGFunctionRef = CGFunction;
object! {
unsafe pub struct CGFunction;
}
impl CGFunction {
pub unsafe fn create(
info: *mut c_void,
domain_dimension: size_t,
domain: *const CGFloat,
range_dimension: size_t,
range: *const size_t,
callbacks: *const CGFunctionCallbacks,
) -> CGFunctionRef {
CGFunctionCreate(
info,
domain_dimension,
domain,
range_dimension,
range,
callbacks,
)
}
pub unsafe fn release(function: CGFunctionRef) {
CGFunctionRelease(function);
}
pub unsafe fn retain(function: CGFunctionRef) -> CGFunctionRef {
CGFunctionRetain(function)
}
pub unsafe fn type_id() -> CFTypeID {
CGFunctionGetTypeID()
}
}
extern "C" {
fn CGFunctionCreate(
info: *mut c_void,
domainDimension: size_t,
domain: *const CGFloat,
rangeDimension: size_t,
range: *const size_t,
callbacks: *const CGFunctionCallbacks,
) -> CGFunctionRef;
fn CGFunctionRelease(function: CGFunctionRef);
fn CGFunctionRetain(function: CGFunctionRef) -> CGFunctionRef;
fn CGFunctionGetTypeID() -> CFTypeID;
}
pub type CGFunctionEvaluateCallback =
extern "C" fn(info: *mut c_void, in_values: *const CGFloat, out_values: *mut CGFloat);
pub type CGFunctionReleaseInfoCallback = extern "C" fn(info: *mut c_void);
#[derive(Debug)]
pub struct CGFunctionCallbacks {
pub version: c_uint,
pub evaluate: *mut CGFunctionEvaluateCallback,
pub release_info: *mut CGFunctionReleaseInfoCallback,
}
#[cfg(test)]
mod tests {
use std::ptr;
use super::*;
#[test]
fn test_create() {
unsafe {
let callbacks = CGFunctionCallbacks {
version: 0,
evaluate: ptr::null_mut(),
release_info: ptr::null_mut(),
};
let function =
CGFunction::create(ptr::null_mut(), 0, ptr::null(), 0, ptr::null(), &callbacks);
let id = CGFunction::type_id();
assert!(id != 0);
CGFunction::release(function);
}
}
}