use objc::Message;
use std::ops::Deref;
mod commandbuffer;
mod commandqueue;
mod depthstencil;
mod device;
mod drawable;
mod encoder;
mod layer;
mod library;
mod misc;
mod pipeline;
mod resource;
mod sampler;
pub use commandbuffer::*;
pub use commandqueue::*;
pub use depthstencil::*;
pub use device::*;
pub use drawable::*;
pub use encoder::*;
pub use layer::*;
pub use library::*;
pub use misc::*;
pub use pipeline::*;
pub use resource::*;
pub use sampler::*;
pub mod import_objc_macros {
pub use objc::{class, msg_send, sel, sel_impl};
}
type ObjectPointerMarker = objc::runtime::Object;
#[derive(Copy, Clone)]
#[repr(C)]
pub struct ObjectPointer(*mut ObjectPointerMarker);
impl Deref for ObjectPointer {
type Target = ObjectPointerMarker;
fn deref(&self) -> &Self::Target {
unsafe { &*self.0 }
}
}
unsafe impl Message for ObjectPointer {}
pub trait Array<T: Object>: Object {
unsafe fn set_object_at_indexed_subscript(&self, index: NSUInteger, obj: &T) {
use crate::import_objc_macros::*;
msg_send![self.get_ptr(), setObject:obj.get_ptr() atIndexedSubscript:index]
}
}
pub trait Object: Drop {
unsafe fn from_ptr(ptr: ObjectPointer) -> Self
where
Self: Sized;
fn get_ptr(&self) -> ObjectPointer;
}
pub type NSInteger = i64;
pub type NSUInteger = u64;
pub type CGFloat = f64;
#[macro_export]
macro_rules! handle {
($name:ident) => {
impl Drop for $name {
fn drop(&mut self) {
use crate::import_objc_macros::*;
unsafe {
let _: () = msg_send![self.get_ptr(), release];
}
}
}
};
}