1 | #ifndef _OS_BASE_H |
2 | #define _OS_BASE_H |
3 | |
4 | #define OS_CONSUME __attribute__((os_consumed)) |
5 | #define OS_RETURNS_RETAINED __attribute__((os_returns_retained)) |
6 | #define OS_RETURNS_RETAINED_ON_ZERO __attribute__((os_returns_retained_on_zero)) |
7 | #define OS_RETURNS_RETAINED_ON_NONZERO __attribute__((os_returns_retained_on_non_zero)) |
8 | #define OS_RETURNS_NOT_RETAINED __attribute__((os_returns_not_retained)) |
9 | #define OS_CONSUMES_THIS __attribute__((os_consumes_this)) |
10 | |
11 | #define OSTypeID(type) (type::metaClass) |
12 | |
13 | #define OSDynamicCast(type, inst) \ |
14 | ((type *) OSMetaClassBase::safeMetaCast((inst), OSTypeID(type))) |
15 | |
16 | #define OSTypeAlloc(type) ((type *) ((type::metaClass)->alloc())) |
17 | |
18 | using size_t = decltype(sizeof(int)); |
19 | |
20 | struct OSMetaClass; |
21 | |
22 | struct OSMetaClassBase { |
23 | static OSMetaClassBase *safeMetaCast(const OSMetaClassBase *inst, |
24 | const OSMetaClass *meta); |
25 | |
26 | OSMetaClassBase *metaCast(const char *toMeta); |
27 | |
28 | virtual void retain() const; |
29 | virtual void release() const; |
30 | |
31 | virtual void taggedRetain(const void * tag = nullptr) const; |
32 | virtual void taggedRelease(const void * tag = nullptr) const; |
33 | |
34 | virtual void free(); |
35 | virtual ~OSMetaClassBase(){}; |
36 | }; |
37 | |
38 | struct OSObject : public OSMetaClassBase { |
39 | virtual ~OSObject(){} |
40 | |
41 | unsigned int foo() { return 42; } |
42 | |
43 | virtual OS_RETURNS_NOT_RETAINED OSObject *identity(); |
44 | |
45 | static OSObject *generateObject(int); |
46 | |
47 | static OSObject *getObject(); |
48 | static OSObject *GetObject(); |
49 | |
50 | static void * operator new(size_t size); |
51 | |
52 | static const OSMetaClass * const metaClass; |
53 | }; |
54 | |
55 | struct OSMetaClass : public OSMetaClassBase { |
56 | virtual OSObject * alloc() const; |
57 | virtual ~OSMetaClass(){} |
58 | }; |
59 | |
60 | #endif /* _OS_BASE_H */ |
61 | |