use std::os::raw::c_void;
use crate::base::{CFAllocatorRef, CFComparatorFunction, CFIndex, CFTypeID};
use crate::string::CFStringRef;
#[repr(C)]
pub struct __CFTree(c_void);
pub type CFTreeRef = *mut __CFTree;
pub type CFTreeRetainCallBack = extern "C" fn(info: *const c_void) -> *const c_void;
pub type CFTreeReleaseCallBack = extern "C" fn(info: *const c_void);
pub type CFTreeCopyDescriptionCallBack = extern "C" fn(info: *const c_void) -> CFStringRef;
pub type CFTreeApplierFunction = extern "C" fn(value: *const c_void, context: *mut c_void);
#[repr(C)]
pub struct CFTreeContext {
pub version: CFIndex,
pub info: *mut c_void,
pub retain: CFTreeRetainCallBack,
pub release: CFTreeReleaseCallBack,
pub copyDescription: CFTreeCopyDescriptionCallBack,
}
extern "C" {
pub fn CFTreeCreate(allocator: CFAllocatorRef, context: *const CFTreeContext) -> CFTreeRef;
pub fn CFTreeAppendChild(tree: CFTreeRef, newChild: CFTreeRef);
pub fn CFTreeInsertSibling(tree: CFTreeRef, newSibling: CFTreeRef);
pub fn CFTreeRemoveAllChildren(tree: CFTreeRef);
pub fn CFTreePrependChild(tree: CFTreeRef, newChild: CFTreeRef);
pub fn CFTreeRemove(tree: CFTreeRef);
pub fn CFTreeSetContext(tree: CFTreeRef, context: *const CFTreeContext);
pub fn CFTreeSortChildren(
tree: CFTreeRef,
comparator: CFComparatorFunction,
context: *mut c_void,
);
pub fn CFTreeFindRoot(tree: CFTreeRef) -> CFTreeRef;
pub fn CFTreeGetChildAtIndex(tree: CFTreeRef, idx: CFIndex) -> CFTreeRef;
pub fn CFTreeGetChildCount(tree: CFTreeRef) -> CFIndex;
pub fn CFTreeGetChildren(tree: CFTreeRef, children: *mut CFTreeRef);
pub fn CFTreeGetContext(tree: CFTreeRef, context: *mut CFTreeContext);
pub fn CFTreeGetFirstChild(tree: CFTreeRef) -> CFTreeRef;
pub fn CFTreeGetNextSibling(tree: CFTreeRef) -> CFTreeRef;
pub fn CFTreeGetParent(tree: CFTreeRef) -> CFTreeRef;
pub fn CFTreeApplyFunctionToChildren(
tree: CFTreeRef,
applier: CFTreeApplierFunction,
context: *mut c_void,
);
pub fn CFTreeGetTypeID() -> CFTypeID;
}