mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-31 18:32:12 +00:00
91 lines
2.7 KiB
Odin
91 lines
2.7 KiB
Odin
package objc_Foundation
|
|
|
|
import "base:intrinsics"
|
|
|
|
methodSignatureForSelector :: proc "c" (obj: ^Object, selector: SEL) -> rawptr {
|
|
return msgSend(rawptr, obj, "methodSignatureForSelector:", selector)
|
|
}
|
|
|
|
respondsToSelector :: proc "c" (obj: ^Object, selector: SEL) -> BOOL {
|
|
return msgSend(BOOL, obj, "respondsToSelector:", selector)
|
|
}
|
|
|
|
msgSendSafeCheck :: proc "c" (obj: ^Object, selector: SEL) -> BOOL {
|
|
return respondsToSelector(obj, selector) || methodSignatureForSelector(obj, selector) != nil
|
|
}
|
|
|
|
|
|
@(objc_class="NSObject")
|
|
Object :: struct {using _: intrinsics.objc_object}
|
|
|
|
@(objc_class="NSObject")
|
|
Copying :: struct($T: typeid) {using _: Object}
|
|
|
|
alloc :: proc "c" ($T: typeid) -> ^T where intrinsics.type_is_subtype_of(T, Object) {
|
|
return msgSend(^T, T, "alloc")
|
|
}
|
|
@(objc_type=Object, objc_name="init")
|
|
init :: proc "c" (self: ^$T) -> ^T where intrinsics.type_is_subtype_of(T, Object) {
|
|
return msgSend(^T, self, "init")
|
|
}
|
|
@(objc_type=Object, objc_name="copy")
|
|
copy :: proc "c" (self: ^Copying($T)) -> ^T where intrinsics.type_is_subtype_of(T, Object) {
|
|
return msgSend(^T, self, "copy")
|
|
}
|
|
|
|
new :: proc "c" ($T: typeid) -> ^T where intrinsics.type_is_subtype_of(T, Object) {
|
|
return init(alloc(T))
|
|
}
|
|
|
|
@(objc_type=Object, objc_name="retain")
|
|
retain :: proc "c" (self: ^Object) {
|
|
_ = msgSend(^Object, self, "retain")
|
|
}
|
|
@(objc_type=Object, objc_name="release")
|
|
release :: proc "c" (self: ^Object) {
|
|
msgSend(nil, self, "release")
|
|
}
|
|
@(objc_type=Object, objc_name="autorelease")
|
|
autorelease :: proc "c" (self: ^Object) {
|
|
msgSend(nil, self, "autorelease")
|
|
}
|
|
@(objc_type=Object, objc_name="retainCount")
|
|
retainCount :: proc "c" (self: ^Object) -> UInteger {
|
|
return msgSend(UInteger, self, "retainCount")
|
|
}
|
|
@(objc_type=Object, objc_name="class")
|
|
class :: proc "c" (self: ^Object) -> Class {
|
|
return msgSend(Class, self, "class")
|
|
}
|
|
|
|
@(objc_type=Object, objc_name="hash")
|
|
hash :: proc "c" (self: ^Object) -> UInteger {
|
|
return msgSend(UInteger, self, "hash")
|
|
}
|
|
|
|
@(objc_type=Object, objc_name="isEqual")
|
|
isEqual :: proc "c" (self, pObject: ^Object) -> BOOL {
|
|
return msgSend(BOOL, self, "isEqual:", pObject)
|
|
}
|
|
|
|
@(objc_type=Object, objc_name="description")
|
|
description :: proc "c" (self: ^Object) -> ^String {
|
|
return msgSend(^String, self, "description")
|
|
}
|
|
|
|
@(objc_type=Object, objc_name="debugDescription")
|
|
debugDescription :: proc "c" (self: ^Object) -> ^String {
|
|
if msgSendSafeCheck(self, intrinsics.objc_find_selector("debugDescription")) {
|
|
return msgSend(^String, self, "debugDescription")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
bridgingCast :: proc "c" ($T: typeid, obj: ^Object) where intrinsics.type_is_pointer(T), intrinsics.type_is_subtype_of(T, ^Object) {
|
|
return (T)(obj)
|
|
}
|
|
|
|
|
|
@(objc_class="NSCoder")
|
|
Coder :: struct {using _: Object}
|
|
// TODO(bill): Implement all the methods for this massive type |