aboutsummaryrefslogtreecommitdiff
path: root/core/sys/darwin/Foundation/NSObject.odin
diff options
context:
space:
mode:
Diffstat (limited to 'core/sys/darwin/Foundation/NSObject.odin')
-rw-r--r--core/sys/darwin/Foundation/NSObject.odin91
1 files changed, 91 insertions, 0 deletions
diff --git a/core/sys/darwin/Foundation/NSObject.odin b/core/sys/darwin/Foundation/NSObject.odin
new file mode 100644
index 000000000..31ece47a1
--- /dev/null
+++ b/core/sys/darwin/Foundation/NSObject.odin
@@ -0,0 +1,91 @@
+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 \ No newline at end of file