| 518 | |
| 519 | |
| 520 | double te_eval(const te_expr *n) { |
| 521 | if (!n) return NAN; |
| 522 | |
| 523 | switch(TYPE_MASK(n->type)) { |
| 524 | case TE_CONSTANT: return n->value; |
| 525 | case TE_VARIABLE: return *n->bound; |
| 526 | |
| 527 | case TE_FUNCTION0: case TE_FUNCTION1: case TE_FUNCTION2: case TE_FUNCTION3: |
| 528 | case TE_FUNCTION4: case TE_FUNCTION5: case TE_FUNCTION6: case TE_FUNCTION7: |
| 529 | switch(ARITY(n->type)) { |
| 530 | case 0: return TE_FUN(void)(); |
| 531 | case 1: return TE_FUN(double)(M(0)); |
| 532 | case 2: return TE_FUN(double, double)(M(0), M(1)); |
| 533 | case 3: return TE_FUN(double, double, double)(M(0), M(1), M(2)); |
| 534 | case 4: return TE_FUN(double, double, double, double)(M(0), M(1), M(2), M(3)); |
| 535 | case 5: return TE_FUN(double, double, double, double, double)(M(0), M(1), M(2), M(3), M(4)); |
| 536 | case 6: return TE_FUN(double, double, double, double, double, double)(M(0), M(1), M(2), M(3), M(4), M(5)); |
| 537 | case 7: return TE_FUN(double, double, double, double, double, double, double)(M(0), M(1), M(2), M(3), M(4), M(5), M(6)); |
| 538 | default: return NAN; |
| 539 | } |
| 540 | |
| 541 | case TE_CLOSURE0: case TE_CLOSURE1: case TE_CLOSURE2: case TE_CLOSURE3: |
| 542 | case TE_CLOSURE4: case TE_CLOSURE5: case TE_CLOSURE6: case TE_CLOSURE7: |
| 543 | switch(ARITY(n->type)) { |
| 544 | case 0: return TE_FUN(void*)(n->parameters[0]); |
| 545 | case 1: return TE_FUN(void*, double)(n->parameters[1], M(0)); |
| 546 | case 2: return TE_FUN(void*, double, double)(n->parameters[2], M(0), M(1)); |
| 547 | case 3: return TE_FUN(void*, double, double, double)(n->parameters[3], M(0), M(1), M(2)); |
| 548 | case 4: return TE_FUN(void*, double, double, double, double)(n->parameters[4], M(0), M(1), M(2), M(3)); |
| 549 | case 5: return TE_FUN(void*, double, double, double, double, double)(n->parameters[5], M(0), M(1), M(2), M(3), M(4)); |
| 550 | case 6: return TE_FUN(void*, double, double, double, double, double, double)(n->parameters[6], M(0), M(1), M(2), M(3), M(4), M(5)); |
| 551 | case 7: return TE_FUN(void*, double, double, double, double, double, double, double)(n->parameters[7], M(0), M(1), M(2), M(3), M(4), M(5), M(6)); |
| 552 | default: return NAN; |
| 553 | } |
| 554 | |
| 555 | default: return NAN; |
| 556 | } |
| 557 | |
| 558 | } |
| 559 | |
| 560 | #undef TE_FUN |
| 561 | #undef M |