v2 / vlib / macos / objc_bridge.h
190 lines · 148 sloc · 6.98 KB · 726559c029ba7e9171e3f7cb5dcfd204ee42f7e3
Raw
1#include <stdbool.h>
2#include <objc/message.h>
3#include <objc/runtime.h>
4
5typedef struct macos_rect {
6 double x;
7 double y;
8 double width;
9 double height;
10} macos_rect;
11
12static inline void* macos_objc_get_class(const char* name) {
13 return (__bridge void*)objc_getClass(name);
14}
15
16static inline void* macos_objc_get_protocol(const char* name) {
17 return (__bridge void*)objc_getProtocol(name);
18}
19
20static inline void* macos_sel_register_name(const char* name) {
21 return (void*)sel_registerName(name);
22}
23
24static inline void* macos_objc_allocate_class_pair(void* superclass, const char* name, size_t extra_bytes) {
25 return (__bridge void*)objc_allocateClassPair((__bridge Class)superclass, name, extra_bytes);
26}
27
28static inline void macos_objc_register_class_pair(void* cls) {
29 objc_registerClassPair((__bridge Class)cls);
30}
31
32static inline bool macos_class_add_method(void* cls, void* name, void* imp, const char* types) {
33 return class_addMethod((__bridge Class)cls, (SEL)name, (IMP)imp, types);
34}
35
36static inline bool macos_class_add_ivar(void* cls, const char* name, size_t size, uint8_t alignment, const char* types) {
37 return class_addIvar((__bridge Class)cls, name, size, alignment, types);
38}
39
40static inline bool macos_class_add_protocol(void* cls, void* protocol) {
41 return class_addProtocol((__bridge Class)cls, (__bridge Protocol*)protocol);
42}
43
44static inline void macos_set_associated_object(void* obj, const void* key, void* value, uintptr_t policy) {
45 objc_setAssociatedObject((__bridge id)obj, key, (__bridge id)value, (objc_AssociationPolicy)policy);
46}
47
48static inline void* macos_get_associated_object(void* obj, const void* key) {
49 return (__bridge void*)objc_getAssociatedObject((__bridge id)obj, key);
50}
51
52static inline void macos_objc_set_ptr_ivar(void* obj, const char* name, void* value) {
53 if (obj == NULL) {
54 return;
55 }
56 Ivar ivar = class_getInstanceVariable(object_getClass((__bridge id)obj), name);
57 if (ivar == NULL) {
58 return;
59 }
60 ptrdiff_t offset = ivar_getOffset(ivar);
61 *(void**)(((char*)obj) + offset) = value;
62}
63
64static inline void* macos_objc_get_ptr_ivar(void* obj, const char* name) {
65 if (obj == NULL) {
66 return NULL;
67 }
68 Ivar ivar = class_getInstanceVariable(object_getClass((__bridge id)obj), name);
69 if (ivar == NULL) {
70 return NULL;
71 }
72 ptrdiff_t offset = ivar_getOffset(ivar);
73 return *(void**)(((char*)obj) + offset);
74}
75
76static inline void* macos_objc_msg_id0(void* obj, void* sel) {
77 return ((void* (*)(void*, void*))objc_msgSend)(obj, sel);
78}
79
80static inline void* macos_objc_msg_id1(void* obj, void* sel, void* a0) {
81 return ((void* (*)(void*, void*, void*))objc_msgSend)(obj, sel, a0);
82}
83
84static inline void* macos_objc_msg_id2(void* obj, void* sel, void* a0, void* a1) {
85 return ((void* (*)(void*, void*, void*, void*))objc_msgSend)(obj, sel, a0, a1);
86}
87
88static inline void* macos_objc_msg_id3(void* obj, void* sel, void* a0, void* a1, void* a2) {
89 return ((void* (*)(void*, void*, void*, void*, void*))objc_msgSend)(obj, sel, a0, a1, a2);
90}
91
92static inline void* macos_objc_msg_id4(void* obj, void* sel, void* a0, void* a1, void* a2, void* a3) {
93 return ((void* (*)(void*, void*, void*, void*, void*, void*))objc_msgSend)(obj, sel, a0, a1, a2, a3);
94}
95
96static inline void* macos_objc_msg_id_rect(void* obj, void* sel, macos_rect rect) {
97 return ((void* (*)(void*, void*, macos_rect))objc_msgSend)(obj, sel, rect);
98}
99
100static inline void* macos_objc_msg_id_rect_bool(void* obj, void* sel, macos_rect rect, bool a1) {
101 return ((void* (*)(void*, void*, macos_rect, bool))objc_msgSend)(obj, sel, rect, a1);
102}
103
104static inline void* macos_objc_msg_id_rect_obj(void* obj, void* sel, macos_rect rect, void* a1) {
105 return ((void* (*)(void*, void*, macos_rect, void*))objc_msgSend)(obj, sel, rect, a1);
106}
107
108static inline void* macos_objc_msg_id_rect_u64_u64_bool(void* obj, void* sel, macos_rect rect, unsigned long long a1, unsigned long long a2, bool a3) {
109 return ((void* (*)(void*, void*, macos_rect, unsigned long long, unsigned long long, bool))objc_msgSend)(obj, sel, rect, a1, a2, a3);
110}
111
112static inline void* macos_objc_msg_id_obj_u64_bool(void* obj, void* sel, void* a0, unsigned long long a1, bool a2) {
113 return ((void* (*)(void*, void*, void*, unsigned long long, bool))objc_msgSend)(obj, sel, a0, a1, a2);
114}
115
116static inline void* macos_objc_msg_id_obj_sel_obj(void* obj, void* sel, void* a0, void* a1, void* a2) {
117 return ((void* (*)(void*, void*, void*, void*, void*))objc_msgSend)(obj, sel, a0, a1, a2);
118}
119
120static inline void* macos_objc_msg_id_f64(void* obj, void* sel, double a0) {
121 return ((void* (*)(void*, void*, double))objc_msgSend)(obj, sel, a0);
122}
123
124static inline void* macos_objc_msg_id_u64(void* obj, void* sel, unsigned long long a0) {
125 return ((void* (*)(void*, void*, unsigned long long))objc_msgSend)(obj, sel, a0);
126}
127
128static inline void macos_objc_msg_void0(void* obj, void* sel) {
129 ((void (*)(void*, void*))objc_msgSend)(obj, sel);
130}
131
132static inline void macos_objc_msg_void1(void* obj, void* sel, void* a0) {
133 ((void (*)(void*, void*, void*))objc_msgSend)(obj, sel, a0);
134}
135
136static inline void macos_objc_msg_void2(void* obj, void* sel, void* a0, void* a1) {
137 ((void (*)(void*, void*, void*, void*))objc_msgSend)(obj, sel, a0, a1);
138}
139
140static inline void macos_objc_msg_void3(void* obj, void* sel, void* a0, void* a1, void* a2) {
141 ((void (*)(void*, void*, void*, void*, void*))objc_msgSend)(obj, sel, a0, a1, a2);
142}
143
144static inline void macos_objc_msg_void_bool(void* obj, void* sel, bool a0) {
145 ((void (*)(void*, void*, bool))objc_msgSend)(obj, sel, a0);
146}
147
148static inline void macos_objc_msg_void_i64(void* obj, void* sel, long long a0) {
149 ((void (*)(void*, void*, long long))objc_msgSend)(obj, sel, a0);
150}
151
152static inline void macos_objc_msg_void_u64(void* obj, void* sel, unsigned long long a0) {
153 ((void (*)(void*, void*, unsigned long long))objc_msgSend)(obj, sel, a0);
154}
155
156static inline void macos_objc_msg_void_f64(void* obj, void* sel, double a0) {
157 ((void (*)(void*, void*, double))objc_msgSend)(obj, sel, a0);
158}
159
160static inline void macos_objc_msg_void_rect(void* obj, void* sel, macos_rect rect) {
161 ((void (*)(void*, void*, macos_rect))objc_msgSend)(obj, sel, rect);
162}
163
164static inline void macos_objc_msg_void_rect_bool_bool(void* obj, void* sel, macos_rect rect, bool a1, bool a2) {
165 ((void (*)(void*, void*, macos_rect, bool, bool))objc_msgSend)(obj, sel, rect, a1, a2);
166}
167
168static inline bool macos_objc_msg_bool0(void* obj, void* sel) {
169 return ((bool (*)(void*, void*))objc_msgSend)(obj, sel);
170}
171
172static inline bool macos_objc_msg_bool1(void* obj, void* sel, void* a0) {
173 return ((bool (*)(void*, void*, void*))objc_msgSend)(obj, sel, a0);
174}
175
176static inline long long macos_objc_msg_i64(void* obj, void* sel) {
177 return ((long long (*)(void*, void*))objc_msgSend)(obj, sel);
178}
179
180static inline unsigned long long macos_objc_msg_u64(void* obj, void* sel) {
181 return ((unsigned long long (*)(void*, void*))objc_msgSend)(obj, sel);
182}
183
184static inline double macos_objc_msg_f64(void* obj, void* sel) {
185 return ((double (*)(void*, void*))objc_msgSend)(obj, sel);
186}
187
188static inline macos_rect macos_objc_msg_rect(void* obj, void* sel) {
189 return ((macos_rect (*)(void*, void*))objc_msgSend)(obj, sel);
190}
191