| 594 | |
| 595 | |
| 596 | double te_eval(const te_expr *n) { |
| 597 | if (!n) return NAN; |
| 598 | |
| 599 | switch(TYPE_MASK(n->type)) { |
| 600 | case TE_CONSTANT: return n->value; |
| 601 | case TE_VARIABLE: return *n->bound; |
| 602 | |
| 603 | case TE_FUNCTION0: case TE_FUNCTION1: case TE_FUNCTION2: case TE_FUNCTION3: |
| 604 | case TE_FUNCTION4: case TE_FUNCTION5: case TE_FUNCTION6: case TE_FUNCTION7: |
| 605 | switch(ARITY(n->type)) { |
| 606 | case 0: return TE_FUN(void)(); |
| 607 | case 1: return TE_FUN(double)(M(0)); |
| 608 | case 2: return TE_FUN(double, double)(M(0), M(1)); |
| 609 | case 3: return TE_FUN(double, double, double)(M(0), M(1), M(2)); |
| 610 | case 4: return TE_FUN(double, double, double, double)(M(0), M(1), M(2), M(3)); |
| 611 | case 5: return TE_FUN(double, double, double, double, double)(M(0), M(1), M(2), M(3), M(4)); |
| 612 | case 6: return TE_FUN(double, double, double, double, double, double)(M(0), M(1), M(2), M(3), M(4), M(5)); |
| 613 | 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)); |
| 614 | default: return NAN; |
| 615 | } |
| 616 | |
| 617 | case TE_CLOSURE0: case TE_CLOSURE1: case TE_CLOSURE2: case TE_CLOSURE3: |
| 618 | case TE_CLOSURE4: case TE_CLOSURE5: case TE_CLOSURE6: case TE_CLOSURE7: |
| 619 | switch(ARITY(n->type)) { |
| 620 | case 0: return TE_FUN(void*)(n->parameters[0]); |
| 621 | case 1: return TE_FUN(void*, double)(n->parameters[1], M(0)); |
| 622 | case 2: return TE_FUN(void*, double, double)(n->parameters[2], M(0), M(1)); |
| 623 | case 3: return TE_FUN(void*, double, double, double)(n->parameters[3], M(0), M(1), M(2)); |
| 624 | case 4: return TE_FUN(void*, double, double, double, double)(n->parameters[4], M(0), M(1), M(2), M(3)); |
| 625 | case 5: return TE_FUN(void*, double, double, double, double, double)(n->parameters[5], M(0), M(1), M(2), M(3), M(4)); |
| 626 | 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)); |
| 627 | 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)); |
| 628 | default: return NAN; |
| 629 | } |
| 630 | |
| 631 | default: return NAN; |
| 632 | } |
| 633 | |
| 634 | } |
| 635 | |
| 636 | #undef TE_FUN |
| 637 | #undef M |