#ifndef __COBJ_IMPLS_H__ # define __COBJ_IMPLS_H__ # define Get(instance, field, ...) \ (instance)->get_##field(instance, ## __VA_ARGS__) # define Set(instance, field, ...) \ (instance)->set_##field(instance, ## __VA_ARGS__) # define Call(instance, fun, ...) \ (instance)->fun(instance, ## __VA_ARGS__) # define New(klass, ...) klass##_new(__VA_ARGS__) # define Del(klass, ...) klass##_del(__VA_ARGS__) #endif /* __COBJ_IMPLS_H__ */ #if defined(__USE_C_OBJSYS__) # undef New # undef Del # undef __USE_C_OBJSYS__ #elif defined(__COBJ_PRIV_IMPLS_H__) # define UNUSED(arg) while(0 && (arg)) # define TYPE(klass) \ struct __ ## klass ## _impl # define GETTER(klass, field, type, body, ...) \ type klass##_get_##field(klass self, ## __VA_ARGS__) \ body # define SETTER(klass, field, type, body, ...) \ bool klass##_set_##field(klass self, ## __VA_ARGS__, type value) \ body # define DEFINE(klass, name, type, body, ...) \ type klass##_##name(klass self, ## __VA_ARGS__) \ body # define NEW(klass, body, ...) \ klass klass ## _new(__VA_ARGS__) \ body # define DEL(klass, body, ...) \ void klass ## _del(klass self, ## __VA_ARGS__) \ body # define Property(klass, name) \ (self->get_ ## name) = (& klass ## _ ## get_ ## name), \ (self->set_ ## name) = (& klass ## _ ## set_ ## name) # define Callable(klass, name) \ (self->name) = (& klass ## _ ## name) # define SELF(name) \ self->_property_ ## name # define GET(obj, name) \ (obj)->_property_ ## name #else # define Class(klass, data, ...) \ typedef struct __##klass##_impl * klass; \ klass klass ## _new(__VA_ARGS__); \ void klass ## _delete(); \ struct __##klass##_impl data # define List(klass, field, type, dim, ...) \ type _property_ ## field dim; \ type* (*get_ ## field)(klass, ## __VA_ARGS__); \ bool (*set_ ## field)(klass, ## __VA_ARGS__, const type * const) # define Atom(klass, field, type, ...) \ type _property_ ## field; \ type (*get_ ## field)(klass, ## __VA_ARGS__);\ bool (*set_ ## field)(klass, ## __VA_ARGS__, type) # define Func(klass, name, type, ...) \ type (*name)(klass, ## __VA_ARGS__) # define Del (klass) \ void (*destroy)(klass) # define __USE_C_OBJSYS__ #endif