6427{
6428 {
6436 }
6437
6438 {
6440
6441 {
6442 T x;
6443 const bool result1 = symbol_table.
add_variable(
"x", x);
6446
6447 if (!result1 || !result2 || result3)
6448 {
6449 printf("run_test18() - Failed sym_tab add/remove [1]\n");
6450 }
6451 }
6452
6453 {
6454 std::string x;
6458
6459 if (!result1 || !result2 || result3)
6460 {
6461 printf("run_test18() - Failed sym_tab add/remove [2]\n");
6462 }
6463 }
6464
6465 {
6466 std::vector<T> x(10,T(0));
6467 const bool result1 = symbol_table.
add_vector(
"x", x);
6470
6471 if (!result1 || !result2 || result3)
6472 {
6473 printf("run_test18() - Failed sym_tab add/remove [3]\n");
6474 }
6475 }
6476
6477 {
6479 const bool result1 = symbol_table.
add_function(
"x", x);
6482
6483 if (!result1 || !result2 || result3)
6484 {
6485 printf("run_test18() - Failed sym_tab add/remove [4]\n");
6486 }
6487 }
6488
6489 {
6491 const bool result1 = symbol_table.
add_function(
"x", x);
6494
6495 if (!result1 || !result2 || result3)
6496 {
6497 printf("run_test18() - Failed sym_tab add/remove [5]\n");
6498 }
6499 }
6500
6501 {
6508
6515 }
6516 }
6517
6518 {
6520
6521 T x = T(1.1);
6522 T y = T(2.2);
6523 T z = T(3.3);
6524 T w = T(4.4);
6525 T u = T(5.5);
6526 T v = T(6.6);
6527 T t = T(7.7);
6528
6530
6541
6542 static const std::string expr_str_list[] =
6543 {
6544 "equal(va_func,(0))",
6545 "equal(va_func(),(0))",
6546 "equal(va_func(1,2,3,4,5,6,7,8,9),(1+2+3+4+5+6+7+8+9))",
6547 "equal(va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9))",
6548 "equal(va_func(x,2,y,4,z,6,w,8,u),(x+2+y+4+z+6+w+8+u))",
6549 "equal(va_func(x,y,z,w,u,v,t,1,2,3),(x+y+z+w+u+v+t+1+2+3))",
6550 "equal(va_func(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
6551 "equal(va_func(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
6552 "equal(1+va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9)+1)",
6553 "equal(va_func(va_func(x,y,z,w,u,v,t),va_func(x,y,z,w,u,v,t)),2*(x+y+z+w+u+v+t))",
6554 "equal(va_func(va_func(x),va_func(y),va_func(z)),va_func(x,y,z))",
6555 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x)))))))),x)",
6556 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(123.456)))))))),123.456)",
6557 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+1)))))))),x+1)",
6558 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+y)))))))),x+y)"
6559 };
6560 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6561
6563
6564 for (std::size_t i = 0; i < expr_str_list_size; ++i)
6565 {
6566 expression_t expression;
6567 expression.register_symbol_table(symbol_table);
6568
6570
6571 if (!parser.
compile(expr_str_list[i],expression))
6572 {
6573 printf("run_test18() - [1] VarArg Error: %s Expression: %s\n",
6574 parser.
error().c_str(),
6575 expr_str_list[i].c_str());
6576
6577 return false;
6578 }
6579 else
6581 }
6582
6583 bool error_found = false;
6584
6586 {
6588 {
6589 printf("run_test18() - Error in evaluation! (1) Expression: %s\n",
6590 expr_str_list[i].c_str());
6591
6592 error_found = true;
6593 }
6594 }
6595
6596 if (error_found)
6597 {
6598 return false;
6599 }
6600 }
6601
6602 {
6606
6607 T x = T(33);
6608 T y = T(77);
6609
6610 T v0[] = { T(1), T(1), T(1), T(1) };
6611 T v1[] = { T(1), T(2), T(3), T(4) };
6612
6613 std::vector<T> v2;
6614
6615 v2.push_back(T(5));
6616 v2.push_back(T(6));
6617 v2.push_back(T(7));
6618 v2.push_back(T(8));
6619
6620 std::string s0 = "AbCdEfGhIj";
6621
6623
6624 symbol_table_t symbol_table;
6625
6627
6628 symbol_table.add_variable ("x" , x);
6629 symbol_table.add_variable ("y" , y);
6630 symbol_table.add_vector ("v0" ,v0);
6631 symbol_table.add_vector ("v1" ,v1);
6632 symbol_table.add_vector ("v2" ,v2);
6633 symbol_table.add_stringvar("s0", s0);
6634 symbol_table.add_function ("gen_func", f);
6635
6637 {
6638 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6]);",
6639 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6]);",
6640 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0);",
6641 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2);",
6642 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2]);",
6643 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x);",
6644 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y);",
6645 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z);",
6646 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func('abc123', s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3);",
6647 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');"
6648 };
6649
6651
6652 bool error_found = false;
6653
6655 {
6657 expression_t expression;
6658
6659 expression.register_symbol_table(symbol_table);
6660
6661 parser_t parser;
6662
6663 if (!parser.compile(expression_str,expression))
6664 {
6665 printf("run_test18() - [2] GenFunc Error: %s Expression: %s [2]\n",
6666 parser.error().c_str(),
6667 expression_str.c_str());
6668
6669 error_found = true;
6670 continue;
6671 }
6672
6676
6677 expression.value();
6678
6679 if (
6683 )
6684 {
6685 printf("run_test18() - Error in evaluation! (2) Expression: %s "
6686 "sc_count = %d "
6687 "vr_count = %d "
6688 "st_count = %d\n",
6693
6694 error_found = true;
6695 }
6696
6697 expression.release();
6698 }
6699
6700 if (error_found)
6701 {
6702 return false;
6703 }
6704 }
6705
6706 {
6710
6711 T x = T(33);
6712 T y = T(77);
6713
6714 T v0[] = { T(1), T(1), T(1), T(1) };
6715 T v1[] = { T(1), T(2), T(3), T(4) };
6716 T v2[] = { T(5), T(6), T(7), T(8) };
6717
6718 std::string s0 = "AbCdEfGhIj";
6719
6721
6722 symbol_table_t symbol_table;
6723
6724 symbol_table.add_constants();
6725
6726 symbol_table.add_variable ("x" , x);
6727 symbol_table.add_variable ("y" , y);
6728 symbol_table.add_vector ("v0" ,v0);
6729 symbol_table.add_vector ("v1" ,v1);
6730 symbol_table.add_vector ("v2" ,v2);
6731 symbol_table.add_stringvar("s0", s0);
6732 symbol_table.add_function ("foo", f);
6733
6735 {
6736 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6]);",
6737 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0);",
6738 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2);",
6739 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2]);",
6740 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x);",
6741 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y);",
6742 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z);",
6743 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo('abc123', s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3);",
6744 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');",
6745 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0[2:3]+s0[4:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');",
6746 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6747 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6748 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6749 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6750 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6751 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6752 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6753 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6754 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6755 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6756 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6757 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6758 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6759 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6760 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6761 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6762 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6763 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6764 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6765 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6766 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6767 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6768 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6769 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6770 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6771 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6772 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6773 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6774 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6775 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6776 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6777 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);"
6778 };
6779
6781
6782 const std::string parameter_type_list[] =
6783 {
6784 "VVTTTTVSS",
6785 "VTTTTVSSV",
6786 "TTTTVSSVV",
6787 "TTTVSSVVT",
6788 "TTVSSVVT*",
6789 "TVSSVVT*" ,
6790 "VSSVVT*" ,
6791 "SSVVTTTTV",
6792 "SVVTTTTVS",
6793 "SVVTTTTVS",
6794 "V*T*VS*" ,
6795 "V*TTTTVSS",
6796 "VVT*VSS" ,
6797 "VVTTTTVS*",
6798 "T*",
6799 "T*",
6800 "T*",
6801 "T*",
6802 "S*",
6803 "S*",
6804 "S*",
6805 "S*",
6806 "V*",
6807 "V*",
6808 "V*",
6809 "V*",
6810 "T",
6811 "TT",
6812 "TTT",
6813 "TTTT",
6814 "S",
6815 "SS",
6816 "SSS",
6817 "SSSS",
6818 "V",
6819 "VV",
6820 "VVV",
6821 "VVVV",
6822 "TTTTTTT|STSTSTS|V*T*VS*" ,
6823 "TTTTTTT|STSTSTS|V*TTTTVSS",
6824 "TTTTTTT|STSTSTS|VVT*VSS" ,
6825 "TTTTTTT|STSTSTS|VVTTTTVS*",
6826 };
6827
6828 bool error_found = false;
6829
6831 {
6833 expression_t expression;
6834
6835 expression.register_symbol_table(symbol_table);
6836
6837 parser_t parser;
6838
6840
6841 if (!parser.compile(expression_str,expression))
6842 {
6843 printf("run_test18() - [3] GenFunc2 Error: %s Expression: %s Parameter Sequence: %s [3]\n",
6844 parser.error().c_str(),
6845 expression_str.c_str(),
6846 parameter_type_list[i].c_str());
6847
6848 error_found = true;
6849 continue;
6850 }
6851
6852 expression.value();
6853 }
6854
6855 if (error_found)
6856 {
6857 return false;
6858 }
6859 }
6860
6861 {
6862 bool error_found = false;
6863
6865 {
6866 "foo(v0,v1,v2,x,y,s0);",
6867 "foo(v1,v2,x,y,s0,v0);",
6868 "foo(v2,x,y,s0,v0,v1);",
6869 "foo(x,y,s0,v0,v1,v2);",
6870 "foo(y,s0,v0,v1,v2,x);",
6871 "foo(s0,v0,v1,v2,x,y);"
6872 };
6873
6875
6876 const std::string parameter_type_list[] =
6877 {
6878 "VVVTTS",
6879 "VVTTSV",
6880 "VTTSVV",
6881 "TTSVVV",
6882 "TSVVVT",
6883 "SVVVTT"
6884 };
6885
6887 {
6891
6892 T x = T(33);
6893 T y = T(77);
6894
6895 T v0[] = { T(1), T(1), T(1), T(1) };
6896 T v1[] = { T(1), T(2), T(3), T(4) };
6897 T v2[] = { T(5), T(6), T(7), T(8) };
6898
6899 std::string s0 = "AbCdEfGhIj";
6900
6901 T x_inc = T(34);
6902 T y_inc = T(78);
6903
6904 T v0_inc[] = { T(2), T(2), T(2), T(2) };
6905 T v1_inc[] = { T(2), T(3), T(4), T(5) };
6906 T v2_inc[] = { T(6), T(7), T(8), T(9) };
6907
6908 std::size_t sizeof_vec = sizeof(v0) / sizeof(T);
6909
6910 std::string s0_inc = "BcDeFgHiJk";
6911
6913
6914 symbol_table_t symbol_table;
6915
6916 symbol_table.add_constants();
6917
6918 symbol_table.add_variable ("x" , x );
6919 symbol_table.add_variable ("y" , y );
6920 symbol_table.add_vector ("v0" , v0);
6921 symbol_table.add_vector ("v1" , v1);
6922 symbol_table.add_vector ("v2" , v2);
6923 symbol_table.add_stringvar("s0", s0);
6924 symbol_table.add_function ("foo", f );
6925
6926 expression_t expression;
6927
6928 expression.register_symbol_table(symbol_table);
6929
6930 parser_t parser;
6931
6933
6935 {
6936 printf("run_test18() - [4] IncFunc Error: %s Expression: %s Parameter Sequence: %s [4]\n",
6937 parser.error().c_str(),
6939 parameter_type_list[i].c_str());
6940
6941 error_found = true;
6942 continue;
6943 }
6944
6945 expression.value();
6946
6947 if (x != x_inc)
6948 {
6949 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: x\n",
6951 error_found = true;
6952 }
6953
6954 if (y != y_inc)
6955 {
6956 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
6958 error_found = true;
6959 }
6960
6961 if (s0 != s0_inc)
6962 {
6963 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
6965 error_found = true;
6966 }
6967
6968 if (!std::equal(v0,v0 + sizeof_vec,v0_inc))
6969 {
6970 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v0\n",
6972 error_found = true;
6973 }
6974
6975 if (!std::equal(v1,v1 + sizeof_vec,v1_inc))
6976 {
6977 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v1\n",
6979 error_found = true;
6980 }
6981
6982 if (!std::equal(v2,v2 + sizeof_vec,v2_inc))
6983 {
6984 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v2\n",
6986 error_found = true;
6987 }
6988 }
6989
6990 if (error_found)
6991 {
6992 return false;
6993 }
6994 }
6995
6996 {
6997 bool error_found = false;
6998
7000
7001 std::string s0 = "XXXXXXXXXXXXXXX";
7002 std::string s1 = "XXXXXXXXXXXXXXX";
7003 std::string s2 = "XXXXXXXXXXXXXXX";
7004 std::string s3 = "XXXXXXXXXXXXXXX";
7005 std::string s4 = "XXXXXXXXXXXXXXX";
7006
7010
7011 symbol_table_t symbol_table;
7012
7013 symbol_table.add_constants();
7014
7015 symbol_table.add_stringvar("s0", s0);
7016 symbol_table.add_stringvar("s1", s1);
7017 symbol_table.add_stringvar("s2", s2);
7018 symbol_table.add_stringvar("s3", s3);
7019 symbol_table.add_stringvar("s4", s4);
7020
7021 symbol_table.add_function("remspc_uc", rsauc);
7022
7023 const std::string program =
7024 " s0 := 'How now '; "
7025 " s1 := 'brown cow?'; "
7026 " s2 := remspc_uc(s0 + s1); "
7027 " s3 := remspc_uc(s0) + s1; "
7028 " s4 := s0 + remspc_uc(s1); "
7029 " remspc_uc(s0 + s1) == remspc_uc(s0) + remspc_uc(s1); ";
7030
7031 const std::string parameter_type_list[] =
7032 {
7033 "VVVTTT|S",
7034 "VVTTTV|S",
7035 "VTTTVV|S",
7036 "TTTVVV|S",
7037 "TTVVVT|S",
7038 "TVVVTT|S"
7039 };
7040
7041 std::size_t parameter_type_list_size = sizeof(parameter_type_list) / sizeof(std::string);
7042
7043 for (std::size_t i = 0; i < parameter_type_list_size; ++i)
7044 {
7045 expression_t expression;
7046
7047 expression.register_symbol_table(symbol_table);
7048
7049 parser_t parser;
7050
7052
7053 if (!parser.compile(program,expression))
7054 {
7055 printf("run_test18() - [5] Error: %s\tExpression: %s\n",
7056 parser.error().c_str(),
7057 program.c_str());
7058
7059 return false;
7060 }
7061
7062 const T result = expression.value();
7063
7064 if (result != T(1))
7065 {
7066 printf("run_test18() - Error in evaluation! (4) Expression: %s Result <> 1\n",
7067 program.c_str());
7068 error_found = true;
7069 }
7070
7071 if (result != T(1))
7072 {
7073 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
7074 program.c_str());
7075 error_found = true;
7076 }
7077
7078 if ("How now " != s0)
7079 {
7080 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
7081 program.c_str());
7082 error_found = true;
7083 }
7084
7085 if ("brown cow?" != s1)
7086 {
7087 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s1\n",
7088 program.c_str());
7089 error_found = true;
7090 }
7091
7092 if ("HOWNOWBROWNCOW?" != s2)
7093 {
7094 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s2\n",
7095 program.c_str());
7096 error_found = true;
7097 }
7098
7099 if ("HOWNOWbrown cow?" != s3)
7100 {
7101 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s3\n",
7102 program.c_str());
7103 error_found = true;
7104 }
7105
7106 if ("How now BROWNCOW?" != s4)
7107 {
7108 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s4\n",
7109 program.c_str());
7110 error_found = true;
7111 }
7112 }
7113
7114 if (error_found)
7115 {
7116 return false;
7117 }
7118 }
7119
7120 {
7121 bool error_found = false;
7122
7126
7127 symbol_table_t symbol_table;
7128
7129 T v[4] = {T(5), T(6), T(7), T(8)};
7130
7131 symbol_table.add_vector("v",v);
7132
7134 symbol_table.add_function("vararg_func",vaf);
7135
7136 expression_t expression;
7137 expression.register_symbol_table(symbol_table);
7138
7139 parser_t parser;
7140
7141 const std::string programs[] =
7142 {
7143 "equal(0,vararg_func())",
7144 "equal(1,vararg_func() + 1)",
7145 "equal(1,1 + vararg_func())",
7146 "equal(1,vararg_func + 1)",
7147 "equal(1,1 + vararg_func)",
7148 "equal(0,vararg_func() + vararg_func)",
7149 "equal(0,vararg_func + vararg_func())",
7150 "equal(1,vararg_func + vararg_func(1))",
7151 "equal(1,vararg_func + vararg_func(1,2))",
7152 "equal(2,vararg_func + vararg_func(v))",
7153 "equal(1,vararg_func() + vararg_func(1))",
7154 "equal(1,vararg_func() + vararg_func(1,2))",
7155 "equal(2,vararg_func() + vararg_func(v))",
7156 "equal(2,vararg_func(v))",
7157 "equal(1,vararg_func(1))",
7158 "equal(1,vararg_func(1,2,3))",
7159 "equal(1,vararg_func(5,6,7,8))",
7160 "equal(5,vararg_func(v) + 3)",
7161 "equal(5,vararg_func(1) + 4)",
7162 "equal(6,vararg_func(1,2,3) + 5)",
7163 "equal(7,vararg_func(5,6,7,8) + 6)"
7164 };
7165
7166 static const std::size_t programs_size = sizeof(programs) / sizeof(std::string);
7167
7168 for (std::size_t i = 0; i < programs_size; ++i)
7169 {
7170 if (!parser.compile(programs[i],expression))
7171 {
7172 printf("run_test18() - [6] Error: %s\tExpression: %s\n",
7173 parser.error().c_str(),
7174 programs[i].c_str());
7175
7176 error_found = true;
7177 }
7178 else if (T(1) != expression.value())
7179 {
7180 printf("run_test18() - Error in evaluation! (5) Expression: %s\n",
7181 programs[i].c_str());
7182
7183 error_found = true;
7184 }
7185 }
7186
7187 if (error_found)
7188 {
7189 return false;
7190 }
7191 }
7192
7193 {
7194 bool error_found = false;
7195
7199
7200 std::vector<T> v0;
7201 std::vector<T> v1;
7202 std::vector<T> v2;
7203 std::vector<T> v3;
7204
7205 #define pb(v,N) \
7206 v.push_back(T(N)); \
7207
7212 #undef pb
7213
7214 const std::string expr_string = "sum(v + 1)";
7215
7217
7218 symbol_table_t symbol_table;
7219 symbol_table.add_vector("v",v);
7220
7221 expression_t expression;
7222 expression.register_symbol_table(symbol_table);
7223
7224 parser_t parser;
7225
7226 if (!parser.compile(expr_string,expression))
7227 {
7228 printf("run_test18() - [7] Error: %s\tExpression: %s\n",
7229 parser.error().c_str(),
7230 expr_string.c_str());
7231
7232 error_found = true;
7233 }
7234
7235 T sum = { T(0) };
7236
7237 sum = expression.value();
7238
7240 {
7241 printf("run_test18() - Error in evaluation! (6) Expression: %s\n",
7242 expr_string.c_str());
7243
7244 error_found = true;
7245 }
7246
7248 sum = expression.value();
7249
7251 {
7252 printf("run_test18() - Error in evaluation! (7) Expression: %s\n",
7253 expr_string.c_str());
7254 error_found = true;
7255 }
7256
7258 sum = expression.value();
7259
7261 {
7262 printf("run_test18() - Error in evaluation! (8) Expression: %s\n",
7263 expr_string.c_str());
7264 error_found = true;
7265 }
7266
7268 sum = expression.value();
7269
7271 {
7272 printf("run_test18() - Error in evaluation! (9) Expression: %s\n",
7273 expr_string.c_str());
7274 error_found = true;
7275 }
7276
7277 if (error_found)
7278 {
7279 return false;
7280 }
7281 }
7282
7283 {
7284 bool error_found = false;
7285
7289
7290 std::vector<T> v0;
7291 std::vector<T> s;
7292
7293 #define pb(v,N) \
7294 v.push_back(T(N)); \
7295
7298
7299 pb(s, 3)
pb(s, 6)
pb(s, 9)
pb(s,12)
7300 pb(s,15)
pb(s,18)
pb(s,21)
7301 #undef pb
7302
7303 const std::string expr_string = "v[0] + v[1] + v[2]";
7304
7306
7307 symbol_table_t symbol_table;
7308 symbol_table.add_vector("v",v);
7309
7310 expression_t expression;
7311 expression.register_symbol_table(symbol_table);
7312
7313 parser_t parser;
7314
7315 if (!parser.compile(expr_string,expression))
7316 {
7317 printf("run_test18() - [8] Error: %s\tExpression: %s\n",
7318 parser.error().c_str(),
7319 expr_string.c_str());
7320
7321 error_found = true;
7322 }
7323
7324 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7325 {
7327
7328 T sum = expression.value();
7329
7331 {
7332 printf("run_test18() - Error in evaluation! (7) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7333 expr_string.c_str(),
7334 s[i].toDouble(),
7335 sum.toDouble());
7336
7337 error_found = true;
7338 }
7339
7340 }
7341
7342 if (error_found)
7343 {
7344 return false;
7345 }
7346 }
7347
7348 {
7349 bool error_found = false;
7350
7354
7355 std::vector<T> v0;
7356 std::vector<T> s;
7357
7358 #define pb(v,N) \
7359 v.push_back(T(N)); \
7360
7363
7364 pb(s, 3)
pb(s, 6)
pb(s, 9)
pb(s,12)
7365 pb(s,15)
pb(s,18)
pb(s,21)
7366 #undef pb
7367
7368 const std::string expr_string = "var i := 0; var j := 1; var k := 2; v[i] + v[j] + v[k]";
7369
7371
7372 symbol_table_t symbol_table;
7373 symbol_table.add_vector("v",v);
7374
7375 expression_t expression;
7376 expression.register_symbol_table(symbol_table);
7377
7378 parser_t parser;
7379
7380 if (!parser.compile(expr_string,expression))
7381 {
7382 printf("run_test18() - [9] Error: %s\tExpression: %s\n",
7383 parser.error().c_str(),
7384 expr_string.c_str());
7385
7386 error_found = true;
7387 }
7388
7389 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7390 {
7392
7393 T sum = expression.value();
7394
7396 {
7397 printf("run_test18() - Error in evaluation! (8) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7398 expr_string.c_str(),
7399 s[i].toDouble(),
7400 sum.toDouble());
7401
7402 error_found = true;
7403 }
7404
7405 }
7406
7407 if (error_found)
7408 {
7409 return false;
7410 }
7411 }
7412
7413 {
7417
7418 const std::string const_folded_expression_list[] =
7419 {
7420 "(0 * dot(2 * v0,v1 - 1))",
7421 "(0 * dot(2 * v0,v1 - 1)) + (dot(2 * v0,v1 - 1) * 0)",
7422 "(0 * dot(v0 - v1,v1 / v0))",
7423 "(0 * dot(v0 - v1,v1 / v0)) + (dot(v0 - v1,v1 / v0) * 0)",
7424 "(0 * dot(v0,v1))",
7425 "(0 * dot(v0,v1)) + (dot(v0,v1) * 0)",
7426 "(0 / dot(2 * v0,v1 - 1))",
7427 "(0 / dot(2 * v0,v1 - 1)) + (dot(2 * v0,v1 - 1) * 0)",
7428 "(0 / dot(v0 - v1,v1 / v0))",
7429 "(0 / dot(v0 - v1,v1 / v0)) + (dot(v0 - v1,v1 / v0) * 0)",
7430 "(0 / dot(v0,v1))",
7431 "(0 / dot(v0,v1)) + (dot(v0,v1) * 0)",
7432 "(dot(2 * v0,v1 - 1) * 0)",
7433 "(dot(2 * v0,v1 - 1) * 0) + (0 * dot(2 * v0,v1 - 1))",
7434 "(dot(2 * v0,v1 - 1) * 0) + (0 / dot(2 * v0,v1 - 1))",
7435 "(dot(v0 - v1,v1 / v0) * 0)",
7436 "(dot(v0 - v1,v1 / v0) * 0) + (0 * dot(v0 - v1,v1 / v0))",
7437 "(dot(v0 - v1,v1 / v0) * 0) + (0 / dot(v0 - v1,v1 / v0))",
7438 "(dot(v0,v1) * 0)",
7439 "(dot(v0,v1) * 0) + (0 * dot(v0,v1))",
7440 "(dot(v0,v1) * 0) + (0 / dot(v0,v1))"
7441 };
7442
7443 const std::size_t const_folded_expression_list_size = sizeof(const_folded_expression_list) / sizeof(std::string);
7444
7445 const std::size_t vector_size = 5;
7446 T v0[vector_size] = { 0, 2, 4, 6, 8 };
7447 T v1[vector_size] = { 1, 3, 5, 7, 9 };
7448
7451
7454
7455 symbol_table_t symbol_table;
7456
7457 symbol_table.add_package( vector_package );
7458 symbol_table.add_package( io_package );
7459 symbol_table.add_vector ( "v0" , vv0 );
7460 symbol_table.add_vector ( "v1" , vv1 );
7461
7462 expression_t expression;
7463 expression.register_symbol_table(symbol_table);
7464
7465 parser_t parser;
7466
7467 for (std::size_t i = 0; i < const_folded_expression_list_size; ++i)
7468 {
7469 const std::string& expression_string = const_folded_expression_list[i];
7470
7471 if (!parser.compile(expression_string, expression))
7472 {
7473 printf("run_test18() - [10] Error: %s Expression: %s\n",
7474 parser.error().c_str(),
7475 expression_string.c_str());
7476
7477 return false;
7478 }
7479
7481 {
7482 printf("run_test18() - Error: Expression did not compile to a constant! [1] Expression: %s\n",
7483 expression_string.c_str());
7484
7485 return false;
7486 }
7487
7488 for (std::size_t j = 0; j < 100; ++j)
7489 {
7490 if ((j % 2) == 0)
7491 {
7494 }
7495 else
7496 {
7499 }
7500
7501 const T result = expression.value();
7502
7503 if (result != T(0))
7504 {
7505 printf("run_test18() - Error: Expected result of zero, result: %8.4f for Expression: %s\n",
7506 result.toDouble(),
7507 expression_string.c_str());
7508
7509 return false;
7510 }
7511 }
7512
7513 expression.release();
7514 }
7515 }
7516
7517 {
7521
7522 const std::string rebase_expression_list[] =
7523 {
7524 "dot(v0,v1)",
7525 "dot(2 * v0,v1 - 1) + dot(2 * v0,v1 - 1)",
7526 "dot(2 * v0,v1 - 1)",
7527 "dot(v0 - v1,v1 / v0) + dot(v0 - v1,v1 / v0)",
7528 "dot(v0 - v1,v1 / v0)",
7529 "dot(v0,v1) + dot(v0,v1)",
7530 "dot(v0,v1) + x",
7531 "dot(2 * v0,v1 - 1) * x + dot(2 * v0,v1 - 1) * y",
7532 "x / dot(2 * v0,v1 - 1)",
7533 "x / dot(v0 - v1,v1 / v0) + dot(v0 - v1,v1 / v0) / y",
7534 "x * dot(v0 - v1,v1 / v0) / y",
7535 "x - dot(v0,v1) + dot(v0,v1) + y",
7536 };
7537
7538 const std::size_t rebase_expression_list_size = sizeof(rebase_expression_list) / sizeof(std::string);
7539
7540 T x = T(1.234);
7541 T y = T(5.678);
7542
7543 const std::size_t vector_size = 5;
7544 T v0[vector_size] = { 0, 2, 4, 6, 8 };
7545 T v1[vector_size] = { 1, 3, 5, 7, 9 };
7546
7549
7552
7553 symbol_table_t symbol_table;
7554
7555 symbol_table.add_package ( vector_package );
7556 symbol_table.add_package ( io_package );
7557 symbol_table.add_variable( "x" , x );
7558 symbol_table.add_variable( "y" , y );
7559 symbol_table.add_vector ( "v0" , vv0 );
7560 symbol_table.add_vector ( "v1" , vv1 );
7561
7562 expression_t expression;
7563 expression.register_symbol_table(symbol_table);
7564
7565 parser_t parser;
7566
7567 for (std::size_t i = 0; i < rebase_expression_list_size; ++i)
7568 {
7569 const std::string& expression_string = rebase_expression_list[i];
7570
7571 if (!parser.compile(expression_string, expression))
7572 {
7573 printf("run_test18() - [11] Error: %s Expression: %s\n",
7574 parser.error().c_str(),
7575 expression_string.c_str());
7576
7577 return false;
7578 }
7579
7580 for (std::size_t j = 0; j < 100; ++j)
7581 {
7582 if ((j % 2) == 0)
7583 {
7586 }
7587 else
7588 {
7591 }
7592
7593 expression.value();
7594 }
7595
7596 expression.release();
7597 }
7598 }
7599
7600 {
7601 bool error_found = false;
7602
7606
7607 std::vector<T> v0;
7608 std::vector<T> s;
7609
7610 #define pb(v,N) \
7611 v.push_back(T(N)); \
7612
7615
7616 pb(s, 3)
pb(s, 6)
pb(s, 9)
pb(s,12)
7617 pb(s,15)
pb(s,18)
pb(s,21)
7618 #undef pb
7619
7620 const std::string expr_string = "var i := 0; v[i + 0] + v[i + 1] + v[i + 2]";
7621
7623
7624 symbol_table_t symbol_table;
7625 symbol_table.add_vector("v",v);
7626
7627 expression_t expression;
7628 expression.register_symbol_table(symbol_table);
7629
7630 parser_t parser;
7631
7632 if (!parser.compile(expr_string,expression))
7633 {
7634 printf("run_test18() - [12] Error: %s\tExpression: %s\n",
7635 parser.error().c_str(),
7636 expr_string.c_str());
7637
7638 error_found = true;
7639 }
7640
7641 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7642 {
7644
7645 const T sum = expression.value();
7646
7648 {
7649 printf("run_test18() - Error in evaluation! (9) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7650 expr_string.c_str(),
7651 s[i].toDouble(),
7652 sum.toDouble());
7653
7654 error_found = true;
7655 }
7656
7657 }
7658
7659 if (error_found)
7660 {
7661 return false;
7662 }
7663 }
7664
7665 {
7669
7670 T v0[] = { T(0), T(1), T(2), T(3), T(4) };
7671 T v1[] = { T(5), T(6), T(7), T(8), T(9) };
7672
7673 const std::size_t v0_size = sizeof(v0) / sizeof (T);
7674 const std::size_t v1_size = sizeof(v1) / sizeof (T);
7675
7677
7679
7680 symbol_table_t symbol_table;
7681 symbol_table.add_vector("v",v);
7682 symbol_table.add_function("vec_sum",vec_sum);
7683
7684 expression_t expression;
7685 expression.register_symbol_table(symbol_table);
7686
7687 parser_t parser;
7688
7689 const std::string expr_string = "vec_sum(v)";
7690
7691 if (!parser.compile(expr_string,expression))
7692 {
7693 printf("run_test18() - [13] Error: %s\tExpression: %s\n",
7694 parser.error().c_str(),
7695 expr_string.c_str());
7696
7697 return false;
7698 }
7699
7700 const T expected_result0 = std::accumulate(v0, v0 + v0_size, T(0));
7701
7702 if (expression.value() != expected_result0)
7703 {
7704 printf("run_test18() - Error in evaluation! (10.1) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7705 expr_string.c_str(),
7706 expected_result0.toDouble(),
7707 expression.value().toDouble());
7708
7709 return false;
7710 }
7711
7713
7714 const T expected_result1 = std::accumulate(v1, v1 + v1_size, T(0));
7715
7716 if (expression.value() != expected_result1)
7717 {
7718 printf("run_test18() - Error in evaluation! (10.2) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7719 expr_string.c_str(),
7720 expected_result1.toDouble(),
7721 expression.value().toDouble());
7722
7723 return false;
7724 }
7725 }
7726
7727 {
7728 bool error_found = false;
7729
7733
7735
7736 symbol_table_t symbol_table;
7737 symbol_table.add_package(vecops_pkg);
7738
7739 const std::string expr_str_list[] =
7740 {
7741 "var v[9] := {1,2,3,4,5,6,7,8,9}; all_true(v) == true" ,
7742 "var v[6] := {-1,-2,-3,-4,-5,-6}; all_true(v) == true" ,
7743 "var v[8] := {1,2,3,0,0,0,0,0}; all_true(v) == false",
7744 "var v[8] := {-1,-2,-3,0,0,0,0,0}; all_true(v) == false",
7745 "var v[9] := {0,0,0,0,0,0,0,0,0}; all_true(v + 1) == true",
7746
7747 "var v[9] := {0,0,0,0,0,0,0,0,0}; all_false(v) == true" ,
7748 "var v[9] := {0,0,0,0,0,1,2,3,4}; all_false(v) == false" ,
7749 "var v[8] := {0,0,0,0,0,-1,-2,-3}; all_false(v) == false" ,
7750 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
7751
7752 "var v[9] := {0,0,0,0,0,0,0,0,1}; any_true(v) == true" ,
7753 "var v[9] := {0,0,0,0,1,0,0,0,0}; any_true(v) == true" ,
7754 "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v) == false" ,
7755 "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v + 1) == true",
7756
7757 "var v[9] := {1,1,1,1,1,1,1,1,0}; any_false(v) == true" ,
7758 "var v[9] := {1,1,1,1,0,1,1,1,1}; any_false(v) == true" ,
7759 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v) == false" ,
7760 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
7761
7762 "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v) == 0" ,
7763 "var v[9] := {0,0,0,0,0,0,0,0,1}; count(v) == 1" ,
7764 "var v[9] := {0,0,0,0,0,0,0,2,1}; count(v) == 2" ,
7765 "var v[9] := {0,0,0,0,0,0,3,2,1}; count(v) == 3" ,
7766 "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v + 1) == v[]",
7767 "var v[9] := {1,1,1,1,1,1,1,1,1}; count(v - 1) == 0",
7768
7769 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,r); sum(v == r) == v[]",
7770 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,0,8,r,0,8); sum(r) == 45",
7771 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,1,7,r,1,7); sum(r) == 35",
7772 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[5] := [0]; copy(v,0,4,r,0,4); sum(r) == 15",
7773
7774 "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; rol(v,3); sum(v == r) == v[]",
7775 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; ror(v,3); sum(v == r) == v[]",
7776
7777 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; rol(v,2); sum(v == r) == v[]",
7778 "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; ror(v,2); sum(v == r) == v[]",
7779
7780 "var v[5] := {1,2,3,4,5}; var r[5] := {1,3,4,2,5}; rol(v,1,1,3); sum(v == r) == v[]",
7781 "var v[5] := {1,2,3,4,5}; var r[5] := {1,4,2,3,5}; ror(v,1,1,3); sum(v == r) == v[]",
7782
7783 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,0,0}; shftl(v,2); sum(v == r) == v[]",
7784 "var v[5] := {1,2,3,4,5}; var r[5] := {5,0,0,0,0}; shftl(v,4); sum(v == r) == v[]",
7785 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftl(v,5); sum(v == r) == v[]",
7786
7787 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,1,2,3}; shftr(v,2); sum(v == r) == v[]",
7788 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,1}; shftr(v,4); sum(v == r) == v[]",
7789 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftr(v,5); sum(v == r) == v[]",
7790
7791 "var v[5] := {1,2,3,4,5}; var r[5] := {1,3,4,0,5}; shftl(v,1,1,3); sum(v == r) == v[]",
7792 "var v[5] := {1,2,3,4,5}; var r[5] := {1,0,2,3,5}; shftr(v,1,1,3); sum(v == r) == v[]",
7793
7794 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
7795 "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
7796 "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,1,3); sum(v == r) == v[]",
7797 "var v[5] := {5,4,2,3,1}; var r[5] := {5,2,3,4,1}; sort(v,1,3); sum(v == r) == v[]",
7798 "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,0,2); sum(v == r) == v[]",
7799 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,2,4); sum(v == r) == v[]",
7800
7801 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
7802 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'aScEnDiNg'); sum(v == r) == v[]",
7803 "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
7804 "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',1,3); sum(v == r) == v[]",
7805 "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',0,2); sum(v == r) == v[]",
7806 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',2,4); sum(v == r) == v[]",
7807
7808 "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
7809 "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'DeScEnDiNg'); sum(v == r) == v[]",
7810 "var v[5] := {5,4,3,2,1}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
7811 "var v[5] := {1,4,2,3,5}; var r[5] := {1,4,3,2,5}; sort(v,'descending',1,3); sum(v == r) == v[]",
7812 "var v[5] := {3,1,2,4,5}; var r[5] := {3,2,1,4,5}; sort(v,'descending',0,2); sum(v == r) == v[]",
7813 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,5,4,3}; sort(v,'descending',2,4); sum(v == r) == v[]",
7814
7815 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); v[v[] / 2] == 5",
7816 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); v[v[] / 3] == 4",
7817
7818 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); sort(v,0,trunc(v[] / 2)); (v[v[] / 2] == 5) and (v[0] == 1)",
7819 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); sort(v,0,trunc(v[] / 3)); (v[v[] / 3] == 4) and (v[0] == 1)",
7820
7821 "var v[5]; iota(v, 0,1); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7822 "var v[5]; iota(v, 0,2); var r[5] := { 0, 2, 4, 6, 8}; sum(v == r) == v[]",
7823 "var v[5]; iota(v, 1,1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7824 "var v[5]; iota(v, 1,2); var r[5] := { 1, 3, 5, 7, 9}; sum(v == r) == v[]",
7825 "var v[5]; iota(v,-1,1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7826 "var v[5]; iota(v,-1,2); var r[5] := {-1, 1, 3, 5, 7}; sum(v == r) == v[]",
7827 "var v[5]; iota(v,-2,1); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7828 "var v[5]; iota(v,-2,2); var r[5] := {-2, 0, 2, 4, 6}; sum(v == r) == v[]",
7829 "var v[5]; iota(v, 0); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7830 "var v[5]; iota(v, 1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7831 "var v[5]; iota(v,-1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7832 "var v[5]; iota(v,-2); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7833 "var v[5]; iota(v, 0, 0); var r[5] := { 0, 0, 0, 0, 0}; sum(v == r) == v[]",
7834 "var v[5]; iota(v, 1, 0); var r[5] := { 1, 1, 1, 1, 1}; sum(v == r) == v[]",
7835
7836 "var v[5]; iota(v, 0, v[] - 1, 0,1); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7837 "var v[5]; iota(v, 0, v[] - 1, 0,2); var r[5] := { 0, 2, 4, 6, 8}; sum(v == r) == v[]",
7838 "var v[5]; iota(v, 0, v[] - 1, 1,1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7839 "var v[5]; iota(v, 0, v[] - 1, 1,2); var r[5] := { 1, 3, 5, 7, 9}; sum(v == r) == v[]",
7840 "var v[5]; iota(v, 0, v[] - 1,-1,1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7841 "var v[5]; iota(v, 0, v[] - 1,-1,2); var r[5] := {-1, 1, 3, 5, 7}; sum(v == r) == v[]",
7842 "var v[5]; iota(v, 0, v[] - 1,-2,1); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7843 "var v[5]; iota(v, 0, v[] - 1,-2,2); var r[5] := {-2, 0, 2, 4, 6}; sum(v == r) == v[]",
7844 "var v[5]; iota(v, 0, v[] - 1, 0 ); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7845 "var v[5]; iota(v, 0, v[] - 1, 1 ); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7846 "var v[5]; iota(v, 0, v[] - 1,-1 ); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7847 "var v[5]; iota(v, 0, v[] - 1,-2 ); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7848 "var v[5]; iota(v, 0, v[] - 1, 0,0); var r[5] := { 0, 0, 0, 0, 0}; sum(v == r) == v[]",
7849 "var v[5]; iota(v, 0, v[] - 1, 1,0); var r[5] := { 1, 1, 1, 1, 1}; sum(v == r) == v[]",
7850
7851 "var v[5]; iota(v, 1, v[] - 1, 0,1); var r[5] := { 0, 0, 1, 2, 3 }; sum(v == r) == v[]",
7852 "var v[5]; iota(v, 1, v[] - 1, 0,2); var r[5] := { 0, 0, 2, 4, 6 }; sum(v == r) == v[]",
7853 "var v[5]; iota(v, 1, v[] - 1, 1,1); var r[5] := { 0, 1, 2, 3, 4 }; sum(v == r) == v[]",
7854 "var v[5]; iota(v, 1, v[] - 1, 1,2); var r[5] := { 0, 1, 3, 5, 7 }; sum(v == r) == v[]",
7855 "var v[5]; iota(v, 1, v[] - 1,-1,1); var r[5] := { 0, -1, 0, 1, 2 }; sum(v == r) == v[]",
7856 "var v[5]; iota(v, 1, v[] - 1,-1,2); var r[5] := { 0, -1, 1, 3, 5 }; sum(v == r) == v[]",
7857 "var v[5]; iota(v, 1, v[] - 1,-2,1); var r[5] := { 0, -2,-1, 0, 1 }; sum(v == r) == v[]",
7858 "var v[5]; iota(v, 1, v[] - 1,-2,2); var r[5] := { 0, -2, 0, 2, 4 }; sum(v == r) == v[]",
7859 "var v[5]; iota(v, 1, v[] - 1, 0 ); var r[5] := { 0, 0, 1, 2, 3 }; sum(v == r) == v[]",
7860 "var v[5]; iota(v, 1, v[] - 1, 1 ); var r[5] := { 0, 1, 2, 3, 4 }; sum(v == r) == v[]",
7861 "var v[5]; iota(v, 1, v[] - 1,-1 ); var r[5] := { 0, -1, 0, 1, 2 }; sum(v == r) == v[]",
7862 "var v[5]; iota(v, 1, v[] - 1,-2 ); var r[5] := { 0, -2,-1, 0, 1 }; sum(v == r) == v[]",
7863
7864 "var v[5]; iota(v, 1, v[] - 2, 0,1); var r[5] := { 0, 0, 1, 2, 0 }; sum(v == r) == v[]",
7865 "var v[5]; iota(v, 1, v[] - 2, 0,2); var r[5] := { 0, 0, 2, 4, 0 }; sum(v == r) == v[]",
7866 "var v[5]; iota(v, 1, v[] - 2, 1,1); var r[5] := { 0, 1, 2, 3, 0 }; sum(v == r) == v[]",
7867 "var v[5]; iota(v, 1, v[] - 2, 1,2); var r[5] := { 0, 1, 3, 5, 0 }; sum(v == r) == v[]",
7868 "var v[5]; iota(v, 1, v[] - 2,-1,1); var r[5] := { 0, -1, 0, 1, 0 }; sum(v == r) == v[]",
7869 "var v[5]; iota(v, 1, v[] - 2,-1,2); var r[5] := { 0, -1, 1, 3, 0 }; sum(v == r) == v[]",
7870 "var v[5]; iota(v, 1, v[] - 2,-2,1); var r[5] := { 0, -2,-1, 0, 0 }; sum(v == r) == v[]",
7871 "var v[5]; iota(v, 1, v[] - 2,-2,2); var r[5] := { 0, -2, 0, 2, 0 }; sum(v == r) == v[]",
7872 "var v[5]; iota(v, 1, v[] - 2, 0 ); var r[5] := { 0, 0, 1, 2, 0 }; sum(v == r) == v[]",
7873 "var v[5]; iota(v, 1, v[] - 2, 1 ); var r[5] := { 0, 1, 2, 3, 0 }; sum(v == r) == v[]",
7874 "var v[5]; iota(v, 1, v[] - 2,-1 ); var r[5] := { 0, -1, 0, 1, 0 }; sum(v == r) == v[]",
7875 "var v[5]; iota(v, 1, v[] - 2,-2 ); var r[5] := { 0, -2,-1, 0, 0 }; sum(v == r) == v[]",
7876
7877 "var v[5]; iota(v, 0, v[] - 2, 0,1); var r[5] := { 0, 1, 2, 3, 0}; sum(v == r) == v[]",
7878 "var v[5]; iota(v, 0, v[] - 2, 0,2); var r[5] := { 0, 2, 4, 6, 0}; sum(v == r) == v[]",
7879 "var v[5]; iota(v, 0, v[] - 2, 1,1); var r[5] := { 1, 2, 3, 4, 0}; sum(v == r) == v[]",
7880 "var v[5]; iota(v, 0, v[] - 2, 1,2); var r[5] := { 1, 3, 5, 7, 0}; sum(v == r) == v[]",
7881 "var v[5]; iota(v, 0, v[] - 2,-1,1); var r[5] := {-1, 0, 1, 2, 0}; sum(v == r) == v[]",
7882 "var v[5]; iota(v, 0, v[] - 2,-1,2); var r[5] := {-1, 1, 3, 5, 0}; sum(v == r) == v[]",
7883 "var v[5]; iota(v, 0, v[] - 2,-2,1); var r[5] := {-2,-1, 0, 1, 0}; sum(v == r) == v[]",
7884 "var v[5]; iota(v, 0, v[] - 2,-2,2); var r[5] := {-2, 0, 2, 4, 0}; sum(v == r) == v[]",
7885 "var v[5]; iota(v, 0, v[] - 2, 0 ); var r[5] := { 0, 1, 2, 3, 0}; sum(v == r) == v[]",
7886 "var v[5]; iota(v, 0, v[] - 2, 1 ); var r[5] := { 1, 2, 3, 4, 0}; sum(v == r) == v[]",
7887 "var v[5]; iota(v, 0, v[] - 2,-1 ); var r[5] := {-1, 0, 1, 2, 0}; sum(v == r) == v[]",
7888 "var v[5]; iota(v, 0, v[] - 2,-2 ); var r[5] := {-2,-1, 0, 1, 0}; sum(v == r) == v[]",
7889
7890 "var v[5]; iota(v, 0, -1); var r[5] := { 0, -1, -2, -3, -4}; sum(v == r) == v[]",
7891 "var v[5]; iota(v, 0, -2); var r[5] := { 0, -2, -4, -6, -8}; sum(v == r) == v[]",
7892 "var v[5]; iota(v, -1, -2); var r[5] := { -1, -3, -5, -7, -9}; sum(v == r) == v[]",
7893
7894 "var v[5]; iota(v, 0, v[] -1, 0, -1); var r[5] := { 0, -1, -2, -3, -4}; sum(v == r) == v[]",
7895 "var v[5]; iota(v, 0, v[] -1, 0, -2); var r[5] := { 0, -2, -4, -6, -8}; sum(v == r) == v[]",
7896 "var v[5]; iota(v, 0, v[] -1, -1, -2); var r[5] := { -1, -3, -5, -7, -9}; sum(v == r) == v[]",
7897
7898 "var v[5]; iota(v, 0,1); threshold_below(v,2, 0) var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7899 "var v[5]; iota(v, 0,1); threshold_above(v,2, 0) var r[5] := { 0, 1, 2, 0, 0}; sum(v == r) == v[]",
7900
7901 "var v[5]; iota(v, 0,1); threshold_below(v,0,v[] - 1,2, 0) var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7902 "var v[5]; iota(v, 0,1); threshold_above(v,0,v[] - 1,2, 0) var r[5] := { 0, 1, 2, 0, 0}; sum(v == r) == v[]",
7903
7904 "var v[5]; iota(v, 1,1); threshold_below(v,1,v[] - 1,2, 0) var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7905 "var v[5]; iota(v, 1,1); threshold_above(v,1,v[] - 1,2, 0) var r[5] := { 1, 2, 0, 0, 0}; sum(v == r) == v[]",
7906
7907 "var v[5]; iota(v, 0,1); threshold_below(v,0,v[] - 2,2, 0) var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7908 "var v[5]; iota(v, 0,1); threshold_above(v,0,v[] - 2,2, 0) var r[5] := { 0, 1, 2, 0, 4}; sum(v == r) == v[]",
7909
7910 " var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + y; axpy(a,x,y); sum(y == r) == y[]",
7911 " var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + b * y; axpby(a,x,b,y); sum(y == r) == y[]",
7912
7913 " var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + y; axpyz(a,x,y,z); sum(z == r) == z[]",
7914 " var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + b * y; axpbyz(a,x,b,y,z); sum(z == r) == z[]",
7915 " var a := 2; var b := 3; var x[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + b; axpbz(a,x,b,z); sum(z == r) == z[]",
7916 };
7917
7918 const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
7919
7920 parser_t parser;
7921
7922 for (std::size_t i = 0; i < expr_str_list_size; ++i)
7923 {
7924 expression_t expression;
7925 expression.register_symbol_table(symbol_table);
7926
7927 if (!parser.compile(expr_str_list[i], expression))
7928 {
7929 printf("run_test18() - [14] Error: %s Expression: %s\n",
7930 parser.error().c_str(),
7931 expr_str_list[i].c_str());
7932
7933 error_found = true;
7934
7935 continue;
7936 }
7937
7938 const T result = expression.value();
7939
7940 if (result != T(1))
7941 {
7942 printf("run_test18() - Error in evaluation! (11) Expression: %s\n",
7943 expr_str_list[i].c_str());
7944
7945 error_found = true;
7946 }
7947 }
7948
7949 if (error_found)
7950 {
7951 return false;
7952 }
7953 }
7954
7955 {
7957
7958 std::string a = "a";
7959 std::string b = "b";
7960 std::string c = "c";
7961 std::string d = "d";
7962
7963 T x = T(1.1);
7964 T y = T(2.2);
7965 T z = T(3.3);
7966 T w = T(4.4);
7967
7969 (
7970 "T:T|T:TT|T:TTT|T:TTTT|"
7971 "T:S|T:SS|T:SSS|T:SSSS|"
7972 "T:ST|T:STS|T:STST|"
7973 "T:TS|T:TST|T:TSTS|"
7974 "T:TTSS|T:SSTT|T:STTS|T:TSST"
7975 );
7976
7978
7984
7989
7991
7993 typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
7994
7995 static const test_pack_t test_pack_list[] =
7996 {
7997 test_pack_t("foo(x)" , test_result_t( 0, "T" )),
7998 test_pack_t("foo(x, y)" , test_result_t( 1, "TT" )),
7999 test_pack_t("foo(x, y, z)" , test_result_t( 2, "TTT" )),
8000 test_pack_t("foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
8001 test_pack_t("foo(x + y)" , test_result_t( 0, "T" )),
8002 test_pack_t("foo(x + y, y + z)" , test_result_t( 1, "TT" )),
8003 test_pack_t("foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
8004 test_pack_t("foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
8005 test_pack_t("foo(a)" , test_result_t( 4, "S" )),
8006 test_pack_t("foo(a, b)" , test_result_t( 5, "SS" )),
8007 test_pack_t("foo(a, b, c)" , test_result_t( 6, "SSS" )),
8008 test_pack_t("foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
8009 test_pack_t("foo(a + b)" , test_result_t( 4, "S" )),
8010 test_pack_t("foo(a + b, b + c)" , test_result_t( 5, "SS" )),
8011 test_pack_t("foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
8012 test_pack_t("foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
8013 test_pack_t("foo(a, x)" , test_result_t( 8, "ST" )),
8014 test_pack_t("foo(a, x, b)" , test_result_t( 9, "STS" )),
8015 test_pack_t("foo(a, x, b, y)" , test_result_t(10, "STST")),
8016 test_pack_t("foo(a + b, x + y)" , test_result_t( 8, "ST" )),
8017 test_pack_t("foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
8018 test_pack_t("foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
8019 test_pack_t("foo(x, a)" , test_result_t(11, "TS" )),
8020 test_pack_t("foo(x, a, y)" , test_result_t(12, "TST" )),
8021 test_pack_t("foo(x, a, y, b)" , test_result_t(13, "TSTS")),
8022 test_pack_t("foo(x + y, a + b)" , test_result_t(11, "TS" )),
8023 test_pack_t("foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
8024 test_pack_t("foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
8025 test_pack_t("foo(x, y, a, b)" , test_result_t(14, "TTSS")),
8026 test_pack_t("foo(a, b, x, y)" , test_result_t(15, "SSTT")),
8027 test_pack_t("foo(a, x, y, b)" , test_result_t(16, "STTS")),
8028 test_pack_t("foo(x, a, b, y)" , test_result_t(17, "TSST")),
8029 test_pack_t("foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
8030 test_pack_t("foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
8031 test_pack_t("foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
8032 test_pack_t("foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
8033 };
8034
8035 static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
8036
8038
8039 for (std::size_t i = 0; i < test_pack_list_size; ++i)
8040 {
8041 expression_t expression;
8042 expression.register_symbol_table(symbol_table);
8043
8045
8046 if (!parser.
compile(test_pack_list[i].first, expression))
8047 {
8048 printf("run_test18() - [15] Overload VarArg Error: %s Expression: %s\n",
8049 parser.
error().c_str(),
8050 test_pack_list[i].first.c_str());
8051
8052 return false;
8053 }
8054 else
8056 }
8057
8058 bool error_found = false;
8059
8061 {
8062 ovrld_func.clear();
8063
8065 {
8066 printf("run_test18() - Error in evaluation! (12) Expression: %s\n",
8067 test_pack_list[i].first.c_str());
8068
8069 error_found = true;
8070 }
8071
8072 if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
8073 {
8074 printf("run_test18() - Error with ps_index (12) Expression: %s Expected: %d Got: %d\n",
8075 test_pack_list[i].first.c_str(),
8076 static_cast<int>(test_pack_list[i].second.ps_index),
8077 static_cast<int>(ovrld_func.current_ps_index));
8078
8079 error_found = true;
8080 }
8081
8082 if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
8083 {
8084 printf("run_test18() - Error with parameter seq (12) Expression: %s Expected: %s Got: %s\n",
8085 test_pack_list[i].first.c_str(),
8086 test_pack_list[i].second.param_seq.c_str(),
8087 ovrld_func.current_param_seq.c_str());
8088
8089 error_found = true;
8090 }
8091 ::fflush(stdout);
8092 }
8093
8094 if (error_found)
8095 {
8096 return false;
8097 }
8098 }
8099
8100 {
8102
8103 std::string a = "a";
8104 std::string b = "b";
8105 std::string c = "c";
8106 std::string d = "d";
8107 std::string result = "";
8108
8109 T x = T(1.1);
8110 T y = T(2.2);
8111 T z = T(3.3);
8112 T w = T(4.4);
8113
8115 (
8116 "S:T|S:TT|S:TTT|S:TTTT|"
8117 "S:S|S:SS|S:SSS|S:SSSS|"
8118 "S:ST|S:STS|S:STST|"
8119 "S:TS|S:TST|S:TSTS|"
8120 "S:TTSS|S:SSTT|S:STTS|S:TSST"
8121 );
8122
8124
8130
8136
8138
8140 typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
8141
8142 static const test_pack_t test_pack_list[] =
8143 {
8144 test_pack_t("result := foo(x)" , test_result_t( 0, "T" )),
8145 test_pack_t("result := foo(x, y)" , test_result_t( 1, "TT" )),
8146 test_pack_t("result := foo(x, y, z)" , test_result_t( 2, "TTT" )),
8147 test_pack_t("result := foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
8148 test_pack_t("result := foo(x + y)" , test_result_t( 0, "T" )),
8149 test_pack_t("result := foo(x + y, y + z)" , test_result_t( 1, "TT" )),
8150 test_pack_t("result := foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
8151 test_pack_t("result := foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
8152 test_pack_t("result := foo(a)" , test_result_t( 4, "S" )),
8153 test_pack_t("result := foo(a, b)" , test_result_t( 5, "SS" )),
8154 test_pack_t("result := foo(a, b, c)" , test_result_t( 6, "SSS" )),
8155 test_pack_t("result := foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
8156 test_pack_t("result := foo(a + b)" , test_result_t( 4, "S" )),
8157 test_pack_t("result := foo(a + b, b + c)" , test_result_t( 5, "SS" )),
8158 test_pack_t("result := foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
8159 test_pack_t("result := foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
8160 test_pack_t("result := foo(a, x)" , test_result_t( 8, "ST" )),
8161 test_pack_t("result := foo(a, x, b)" , test_result_t( 9, "STS" )),
8162 test_pack_t("result := foo(a, x, b, y)" , test_result_t(10, "STST")),
8163 test_pack_t("result := foo(a + b, x + y)" , test_result_t( 8, "ST" )),
8164 test_pack_t("result := foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
8165 test_pack_t("result := foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
8166 test_pack_t("result := foo(x, a)" , test_result_t(11, "TS" )),
8167 test_pack_t("result := foo(x, a, y)" , test_result_t(12, "TST" )),
8168 test_pack_t("result := foo(x, a, y, b)" , test_result_t(13, "TSTS")),
8169 test_pack_t("result := foo(x + y, a + b)" , test_result_t(11, "TS" )),
8170 test_pack_t("result := foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
8171 test_pack_t("result := foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
8172 test_pack_t("result := foo(x, y, a, b)" , test_result_t(14, "TTSS")),
8173 test_pack_t("result := foo(a, b, x, y)" , test_result_t(15, "SSTT")),
8174 test_pack_t("result := foo(a, x, y, b)" , test_result_t(16, "STTS")),
8175 test_pack_t("result := foo(x, a, b, y)" , test_result_t(17, "TSST")),
8176 test_pack_t("result := foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
8177 test_pack_t("result := foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
8178 test_pack_t("result := foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
8179 test_pack_t("result := foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
8180 };
8181
8182 static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
8183
8185
8186 for (std::size_t i = 0; i < test_pack_list_size; ++i)
8187 {
8188 expression_t expression;
8189 expression.register_symbol_table(symbol_table);
8190
8192
8193 if (!parser.
compile(test_pack_list[i].first, expression))
8194 {
8195 printf("run_test18() - [16] Overload VarArg Error: %s Expression: %s\n",
8196 parser.
error().c_str(),
8197 test_pack_list[i].first.c_str());
8198
8199 return false;
8200 }
8201 else
8203 }
8204
8205 bool error_found = false;
8206
8208 {
8209 ovrld_func.clear();
8210 result = "";
8212
8213 if (result != "string result")
8214 {
8215 printf("run_test18() - Error in evaluation! (13) Expression: %s\n",
8216 test_pack_list[i].first.c_str());
8217
8218 error_found = true;
8219 }
8220
8221 if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
8222 {
8223 printf("run_test18() - Error with ps_index (13) Expression: %s Expected: %d Got: %d\n",
8224 test_pack_list[i].first.c_str(),
8225 static_cast<int>(test_pack_list[i].second.ps_index),
8226 static_cast<int>(ovrld_func.current_ps_index));
8227
8228 error_found = true;
8229 }
8230
8231 if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
8232 {
8233 printf("run_test18() - Error with parameter seq (13) Expression: %s Expected: %s Got: %s\n",
8234 test_pack_list[i].first.c_str(),
8235 test_pack_list[i].second.param_seq.c_str(),
8236 ovrld_func.current_param_seq.c_str());
8237
8238 error_found = true;
8239 }
8240 }
8241
8242 if (error_found)
8243 {
8244 return false;
8245 }
8246 }
8247
8248 {
8252
8253 typedef std::pair<std::string,std::size_t> rtc_test_t;
8254 static const rtc_test_t rtc_tests[] =
8255 {
8256 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]]; } ", 5 ),
8257 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + 10]; } ", 5 ),
8258 std::make_pair(" x:= 0; for (var i := 0; i < (2 * v[]); i += 1) { x += (v[i] == vv[i]); } ", 10),
8259 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]] := i; } ", 5 ),
8260 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]] <=> v[i]; } ", 5 ),
8261 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i] <=> v[i + v[]]; } ", 10),
8262 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]]; } ", 5 ),
8263 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + 10]; } ", 5 ),
8264 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]] := i; } ", 5 ),
8265 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]] <=> z[i]; } ", 5 ),
8266 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*w)[i + v[]]; } ", 10),
8267 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*w)[i+w[]]; } ", 10),
8268 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+w)[i + v[]]; } ", 10),
8269 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+w)[i+w[]]; } ", 10),
8270 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*z)[i+v[]]; } ", 10),
8271 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*z)[i+w[]]; } ", 9 ),
8272 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+z)[i+v[]]; } ", 10),
8273 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+z)[i+z[]]; } ", 10),
8274 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; qq[i[0]] += xx ", 0 ),
8275 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[1] + xx) == (xx + qq[1])) ", 0 ),
8276 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] += xx) == xx) ", 0 ),
8277 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] += xx + yy) == (xx + yy)) ", 0 ),
8278 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] -= xx) == -xx) ", 0 ),
8279 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] -= (xx + yy)) == -(xx + yy)) ", 0 ),
8280 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[1] + qq[2]) == (qq[3 - 1] + qq[2 * 1/2]))", 0 ),
8281 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[qq[1]] == qq[1]) ", 0 ),
8282 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[1] += qq[1]) == qq[1 + 1] ", 0 ),
8283 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[1]] + xx) == (xx + qq[i[1]])) ", 0 ),
8284 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] += xx) == xx) ", 0 ),
8285 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] += xx + yy) == (xx + yy)) ", 0 ),
8286 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] -= xx) == -xx) ", 0 ),
8287 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] -= (xx + yy)) == -(xx + yy))", 0 ),
8288 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[1]] + qq[2]) == (qq[i[3] - i[1]] + qq[i[2] * 1/2]))", 0 ),
8289 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[qq[i[1]]] == qq[i[1]]) ", 0 ),
8290 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[i[1]] += qq[i[1]]) == qq[i[1] + 1] ", 0 ),
8291 };
8292
8293 static const std::size_t rtc_tests_size = sizeof(rtc_tests) / sizeof(rtc_test_t);
8294
8295 bool error_found = false;
8296
8297 for (std::size_t i = 0; i < rtc_tests_size; ++i)
8298 {
8299 const std::string& expression_str = rtc_tests[i].first;
8300
8301 {
8302 T x = 6;
8303 T v[5] = { 0, 1, 2, 3, 4 };
8304 T w[3] = { 0, 1, 2 };
8307
8308 symbol_table_t symbol_table;
8309 expression_t expression;
8310 parser_t parser;
8311
8312 symbol_table.add_variable("x" , x );
8313 symbol_table.add_vector ("v" , v );
8314 symbol_table.add_vector ("w" , w );
8315 symbol_table.add_vector ("vv", vv);
8316 symbol_table.add_vector ("ww", ww);
8317
8319
8320 expression.register_symbol_table(symbol_table);
8321
8322 parser.register_vector_access_runtime_check(vartc);
8323
8324 if (!parser.compile(expression_str, expression))
8325 {
8326 printf("run_test18() - Error: %s\t [1] Expression: %s\n",
8327 parser.error().c_str(),
8328 expression_str.c_str());
8329
8330 error_found = true;
8331 return false;
8332 }
8333
8335 expression.value();
8336
8337 if (vartc.
rtc_count != rtc_tests[i].second)
8338 {
8339 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [0] Expression: %s\n",
8340 static_cast<unsigned int>(rtc_tests[i].second),
8341 static_cast<unsigned int>(vartc.
rtc_count),
8342 expression_str.c_str());
8343 error_found = true;
8344 }
8345 }
8346
8347 {
8348 T x = 6;
8349 T v[5] = { 0, 1, 2, 3, 4 };
8350 T w[3] = { 0, 1, 2 };
8351 T v0[5] = { 0, 1, 2, 3, 4 };
8352 T v1[5] = { 0, 1, 2, 3, 4 };
8355
8356 symbol_table_t symbol_table;
8357 expression_t expression;
8358 parser_t parser;
8359
8360 symbol_table.add_variable("x" , x );
8361 symbol_table.add_vector ("v" , v );
8362 symbol_table.add_vector ("w" , w );
8363 symbol_table.add_vector ("vv", vv);
8364 symbol_table.add_vector ("ww", ww);
8365
8367
8368 expression.register_symbol_table(symbol_table);
8369
8370 parser.register_vector_access_runtime_check(vartc);
8371
8372 if (!parser.compile(expression_str, expression))
8373 {
8374 printf("run_test18() - Error: %s\t [2] Expression: %s\n",
8375 parser.error().c_str(),
8376 expression_str.c_str());
8377
8378 error_found = true;
8379 return false;
8380 }
8381
8384 expression.value();
8385
8386 if (vartc.
rtc_count != rtc_tests[i].second)
8387 {
8388 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [1] Expression: %s\n",
8389 static_cast<unsigned int>(rtc_tests[i].second),
8390 static_cast<unsigned int>(vartc.
rtc_count),
8391 expression_str.c_str());
8392 error_found = true;
8393 }
8394
8397 expression.value();
8398
8399 if (vartc.
rtc_count != rtc_tests[i].second)
8400 {
8401 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [2] Expression: %s\n",
8402 static_cast<unsigned int>(rtc_tests[i].second),
8403 static_cast<unsigned int>(vartc.
rtc_count),
8404 expression_str.c_str());
8405 error_found = true;
8406 }
8407 }
8408 }
8409
8410 if (error_found)
8411 {
8412 return false;
8413 }
8414 }
8415
8416 return true;
8417}
std::string parameter_sequence
bool remove_vararg_function(const std::string &vararg_function_name)
bool remove_vector(const std::string &vector_name)
void rebase(data_ptr_t data)