#ifndef HALIDE_OBJC_SUPPORT_H
#define HALIDE_OBJC_SUPPORT_H
extern "C" {
typedef void *objc_id;
typedef void *objc_sel;
extern objc_id objc_getClass(const char *name);
extern objc_sel sel_getUid(const char *string);
extern objc_id objc_msgSend(objc_id self, objc_sel op, ...);
void NSLog(objc_id format, ...);
}
namespace Halide { namespace Runtime { namespace Internal {
WEAK objc_id create_autorelease_pool() {
objc_id pool =
objc_msgSend(objc_msgSend(objc_getClass("NSAutoreleasePool"),
sel_getUid("alloc")), sel_getUid("init"));
return pool;
}
WEAK void drain_autorelease_pool(objc_id pool) {
objc_msgSend(pool, sel_getUid("drain"));
}
WEAK void release_ns_object(objc_id obj) {
objc_msgSend(obj, sel_getUid("release"));
}
WEAK objc_id wrap_string_as_ns_string(const char *string, size_t length) {
typedef objc_id (*init_with_bytes_no_copy_method)(objc_id ns_string, objc_sel sel, const char *string, size_t length, size_t encoding, uint8_t freeWhenDone);
objc_id ns_string = objc_msgSend(objc_getClass("NSString"), sel_getUid("alloc"));
init_with_bytes_no_copy_method method = (init_with_bytes_no_copy_method)&objc_msgSend;
return (*method)(ns_string, sel_getUid("initWithBytesNoCopy:length:encoding:freeWhenDone:"),
string, length, 4, 0);
}
extern "C" size_t strlen(const char *string);
WEAK void ns_log_utf8_string(const char *string) {
objc_id format_string = wrap_string_as_ns_string("%@", 2);
objc_id ns_string = wrap_string_as_ns_string(string, strlen(string));
NSLog(format_string, ns_string);
release_ns_object(ns_string);
release_ns_object(format_string);
}
WEAK void ns_log_object(objc_id obj) {
objc_id format_string = wrap_string_as_ns_string("%@", 2);
NSLog(format_string, obj);
release_ns_object(format_string);
}
}}}
#endif