#ifndef _OS_BASE_H #define _OS_BASE_H #define OS_CONSUME __attribute__((os_consumed)) #define OS_RETURNS_RETAINED __attribute__((os_returns_retained)) #define OS_RETURNS_RETAINED_ON_ZERO __attribute__((os_returns_retained_on_zero)) #define OS_RETURNS_RETAINED_ON_NONZERO __attribute__((os_returns_retained_on_non_zero)) #define OS_RETURNS_NOT_RETAINED __attribute__((os_returns_not_retained)) #define OS_CONSUMES_THIS __attribute__((os_consumes_this)) #define OSTypeID(type) (type::metaClass) #define OSDynamicCast(type, inst) \ ((type *) OSMetaClassBase::safeMetaCast((inst), OSTypeID(type))) #define OSRequiredCast(type, inst) \ ((type *) OSMetaClassBase::requiredMetaCast((inst), OSTypeID(type))) #define OSTypeAlloc(type) ((type *) ((type::metaClass)->alloc())) using size_t = decltype(sizeof(int)); typedef int kern_return_t; struct IORPC {}; struct OSMetaClass; struct OSMetaClassBase { static OSMetaClassBase *safeMetaCast(const OSMetaClassBase *inst, const OSMetaClass *meta); static OSMetaClassBase *requiredMetaCast(const OSMetaClassBase *inst, const OSMetaClass *meta); OSMetaClassBase *metaCast(const char *toMeta); virtual void retain() const; virtual void release() const; virtual void taggedRetain(const void * tag = nullptr) const; virtual void taggedRelease(const void * tag = nullptr) const; virtual void free(); virtual ~OSMetaClassBase(){}; kern_return_t Invoke(IORPC invoke); }; typedef kern_return_t (*OSDispatchMethod)(OSMetaClassBase *self, const IORPC rpc); struct OSObject : public OSMetaClassBase { virtual ~OSObject(){} unsigned int foo() { return 42; } virtual OS_RETURNS_NOT_RETAINED OSObject *identity(); static OSObject *generateObject(int); static OSObject *getObject(); static OSObject *GetObject(); static void * operator new(size_t size); static const OSMetaClass * const metaClass; }; struct OSMetaClass : public OSMetaClassBase { virtual OSObject * alloc() const; virtual ~OSMetaClass(){} }; #endif /* _OS_BASE_H */