Commit d1fecbf9512471ad2bb0ab46cd931a37c7cdc2d5
1 parent
e0e05bf8
add ability to call interface methods with return value
Showing
1 changed file
with
22 additions
and
13 deletions
| @@ -40,19 +40,28 @@ | @@ -40,19 +40,28 @@ | ||
| 40 | * @TODO: actually i use gcc feature ## for variadoc... think about | 40 | * @TODO: actually i use gcc feature ## for variadoc... think about |
| 41 | * a way to make this standard. | 41 | * a way to make this standard. |
| 42 | */ | 42 | */ |
| 43 | -#define CALL(object,_iface,method,...) \ | ||
| 44 | - do { \ | ||
| 45 | - class_ptr class = class_getClass((object)); \ | ||
| 46 | - struct i_##_iface * iface; \ | ||
| 47 | - if (class->init) class->init(); \ | ||
| 48 | - iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ | ||
| 49 | - while ((NULL == iface || NULL == iface->method) && HAS_PARENT(class)) { \ | ||
| 50 | - class = class->parent; \ | ||
| 51 | - if (class->init) class->init(); \ | ||
| 52 | - iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ | ||
| 53 | - }; \ | ||
| 54 | - assert(NULL != iface->method); \ | ||
| 55 | - iface->method(object, ##__VA_ARGS__); \ | 43 | +#define _CALL(object,_iface,method,...) \ |
| 44 | + class_ptr class = class_getClass((object)); \ | ||
| 45 | + struct i_##_iface * iface; \ | ||
| 46 | + if (class->init) class->init(); \ | ||
| 47 | + iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ | ||
| 48 | + while ((NULL == iface || NULL == iface->method) && HAS_PARENT(class)) { \ | ||
| 49 | + class = class->parent; \ | ||
| 50 | + if (class->init) class->init(); \ | ||
| 51 | + iface = (struct i_##_iface *)class_getInterface(&class, &i_##_iface); \ | ||
| 52 | + }; \ | ||
| 53 | + assert(NULL != iface->method); | ||
| 54 | + | ||
| 55 | +#define CALL(object,_iface,method,...) \ | ||
| 56 | + do { \ | ||
| 57 | + _CALL(object, _iface, method, ##__VA_ARGS__); \ | ||
| 58 | + iface->method(object, ##__VA_ARGS__); \ | ||
| 59 | + } while(0) | ||
| 60 | + | ||
| 61 | +#define RETCALL(object,_iface,method,ret,...) \ | ||
| 62 | + do { \ | ||
| 63 | + _CALL(object, _iface, method, ##__VA_ARGS__); \ | ||
| 64 | + ret = iface->method(object, ##__VA_ARGS__); \ | ||
| 56 | } while(0) | 65 | } while(0) |
| 57 | 66 | ||
| 58 | 67 |
Please
register
or
login
to post a comment