#include #include void multiply_iio(multiply* self, double *a, double *b, double *p) { *p = *a * *b; } void multiply_oii(multiply* self, double *a, double *b, double *p) { *a = *p / *b; } // redundant void multiply_ioi(multiply* self, double *a, double *b, double *p) { *b = *p / *a; } typedef enum { ignore, in, out, mode_t_n } mode_t; // TODO destructive input, update, pull?, ?? (where two args point to the same object) typedef void (*proc3)(void *a, void *b, void *p); typedef const proc3 proc3_modes[mode_t_n][mode_t_n][mode_t_n]; //typedef const proc3 proc3ary[2][2]; proc3_modes multiply_modes = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, multiply_iio, 0, multiply_ioi, 0, 0, 0, 0, 0, multiply_oii, 0, 0, 0, 0 }; typedef struct { proc3_modes* modes; } proc3_obj; typedef struct { proc3_obj super; } multiply; void apply3(void* obj, mode_t aM, mode_t bM, mode_t cM, void *a, void *b, void *c) { proc3 func = (*(((proc3_obj*)obj)->modes))[aM][bM][cM]; assert(func != 0); (*func)(obj, a, b, c); } int main() { double a, b, c; multiply m; m.super.modes = &multiply_modes; a = 7.0; c = 21.0; apply3(&m, in, out, in, &a, &b, &c); printf("%f %f %f\n", a, b, c); }