use libc::{c_long, c_ulong, c_uint};
pub type Boolean = u8;
pub type CFIndex = c_long;
#[allow(non_camel_case_types)]
pub type mach_port_t = c_uint;
pub trait CFIndexConvertible {
fn to_CFIndex(self) -> CFIndex;
}
impl CFIndexConvertible for usize {
#[inline]
fn to_CFIndex(self) -> CFIndex {
let max_CFIndex = CFIndex::max_value();
if self > (max_CFIndex as usize) {
panic!("value out of range")
}
self as CFIndex
}
}
pub type CFOptionFlags = u32;
#[allow(dead_code)]
#[repr(C)]
#[derive(Clone, Copy)]
pub struct CFRange {
location: CFIndex,
length: CFIndex
}
impl CFRange {
pub fn init(offset: CFIndex, length: CFIndex) -> CFRange {
CFRange {
location: offset,
length: length,
}
}
}
#[repr(C)]
struct __CFAllocator;
pub type CFAllocatorRef = *const __CFAllocator;
#[repr(C)]
struct __CFNull;
pub type CFNullRef = *const __CFNull;
pub type CFHashCode = c_ulong;
pub type CFTypeID = c_ulong;
#[repr(C)]
struct __CFType;
pub type CFTypeRef = *const __CFType;
pub struct CFType {
obj: CFTypeRef,
}
impl Clone for CFType {
#[inline]
fn clone(&self) -> CFType {
unsafe {
TCFType::wrap_under_get_rule(self.obj)
}
}
}
impl Drop for CFType {
fn drop(&mut self) {
unsafe {
CFRelease(self.obj)
}
}
}
pub trait TCFType<ConcreteTypeRef> {
fn as_concrete_TypeRef(&self) -> ConcreteTypeRef;
unsafe fn wrap_under_create_rule(obj: ConcreteTypeRef) -> Self;
fn type_id() -> CFTypeID;
#[inline]
fn as_CFType(&self) -> CFType {
unsafe {
TCFType::wrap_under_get_rule(self.as_CFTypeRef())
}
}
fn as_CFTypeRef(&self) -> CFTypeRef;
unsafe fn wrap_under_get_rule(reference: ConcreteTypeRef) -> Self;
#[inline]
fn retain_count(&self) -> CFIndex {
unsafe {
CFGetRetainCount(self.as_CFTypeRef())
}
}
#[inline]
fn type_of(&self) -> CFTypeID {
unsafe {
CFGetTypeID(self.as_CFTypeRef())
}
}
fn show(&self) {
unsafe {
CFShow(self.as_CFTypeRef())
}
}
#[inline]
fn instance_of<OtherConcreteTypeRef,OtherCFType:TCFType<OtherConcreteTypeRef>>(&self) -> bool {
self.type_of() == <OtherCFType as TCFType<_>>::type_id()
}
}
impl TCFType<CFTypeRef> for CFType {
#[inline]
fn as_concrete_TypeRef(&self) -> CFTypeRef {
self.obj
}
#[inline]
unsafe fn wrap_under_get_rule(reference: CFTypeRef) -> CFType {
let reference: CFTypeRef = CFRetain(reference);
TCFType::wrap_under_create_rule(reference)
}
#[inline]
fn as_CFTypeRef(&self) -> CFTypeRef {
self.as_concrete_TypeRef()
}
#[inline]
unsafe fn wrap_under_create_rule(obj: CFTypeRef) -> CFType {
CFType {
obj: obj,
}
}
#[inline]
fn type_id() -> CFTypeID {
0
}
#[inline]
fn instance_of<OtherConcreteTypeRef,OtherCFType:TCFType<OtherConcreteTypeRef>>(&self) -> bool {
true
}
}
#[link(name = "CoreFoundation", kind = "framework")]
extern {
pub static kCFAllocatorDefault: CFAllocatorRef;
pub static kCFAllocatorSystemDefault: CFAllocatorRef;
pub static kCFAllocatorMalloc: CFAllocatorRef;
pub static kCFAllocatorMallocZone: CFAllocatorRef;
pub static kCFAllocatorNull: CFAllocatorRef;
pub static kCFAllocatorUseContext: CFAllocatorRef;
pub static kCFNull: CFNullRef;
pub fn CFGetRetainCount(cf: CFTypeRef) -> CFIndex;
pub fn CFGetTypeID(cf: CFTypeRef) -> CFTypeID;
pub fn CFHash(cf: CFTypeRef) -> CFHashCode;
pub fn CFRelease(cf: CFTypeRef);
pub fn CFRetain(cf: CFTypeRef) -> CFTypeRef;
pub fn CFShow(obj: CFTypeRef);
}