#ifndef __INTERFACE_H__ #define __INTERFACE_H__ #include #define MAX_IFACE 32 // ATTENTION: every iface_impl will use MAX_IFACE * sizeof(void*) #define IFACE(name) ((const struct i_##name const*)&i_##name##_impl) #define INIT_IFACE(name,...) \ static const struct i_##name i_##name##_impl = {&i_##name,__VA_ARGS__} #define NUMARGS(...) (sizeof((const void*[]){__VA_ARGS__})/sizeof(void*)) #define INIT_IMPL(...) {NUMARGS(__VA_ARGS__), 0, {__VA_ARGS__}} struct interface { const char * name; const size_t nmethods; }; typedef const struct interface * iface_ptr; struct iface_impl { const size_t nimpl; // number of interface implementations char simpl; // implementations sorted?? const void * impl[MAX_IFACE]; // implementations }; typedef struct iface_impl * iface_impl_ptr; extern struct interface * interfaceGet(iface_impl_ptr, const iface_ptr); #endif // __INTERFACE_H__ // vim: set ts=4 sw=4: