6473{
6474 {
6482 }
6483
6484 {
6486
6487 {
6488 T x;
6489 const bool result1 = symbol_table.
add_variable(
"x", x);
6492
6493 if (!result1 || !result2 || result3)
6494 {
6495 printf("run_test18() - Failed sym_tab add/remove [1]\n");
6496 }
6497 }
6498
6499 {
6500 std::string x;
6504
6505 if (!result1 || !result2 || result3)
6506 {
6507 printf("run_test18() - Failed sym_tab add/remove [2]\n");
6508 }
6509 }
6510
6511 {
6512 std::vector<T> x(10,T(0));
6513 const bool result1 = symbol_table.
add_vector(
"x", x);
6516
6517 if (!result1 || !result2 || result3)
6518 {
6519 printf("run_test18() - Failed sym_tab add/remove [3]\n");
6520 }
6521 }
6522
6523 {
6525 const bool result1 = symbol_table.
add_function(
"x", x);
6528
6529 if (!result1 || !result2 || result3)
6530 {
6531 printf("run_test18() - Failed sym_tab add/remove [4]\n");
6532 }
6533 }
6534
6535 {
6537 const bool result1 = symbol_table.
add_function(
"x", x);
6540
6541 if (!result1 || !result2 || result3)
6542 {
6543 printf("run_test18() - Failed sym_tab add/remove [5]\n");
6544 }
6545 }
6546
6547 {
6554
6561 }
6562 }
6563
6564 {
6566
6567 T x = T(1.1);
6568 T y = T(2.2);
6569 T z = T(3.3);
6570 T w = T(4.4);
6571 T u = T(5.5);
6572 T v = T(6.6);
6573 T t = T(7.7);
6574
6576
6587
6588 static const std::string expr_str_list[] =
6589 {
6590 "equal(va_func,(0))",
6591 "equal(va_func(),(0))",
6592 "equal(va_func(1,2,3,4,5,6,7,8,9),(1+2+3+4+5+6+7+8+9))",
6593 "equal(va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9))",
6594 "equal(va_func(x,2,y,4,z,6,w,8,u),(x+2+y+4+z+6+w+8+u))",
6595 "equal(va_func(x,y,z,w,u,v,t,1,2,3),(x+y+z+w+u+v+t+1+2+3))",
6596 "equal(va_func(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
6597 "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))",
6598 "equal(1+va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9)+1)",
6599 "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))",
6600 "equal(va_func(va_func(x),va_func(y),va_func(z)),va_func(x,y,z))",
6601 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x)))))))),x)",
6602 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(123.456)))))))),123.456)",
6603 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+1)))))))),x+1)",
6604 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+y)))))))),x+y)"
6605 };
6606 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6607
6609
6610 for (std::size_t i = 0; i < expr_str_list_size; ++i)
6611 {
6612 expression_t expression;
6613 expression.register_symbol_table(symbol_table);
6614
6616
6617 if (!parser.
compile(expr_str_list[i],expression))
6618 {
6619 printf("run_test18() - [1] VarArg Error: %s Expression: %s\n",
6620 parser.
error().c_str(),
6621 expr_str_list[i].c_str());
6622
6623 return false;
6624 }
6625 else
6627 }
6628
6629 bool error_found = false;
6630
6632 {
6634 {
6635 printf("run_test18() - Error in evaluation! (1) Expression: %s\n",
6636 expr_str_list[i].c_str());
6637
6638 error_found = true;
6639 }
6640 }
6641
6642 if (error_found)
6643 {
6644 return false;
6645 }
6646 }
6647
6648 {
6652
6653 T x = T(33);
6654 T y = T(77);
6655
6656 T v0[] = { T(1), T(1), T(1), T(1) };
6657 T v1[] = { T(1), T(2), T(3), T(4) };
6658
6659 std::vector<T> v2;
6660
6661 v2.push_back(T(5));
6662 v2.push_back(T(6));
6663 v2.push_back(T(7));
6664 v2.push_back(T(8));
6665
6666 std::string s0 = "AbCdEfGhIj";
6667
6669
6670 symbol_table_t symbol_table;
6671
6673
6674 symbol_table.add_variable ("x" , x);
6675 symbol_table.add_variable ("y" , y);
6676 symbol_table.add_vector ("v0" ,v0);
6677 symbol_table.add_vector ("v1" ,v1);
6678 symbol_table.add_vector ("v2" ,v2);
6679 symbol_table.add_stringvar("s0", s0);
6680 symbol_table.add_function ("gen_func", f);
6681
6683 {
6684 "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]);",
6685 "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]);",
6686 "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);",
6687 "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);",
6688 "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]);",
6689 "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);",
6690 "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);",
6691 "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);",
6692 "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);",
6693 "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');"
6694 };
6695
6697
6698 bool error_found = false;
6699
6701 {
6703 expression_t expression;
6704
6705 expression.register_symbol_table(symbol_table);
6706
6707 parser_t parser;
6708
6709 if (!parser.compile(expression_str,expression))
6710 {
6711 printf("run_test18() - [2] GenFunc Error: %s Expression: %s [2]\n",
6712 parser.error().c_str(),
6713 expression_str.c_str());
6714
6715 error_found = true;
6716 continue;
6717 }
6718
6722
6723 expression.value();
6724
6725 if (
6729 )
6730 {
6731 printf("run_test18() - Error in evaluation! (2) Expression: %s "
6732 "sc_count = %d "
6733 "vr_count = %d "
6734 "st_count = %d\n",
6739
6740 error_found = true;
6741 }
6742
6743 expression.release();
6744 }
6745
6746 if (error_found)
6747 {
6748 return false;
6749 }
6750 }
6751
6752 {
6756
6757 T x = T(33);
6758 T y = T(77);
6759
6760 T v0[] = { T(1), T(1), T(1), T(1) };
6761 T v1[] = { T(1), T(2), T(3), T(4) };
6762 T v2[] = { T(5), T(6), T(7), T(8) };
6763
6764 std::string s0 = "AbCdEfGhIj";
6765
6767
6768 symbol_table_t symbol_table;
6769
6770 symbol_table.add_constants();
6771
6772 symbol_table.add_variable ("x" , x);
6773 symbol_table.add_variable ("y" , y);
6774 symbol_table.add_vector ("v0" ,v0);
6775 symbol_table.add_vector ("v1" ,v1);
6776 symbol_table.add_vector ("v2" ,v2);
6777 symbol_table.add_stringvar("s0", s0);
6778 symbol_table.add_function ("foo", f);
6779
6781 {
6782 "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]);",
6783 "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);",
6784 "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);",
6785 "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]);",
6786 "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);",
6787 "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);",
6788 "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);",
6789 "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);",
6790 "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');",
6791 "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');",
6792 "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]);",
6793 "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]);",
6794 "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]);",
6795 "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]);",
6796 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6797 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6798 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6799 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6800 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6801 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6802 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6803 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6804 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6805 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6806 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6807 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6808 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6809 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6810 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6811 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6812 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6813 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6814 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6815 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6816 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6817 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6818 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6819 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6820 "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]);",
6821 "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]);",
6822 "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]);",
6823 "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]);"
6824 };
6825
6827
6828 const std::string parameter_type_list[] =
6829 {
6830 "VVTTTTVSS",
6831 "VTTTTVSSV",
6832 "TTTTVSSVV",
6833 "TTTVSSVVT",
6834 "TTVSSVVT*",
6835 "TVSSVVT*" ,
6836 "VSSVVT*" ,
6837 "SSVVTTTTV",
6838 "SVVTTTTVS",
6839 "SVVTTTTVS",
6840 "V*T*VS*" ,
6841 "V*TTTTVSS",
6842 "VVT*VSS" ,
6843 "VVTTTTVS*",
6844 "T*",
6845 "T*",
6846 "T*",
6847 "T*",
6848 "S*",
6849 "S*",
6850 "S*",
6851 "S*",
6852 "V*",
6853 "V*",
6854 "V*",
6855 "V*",
6856 "T",
6857 "TT",
6858 "TTT",
6859 "TTTT",
6860 "S",
6861 "SS",
6862 "SSS",
6863 "SSSS",
6864 "V",
6865 "VV",
6866 "VVV",
6867 "VVVV",
6868 "TTTTTTT|STSTSTS|V*T*VS*" ,
6869 "TTTTTTT|STSTSTS|V*TTTTVSS",
6870 "TTTTTTT|STSTSTS|VVT*VSS" ,
6871 "TTTTTTT|STSTSTS|VVTTTTVS*",
6872 };
6873
6874 bool error_found = false;
6875
6877 {
6879 expression_t expression;
6880
6881 expression.register_symbol_table(symbol_table);
6882
6883 parser_t parser;
6884
6886
6887 if (!parser.compile(expression_str,expression))
6888 {
6889 printf("run_test18() - [3] GenFunc2 Error: %s Expression: %s Parameter Sequence: %s [3]\n",
6890 parser.error().c_str(),
6891 expression_str.c_str(),
6892 parameter_type_list[i].c_str());
6893
6894 error_found = true;
6895 continue;
6896 }
6897
6898 expression.value();
6899 }
6900
6901 if (error_found)
6902 {
6903 return false;
6904 }
6905 }
6906
6907 {
6908 bool error_found = false;
6909
6911 {
6912 "foo(v0,v1,v2,x,y,s0);",
6913 "foo(v1,v2,x,y,s0,v0);",
6914 "foo(v2,x,y,s0,v0,v1);",
6915 "foo(x,y,s0,v0,v1,v2);",
6916 "foo(y,s0,v0,v1,v2,x);",
6917 "foo(s0,v0,v1,v2,x,y);"
6918 };
6919
6921
6922 const std::string parameter_type_list[] =
6923 {
6924 "VVVTTS",
6925 "VVTTSV",
6926 "VTTSVV",
6927 "TTSVVV",
6928 "TSVVVT",
6929 "SVVVTT"
6930 };
6931
6933 {
6937
6938 T x = T(33);
6939 T y = T(77);
6940
6941 T v0[] = { T(1), T(1), T(1), T(1) };
6942 T v1[] = { T(1), T(2), T(3), T(4) };
6943 T v2[] = { T(5), T(6), T(7), T(8) };
6944
6945 std::string s0 = "AbCdEfGhIj";
6946
6947 T x_inc = T(34);
6948 T y_inc = T(78);
6949
6950 T v0_inc[] = { T(2), T(2), T(2), T(2) };
6951 T v1_inc[] = { T(2), T(3), T(4), T(5) };
6952 T v2_inc[] = { T(6), T(7), T(8), T(9) };
6953
6954 std::size_t sizeof_vec = sizeof(v0) / sizeof(T);
6955
6956 std::string s0_inc = "BcDeFgHiJk";
6957
6959
6960 symbol_table_t symbol_table;
6961
6962 symbol_table.add_constants();
6963
6964 symbol_table.add_variable ("x" , x );
6965 symbol_table.add_variable ("y" , y );
6966 symbol_table.add_vector ("v0" , v0);
6967 symbol_table.add_vector ("v1" , v1);
6968 symbol_table.add_vector ("v2" , v2);
6969 symbol_table.add_stringvar("s0", s0);
6970 symbol_table.add_function ("foo", f );
6971
6972 expression_t expression;
6973
6974 expression.register_symbol_table(symbol_table);
6975
6976 parser_t parser;
6977
6979
6981 {
6982 printf("run_test18() - [4] IncFunc Error: %s Expression: %s Parameter Sequence: %s [4]\n",
6983 parser.error().c_str(),
6985 parameter_type_list[i].c_str());
6986
6987 error_found = true;
6988 continue;
6989 }
6990
6991 expression.value();
6992
6993 if (x != x_inc)
6994 {
6995 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: x\n",
6997 error_found = true;
6998 }
6999
7000 if (y != y_inc)
7001 {
7002 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
7004 error_found = true;
7005 }
7006
7007 if (s0 != s0_inc)
7008 {
7009 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
7011 error_found = true;
7012 }
7013
7014 if (!std::equal(v0,v0 + sizeof_vec,v0_inc))
7015 {
7016 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v0\n",
7018 error_found = true;
7019 }
7020
7021 if (!std::equal(v1,v1 + sizeof_vec,v1_inc))
7022 {
7023 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v1\n",
7025 error_found = true;
7026 }
7027
7028 if (!std::equal(v2,v2 + sizeof_vec,v2_inc))
7029 {
7030 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v2\n",
7032 error_found = true;
7033 }
7034 }
7035
7036 if (error_found)
7037 {
7038 return false;
7039 }
7040 }
7041
7042 {
7043 bool error_found = false;
7044
7046
7047 std::string s0 = "XXXXXXXXXXXXXXX";
7048 std::string s1 = "XXXXXXXXXXXXXXX";
7049 std::string s2 = "XXXXXXXXXXXXXXX";
7050 std::string s3 = "XXXXXXXXXXXXXXX";
7051 std::string s4 = "XXXXXXXXXXXXXXX";
7052
7056
7057 symbol_table_t symbol_table;
7058
7059 symbol_table.add_constants();
7060
7061 symbol_table.add_stringvar("s0", s0);
7062 symbol_table.add_stringvar("s1", s1);
7063 symbol_table.add_stringvar("s2", s2);
7064 symbol_table.add_stringvar("s3", s3);
7065 symbol_table.add_stringvar("s4", s4);
7066
7067 symbol_table.add_function("remspc_uc", rsauc);
7068
7069 const std::string program =
7070 " s0 := 'How now '; "
7071 " s1 := 'brown cow?'; "
7072 " s2 := remspc_uc(s0 + s1); "
7073 " s3 := remspc_uc(s0) + s1; "
7074 " s4 := s0 + remspc_uc(s1); "
7075 " remspc_uc(s0 + s1) == remspc_uc(s0) + remspc_uc(s1); ";
7076
7077 const std::string parameter_type_list[] =
7078 {
7079 "VVVTTT|S",
7080 "VVTTTV|S",
7081 "VTTTVV|S",
7082 "TTTVVV|S",
7083 "TTVVVT|S",
7084 "TVVVTT|S"
7085 };
7086
7087 std::size_t parameter_type_list_size = sizeof(parameter_type_list) / sizeof(std::string);
7088
7089 for (std::size_t i = 0; i < parameter_type_list_size; ++i)
7090 {
7091 expression_t expression;
7092
7093 expression.register_symbol_table(symbol_table);
7094
7095 parser_t parser;
7096
7098
7099 if (!parser.compile(program,expression))
7100 {
7101 printf("run_test18() - [5] Error: %s\tExpression: %s\n",
7102 parser.error().c_str(),
7103 program.c_str());
7104
7105 return false;
7106 }
7107
7108 const T result = expression.value();
7109
7110 if (result != T(1))
7111 {
7112 printf("run_test18() - Error in evaluation! (4) Expression: %s Result <> 1\n",
7113 program.c_str());
7114 error_found = true;
7115 }
7116
7117 if (result != T(1))
7118 {
7119 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
7120 program.c_str());
7121 error_found = true;
7122 }
7123
7124 if ("How now " != s0)
7125 {
7126 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
7127 program.c_str());
7128 error_found = true;
7129 }
7130
7131 if ("brown cow?" != s1)
7132 {
7133 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s1\n",
7134 program.c_str());
7135 error_found = true;
7136 }
7137
7138 if ("HOWNOWBROWNCOW?" != s2)
7139 {
7140 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s2\n",
7141 program.c_str());
7142 error_found = true;
7143 }
7144
7145 if ("HOWNOWbrown cow?" != s3)
7146 {
7147 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s3\n",
7148 program.c_str());
7149 error_found = true;
7150 }
7151
7152 if ("How now BROWNCOW?" != s4)
7153 {
7154 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s4\n",
7155 program.c_str());
7156 error_found = true;
7157 }
7158 }
7159
7160 if (error_found)
7161 {
7162 return false;
7163 }
7164 }
7165
7166 {
7167 bool error_found = false;
7168
7172
7173 symbol_table_t symbol_table;
7174
7175 T v[4] = {T(5), T(6), T(7), T(8)};
7176
7177 symbol_table.add_vector("v",v);
7178
7180 symbol_table.add_function("vararg_func",vaf);
7181
7182 expression_t expression;
7183 expression.register_symbol_table(symbol_table);
7184
7185 parser_t parser;
7186
7187 const std::string programs[] =
7188 {
7189 "equal(0,vararg_func())",
7190 "equal(1,vararg_func() + 1)",
7191 "equal(1,1 + vararg_func())",
7192 "equal(1,vararg_func + 1)",
7193 "equal(1,1 + vararg_func)",
7194 "equal(0,vararg_func() + vararg_func)",
7195 "equal(0,vararg_func + vararg_func())",
7196 "equal(1,vararg_func + vararg_func(1))",
7197 "equal(1,vararg_func + vararg_func(1,2))",
7198 "equal(2,vararg_func + vararg_func(v))",
7199 "equal(1,vararg_func() + vararg_func(1))",
7200 "equal(1,vararg_func() + vararg_func(1,2))",
7201 "equal(2,vararg_func() + vararg_func(v))",
7202 "equal(2,vararg_func(v))",
7203 "equal(1,vararg_func(1))",
7204 "equal(1,vararg_func(1,2,3))",
7205 "equal(1,vararg_func(5,6,7,8))",
7206 "equal(5,vararg_func(v) + 3)",
7207 "equal(5,vararg_func(1) + 4)",
7208 "equal(6,vararg_func(1,2,3) + 5)",
7209 "equal(7,vararg_func(5,6,7,8) + 6)"
7210 };
7211
7212 static const std::size_t programs_size = sizeof(programs) / sizeof(std::string);
7213
7214 for (std::size_t i = 0; i < programs_size; ++i)
7215 {
7216 if (!parser.compile(programs[i],expression))
7217 {
7218 printf("run_test18() - [6] Error: %s\tExpression: %s\n",
7219 parser.error().c_str(),
7220 programs[i].c_str());
7221
7222 error_found = true;
7223 }
7224 else if (T(1) != expression.value())
7225 {
7226 printf("run_test18() - Error in evaluation! (5) Expression: %s\n",
7227 programs[i].c_str());
7228
7229 error_found = true;
7230 }
7231 }
7232
7233 if (error_found)
7234 {
7235 return false;
7236 }
7237 }
7238
7239 {
7240 bool error_found = false;
7241
7245
7246 std::vector<T> v0;
7247 std::vector<T> v1;
7248 std::vector<T> v2;
7249 std::vector<T> v3;
7250
7251 #define pb(v,N) \
7252 v.push_back(T(N)); \
7253
7258 #undef pb
7259
7260 const std::string expr_string = "sum(v + 1)";
7261
7263
7264 symbol_table_t symbol_table;
7265 symbol_table.add_vector("v",v);
7266
7267 expression_t expression;
7268 expression.register_symbol_table(symbol_table);
7269
7270 parser_t parser;
7271
7272 if (!parser.compile(expr_string,expression))
7273 {
7274 printf("run_test18() - [7] Error: %s\tExpression: %s\n",
7275 parser.error().c_str(),
7276 expr_string.c_str());
7277
7278 error_found = true;
7279 }
7280
7281 T sum = { T(0) };
7282
7283 sum = expression.value();
7284
7286 {
7287 printf("run_test18() - Error in evaluation! (6) Expression: %s\n",
7288 expr_string.c_str());
7289
7290 error_found = true;
7291 }
7292
7294 sum = expression.value();
7295
7297 {
7298 printf("run_test18() - Error in evaluation! (7) Expression: %s\n",
7299 expr_string.c_str());
7300 error_found = true;
7301 }
7302
7304 sum = expression.value();
7305
7307 {
7308 printf("run_test18() - Error in evaluation! (8) Expression: %s\n",
7309 expr_string.c_str());
7310 error_found = true;
7311 }
7312
7314 sum = expression.value();
7315
7317 {
7318 printf("run_test18() - Error in evaluation! (9) Expression: %s\n",
7319 expr_string.c_str());
7320 error_found = true;
7321 }
7322
7323 if (error_found)
7324 {
7325 return false;
7326 }
7327 }
7328
7329 {
7330 bool error_found = false;
7331
7335
7336 std::vector<T> v0;
7337 std::vector<T> s;
7338
7339 #define pb(v,N) \
7340 v.push_back(T(N)); \
7341
7344
7345 pb(s, 3)
pb(s, 6)
pb(s, 9)
pb(s,12)
7346 pb(s,15)
pb(s,18)
pb(s,21)
7347 #undef pb
7348
7349 const std::string expr_string = "v[0] + v[1] + v[2]";
7350
7352
7353 symbol_table_t symbol_table;
7354 symbol_table.add_vector("v",v);
7355
7356 expression_t expression;
7357 expression.register_symbol_table(symbol_table);
7358
7359 parser_t parser;
7360
7361 if (!parser.compile(expr_string,expression))
7362 {
7363 printf("run_test18() - [8] Error: %s\tExpression: %s\n",
7364 parser.error().c_str(),
7365 expr_string.c_str());
7366
7367 error_found = true;
7368 }
7369
7370 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7371 {
7373
7374 T sum = expression.value();
7375
7377 {
7378 printf("run_test18() - Error in evaluation! (7) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7379 expr_string.c_str(),
7380 static_cast<double>(s[i]),
7381 static_cast<double>(sum));
7382
7383 error_found = true;
7384 }
7385
7386 }
7387
7388 if (error_found)
7389 {
7390 return false;
7391 }
7392 }
7393
7394 {
7395 bool error_found = false;
7396
7400
7401 std::vector<T> v0;
7402 std::vector<T> s;
7403
7404 #define pb(v,N) \
7405 v.push_back(T(N)); \
7406
7409
7410 pb(s, 3)
pb(s, 6)
pb(s, 9)
pb(s,12)
7411 pb(s,15)
pb(s,18)
pb(s,21)
7412 #undef pb
7413
7414 const std::string expr_string = "var i := 0; var j := 1; var k := 2; v[i] + v[j] + v[k]";
7415
7417
7418 symbol_table_t symbol_table;
7419 symbol_table.add_vector("v",v);
7420
7421 expression_t expression;
7422 expression.register_symbol_table(symbol_table);
7423
7424 parser_t parser;
7425
7426 if (!parser.compile(expr_string,expression))
7427 {
7428 printf("run_test18() - [9] Error: %s\tExpression: %s\n",
7429 parser.error().c_str(),
7430 expr_string.c_str());
7431
7432 error_found = true;
7433 }
7434
7435 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7436 {
7438
7439 T sum = expression.value();
7440
7442 {
7443 printf("run_test18() - Error in evaluation! (8) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7444 expr_string.c_str(),
7445 static_cast<double>(s[i]),
7446 static_cast<double>(sum));
7447
7448 error_found = true;
7449 }
7450
7451 }
7452
7453 if (error_found)
7454 {
7455 return false;
7456 }
7457 }
7458
7459 {
7463
7464 const std::string const_folded_expression_list[] =
7465 {
7466 "(0 * dot(2 * v0,v1 - 1))",
7467 "(0 * dot(2 * v0,v1 - 1)) + (dot(2 * v0,v1 - 1) * 0)",
7468 "(0 * dot(v0 - v1,v1 / v0))",
7469 "(0 * dot(v0 - v1,v1 / v0)) + (dot(v0 - v1,v1 / v0) * 0)",
7470 "(0 * dot(v0,v1))",
7471 "(0 * dot(v0,v1)) + (dot(v0,v1) * 0)",
7472 "(0 / dot(2 * v0,v1 - 1))",
7473 "(0 / dot(2 * v0,v1 - 1)) + (dot(2 * v0,v1 - 1) * 0)",
7474 "(0 / dot(v0 - v1,v1 / v0))",
7475 "(0 / dot(v0 - v1,v1 / v0)) + (dot(v0 - v1,v1 / v0) * 0)",
7476 "(0 / dot(v0,v1))",
7477 "(0 / dot(v0,v1)) + (dot(v0,v1) * 0)",
7478 "(dot(2 * v0,v1 - 1) * 0)",
7479 "(dot(2 * v0,v1 - 1) * 0) + (0 * dot(2 * v0,v1 - 1))",
7480 "(dot(2 * v0,v1 - 1) * 0) + (0 / dot(2 * v0,v1 - 1))",
7481 "(dot(v0 - v1,v1 / v0) * 0)",
7482 "(dot(v0 - v1,v1 / v0) * 0) + (0 * dot(v0 - v1,v1 / v0))",
7483 "(dot(v0 - v1,v1 / v0) * 0) + (0 / dot(v0 - v1,v1 / v0))",
7484 "(dot(v0,v1) * 0)",
7485 "(dot(v0,v1) * 0) + (0 * dot(v0,v1))",
7486 "(dot(v0,v1) * 0) + (0 / dot(v0,v1))"
7487 };
7488
7489 const std::size_t const_folded_expression_list_size = sizeof(const_folded_expression_list) / sizeof(std::string);
7490
7491 const std::size_t vector_size = 5;
7492 T v0[vector_size] = { 0, 2, 4, 6, 8 };
7493 T v1[vector_size] = { 1, 3, 5, 7, 9 };
7494
7497
7500
7501 symbol_table_t symbol_table;
7502
7503 symbol_table.add_package( vector_package );
7504 symbol_table.add_package( io_package );
7505 symbol_table.add_vector ( "v0" , vv0 );
7506 symbol_table.add_vector ( "v1" , vv1 );
7507
7508 expression_t expression;
7509 expression.register_symbol_table(symbol_table);
7510
7511 parser_t parser;
7512
7513 for (std::size_t i = 0; i < const_folded_expression_list_size; ++i)
7514 {
7515 const std::string& expression_string = const_folded_expression_list[i];
7516
7517 if (!parser.compile(expression_string, expression))
7518 {
7519 printf("run_test18() - [10] Error: %s Expression: %s\n",
7520 parser.error().c_str(),
7521 expression_string.c_str());
7522
7523 return false;
7524 }
7525
7527 {
7528 printf("run_test18() - Error: Expression did not compile to a constant! [1] Expression: %s\n",
7529 expression_string.c_str());
7530
7531 return false;
7532 }
7533
7534 for (std::size_t j = 0; j < 100; ++j)
7535 {
7536 if ((j % 2) == 0)
7537 {
7540 }
7541 else
7542 {
7545 }
7546
7547 const T result = expression.value();
7548
7549 if (result != T(0))
7550 {
7551 printf("run_test18() - Error: Expected result of zero, result: %8.4f for Expression: %s\n",
7552 static_cast<double>(result),
7553 expression_string.c_str());
7554
7555 return false;
7556 }
7557 }
7558
7559 expression.release();
7560 }
7561 }
7562
7563 {
7567
7568 const std::string rebase_expression_list[] =
7569 {
7570 "dot(v0,v1)",
7571 "dot(2 * v0,v1 - 1) + dot(2 * v0,v1 - 1)",
7572 "dot(2 * v0,v1 - 1)",
7573 "dot(v0 - v1,v1 / v0) + dot(v0 - v1,v1 / v0)",
7574 "dot(v0 - v1,v1 / v0)",
7575 "dot(v0,v1) + dot(v0,v1)",
7576 "dot(v0,v1) + x",
7577 "dot(2 * v0,v1 - 1) * x + dot(2 * v0,v1 - 1) * y",
7578 "x / dot(2 * v0,v1 - 1)",
7579 "x / dot(v0 - v1,v1 / v0) + dot(v0 - v1,v1 / v0) / y",
7580 "x * dot(v0 - v1,v1 / v0) / y",
7581 "x - dot(v0,v1) + dot(v0,v1) + y",
7582 };
7583
7584 const std::size_t rebase_expression_list_size = sizeof(rebase_expression_list) / sizeof(std::string);
7585
7586 T x = T(1.234);
7587 T y = T(5.678);
7588
7589 const std::size_t vector_size = 5;
7590 T v0[vector_size] = { 0, 2, 4, 6, 8 };
7591 T v1[vector_size] = { 1, 3, 5, 7, 9 };
7592
7595
7598
7599 symbol_table_t symbol_table;
7600
7601 symbol_table.add_package ( vector_package );
7602 symbol_table.add_package ( io_package );
7603 symbol_table.add_variable( "x" , x );
7604 symbol_table.add_variable( "y" , y );
7605 symbol_table.add_vector ( "v0" , vv0 );
7606 symbol_table.add_vector ( "v1" , vv1 );
7607
7608 expression_t expression;
7609 expression.register_symbol_table(symbol_table);
7610
7611 parser_t parser;
7612
7613 for (std::size_t i = 0; i < rebase_expression_list_size; ++i)
7614 {
7615 const std::string& expression_string = rebase_expression_list[i];
7616
7617 if (!parser.compile(expression_string, expression))
7618 {
7619 printf("run_test18() - [11] Error: %s Expression: %s\n",
7620 parser.error().c_str(),
7621 expression_string.c_str());
7622
7623 return false;
7624 }
7625
7626 for (std::size_t j = 0; j < 100; ++j)
7627 {
7628 if ((j % 2) == 0)
7629 {
7632 }
7633 else
7634 {
7637 }
7638
7639 expression.value();
7640 }
7641
7642 expression.release();
7643 }
7644 }
7645
7646 {
7647 bool error_found = false;
7648
7652
7653 std::vector<T> v0;
7654 std::vector<T> s;
7655
7656 #define pb(v,N) \
7657 v.push_back(T(N)); \
7658
7661
7662 pb(s, 3)
pb(s, 6)
pb(s, 9)
pb(s,12)
7663 pb(s,15)
pb(s,18)
pb(s,21)
7664 #undef pb
7665
7666 const std::string expr_string = "var i := 0; v[i + 0] + v[i + 1] + v[i + 2]";
7667
7669
7670 symbol_table_t symbol_table;
7671 symbol_table.add_vector("v",v);
7672
7673 expression_t expression;
7674 expression.register_symbol_table(symbol_table);
7675
7676 parser_t parser;
7677
7678 if (!parser.compile(expr_string,expression))
7679 {
7680 printf("run_test18() - [12] Error: %s\tExpression: %s\n",
7681 parser.error().c_str(),
7682 expr_string.c_str());
7683
7684 error_found = true;
7685 }
7686
7687 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7688 {
7690
7691 const T sum = expression.value();
7692
7694 {
7695 printf("run_test18() - Error in evaluation! (9) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7696 expr_string.c_str(),
7697 static_cast<double>(s[i]),
7698 static_cast<double>(sum));
7699
7700 error_found = true;
7701 }
7702
7703 }
7704
7705 if (error_found)
7706 {
7707 return false;
7708 }
7709 }
7710
7711 {
7715
7716 T v0[] = { T(0), T(1), T(2), T(3), T(4) };
7717 T v1[] = { T(5), T(6), T(7), T(8), T(9) };
7718
7719 const std::size_t v0_size = sizeof(v0) / sizeof (T);
7720 const std::size_t v1_size = sizeof(v1) / sizeof (T);
7721
7723
7725
7726 symbol_table_t symbol_table;
7727 symbol_table.add_vector("v",v);
7728 symbol_table.add_function("vec_sum",vec_sum);
7729
7730 expression_t expression;
7731 expression.register_symbol_table(symbol_table);
7732
7733 parser_t parser;
7734
7735 const std::string expr_string = "vec_sum(v)";
7736
7737 if (!parser.compile(expr_string,expression))
7738 {
7739 printf("run_test18() - [13] Error: %s\tExpression: %s\n",
7740 parser.error().c_str(),
7741 expr_string.c_str());
7742
7743 return false;
7744 }
7745
7746 const T expected_result0 = std::accumulate(v0, v0 + v0_size, T(0));
7747
7748 if (expression.value() != expected_result0)
7749 {
7750 printf("run_test18() - Error in evaluation! (10.1) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7751 expr_string.c_str(),
7752 static_cast<double>(expected_result0),
7753 static_cast<double>(expression.value()));
7754
7755 return false;
7756 }
7757
7759
7760 const T expected_result1 = std::accumulate(v1, v1 + v1_size, T(0));
7761
7762 if (expression.value() != expected_result1)
7763 {
7764 printf("run_test18() - Error in evaluation! (10.2) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7765 expr_string.c_str(),
7766 static_cast<double>(expected_result1),
7767 static_cast<double>(expression.value()));
7768
7769 return false;
7770 }
7771 }
7772
7773 {
7774 bool error_found = false;
7775
7779
7781
7782 symbol_table_t symbol_table;
7783 symbol_table.add_package(vecops_pkg);
7784
7785 const std::string expr_str_list[] =
7786 {
7787 "var v[9] := {1,2,3,4,5,6,7,8,9}; all_true(v) == true" ,
7788 "var v[6] := {-1,-2,-3,-4,-5,-6}; all_true(v) == true" ,
7789 "var v[8] := {1,2,3,0,0,0,0,0}; all_true(v) == false",
7790 "var v[8] := {-1,-2,-3,0,0,0,0,0}; all_true(v) == false",
7791 "var v[9] := {0,0,0,0,0,0,0,0,0}; all_true(v + 1) == true",
7792
7793 "var v[9] := {0,0,0,0,0,0,0,0,0}; all_false(v) == true" ,
7794 "var v[9] := {0,0,0,0,0,1,2,3,4}; all_false(v) == false" ,
7795 "var v[8] := {0,0,0,0,0,-1,-2,-3}; all_false(v) == false" ,
7796 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
7797
7798 "var v[9] := {0,0,0,0,0,0,0,0,1}; any_true(v) == true" ,
7799 "var v[9] := {0,0,0,0,1,0,0,0,0}; any_true(v) == true" ,
7800 "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v) == false" ,
7801 "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v + 1) == true",
7802
7803 "var v[9] := {1,1,1,1,1,1,1,1,0}; any_false(v) == true" ,
7804 "var v[9] := {1,1,1,1,0,1,1,1,1}; any_false(v) == true" ,
7805 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v) == false" ,
7806 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
7807
7808 "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v) == 0" ,
7809 "var v[9] := {0,0,0,0,0,0,0,0,1}; count(v) == 1" ,
7810 "var v[9] := {0,0,0,0,0,0,0,2,1}; count(v) == 2" ,
7811 "var v[9] := {0,0,0,0,0,0,3,2,1}; count(v) == 3" ,
7812 "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v + 1) == v[]",
7813 "var v[9] := {1,1,1,1,1,1,1,1,1}; count(v - 1) == 0",
7814
7815 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,r); sum(v == r) == v[]",
7816 "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",
7817 "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",
7818 "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",
7819
7820 "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; rol(v,3); sum(v == r) == v[]",
7821 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; ror(v,3); sum(v == r) == v[]",
7822
7823 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; rol(v,2); sum(v == r) == v[]",
7824 "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; ror(v,2); sum(v == r) == v[]",
7825
7826 "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[]",
7827 "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[]",
7828
7829 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,0,0}; shftl(v,2); sum(v == r) == v[]",
7830 "var v[5] := {1,2,3,4,5}; var r[5] := {5,0,0,0,0}; shftl(v,4); sum(v == r) == v[]",
7831 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftl(v,5); sum(v == r) == v[]",
7832
7833 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,1,2,3}; shftr(v,2); sum(v == r) == v[]",
7834 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,1}; shftr(v,4); sum(v == r) == v[]",
7835 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftr(v,5); sum(v == r) == v[]",
7836
7837 "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[]",
7838 "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[]",
7839
7840 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
7841 "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
7842 "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,1,3); sum(v == r) == v[]",
7843 "var v[5] := {5,4,2,3,1}; var r[5] := {5,2,3,4,1}; sort(v,1,3); sum(v == r) == v[]",
7844 "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,0,2); sum(v == r) == v[]",
7845 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,2,4); sum(v == r) == v[]",
7846
7847 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
7848 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'aScEnDiNg'); sum(v == r) == v[]",
7849 "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
7850 "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[]",
7851 "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[]",
7852 "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[]",
7853
7854 "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
7855 "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'DeScEnDiNg'); sum(v == r) == v[]",
7856 "var v[5] := {5,4,3,2,1}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
7857 "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[]",
7858 "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[]",
7859 "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[]",
7860
7861 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); v[v[] / 2] == 5",
7862 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); v[v[] / 3] == 4",
7863
7864 "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)",
7865 "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)",
7866
7867 "var v[5]; iota(v, 0,1); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7868 "var v[5]; iota(v, 0,2); var r[5] := { 0, 2, 4, 6, 8}; sum(v == r) == v[]",
7869 "var v[5]; iota(v, 1,1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7870 "var v[5]; iota(v, 1,2); var r[5] := { 1, 3, 5, 7, 9}; sum(v == r) == v[]",
7871 "var v[5]; iota(v,-1,1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7872 "var v[5]; iota(v,-1,2); var r[5] := {-1, 1, 3, 5, 7}; sum(v == r) == v[]",
7873 "var v[5]; iota(v,-2,1); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7874 "var v[5]; iota(v,-2,2); var r[5] := {-2, 0, 2, 4, 6}; sum(v == r) == v[]",
7875 "var v[5]; iota(v, 0); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7876 "var v[5]; iota(v, 1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7877 "var v[5]; iota(v,-1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7878 "var v[5]; iota(v,-2); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7879 "var v[5]; iota(v, 0, 0); var r[5] := { 0, 0, 0, 0, 0}; sum(v == r) == v[]",
7880 "var v[5]; iota(v, 1, 0); var r[5] := { 1, 1, 1, 1, 1}; sum(v == r) == v[]",
7881
7882 "var v[5]; iota(v, 0, v[] - 1, 0,1); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7883 "var v[5]; iota(v, 0, v[] - 1, 0,2); var r[5] := { 0, 2, 4, 6, 8}; sum(v == r) == v[]",
7884 "var v[5]; iota(v, 0, v[] - 1, 1,1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7885 "var v[5]; iota(v, 0, v[] - 1, 1,2); var r[5] := { 1, 3, 5, 7, 9}; sum(v == r) == v[]",
7886 "var v[5]; iota(v, 0, v[] - 1,-1,1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7887 "var v[5]; iota(v, 0, v[] - 1,-1,2); var r[5] := {-1, 1, 3, 5, 7}; sum(v == r) == v[]",
7888 "var v[5]; iota(v, 0, v[] - 1,-2,1); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7889 "var v[5]; iota(v, 0, v[] - 1,-2,2); var r[5] := {-2, 0, 2, 4, 6}; sum(v == r) == v[]",
7890 "var v[5]; iota(v, 0, v[] - 1, 0 ); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7891 "var v[5]; iota(v, 0, v[] - 1, 1 ); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7892 "var v[5]; iota(v, 0, v[] - 1,-1 ); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7893 "var v[5]; iota(v, 0, v[] - 1,-2 ); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7894 "var v[5]; iota(v, 0, v[] - 1, 0,0); var r[5] := { 0, 0, 0, 0, 0}; sum(v == r) == v[]",
7895 "var v[5]; iota(v, 0, v[] - 1, 1,0); var r[5] := { 1, 1, 1, 1, 1}; sum(v == r) == v[]",
7896
7897 "var v[5]; iota(v, 1, v[] - 1, 0,1); var r[5] := { 0, 0, 1, 2, 3 }; sum(v == r) == v[]",
7898 "var v[5]; iota(v, 1, v[] - 1, 0,2); var r[5] := { 0, 0, 2, 4, 6 }; sum(v == r) == v[]",
7899 "var v[5]; iota(v, 1, v[] - 1, 1,1); var r[5] := { 0, 1, 2, 3, 4 }; sum(v == r) == v[]",
7900 "var v[5]; iota(v, 1, v[] - 1, 1,2); var r[5] := { 0, 1, 3, 5, 7 }; sum(v == r) == v[]",
7901 "var v[5]; iota(v, 1, v[] - 1,-1,1); var r[5] := { 0, -1, 0, 1, 2 }; sum(v == r) == v[]",
7902 "var v[5]; iota(v, 1, v[] - 1,-1,2); var r[5] := { 0, -1, 1, 3, 5 }; sum(v == r) == v[]",
7903 "var v[5]; iota(v, 1, v[] - 1,-2,1); var r[5] := { 0, -2,-1, 0, 1 }; sum(v == r) == v[]",
7904 "var v[5]; iota(v, 1, v[] - 1,-2,2); var r[5] := { 0, -2, 0, 2, 4 }; sum(v == r) == v[]",
7905 "var v[5]; iota(v, 1, v[] - 1, 0 ); var r[5] := { 0, 0, 1, 2, 3 }; sum(v == r) == v[]",
7906 "var v[5]; iota(v, 1, v[] - 1, 1 ); var r[5] := { 0, 1, 2, 3, 4 }; sum(v == r) == v[]",
7907 "var v[5]; iota(v, 1, v[] - 1,-1 ); var r[5] := { 0, -1, 0, 1, 2 }; sum(v == r) == v[]",
7908 "var v[5]; iota(v, 1, v[] - 1,-2 ); var r[5] := { 0, -2,-1, 0, 1 }; sum(v == r) == v[]",
7909
7910 "var v[5]; iota(v, 1, v[] - 2, 0,1); var r[5] := { 0, 0, 1, 2, 0 }; sum(v == r) == v[]",
7911 "var v[5]; iota(v, 1, v[] - 2, 0,2); var r[5] := { 0, 0, 2, 4, 0 }; sum(v == r) == v[]",
7912 "var v[5]; iota(v, 1, v[] - 2, 1,1); var r[5] := { 0, 1, 2, 3, 0 }; sum(v == r) == v[]",
7913 "var v[5]; iota(v, 1, v[] - 2, 1,2); var r[5] := { 0, 1, 3, 5, 0 }; sum(v == r) == v[]",
7914 "var v[5]; iota(v, 1, v[] - 2,-1,1); var r[5] := { 0, -1, 0, 1, 0 }; sum(v == r) == v[]",
7915 "var v[5]; iota(v, 1, v[] - 2,-1,2); var r[5] := { 0, -1, 1, 3, 0 }; sum(v == r) == v[]",
7916 "var v[5]; iota(v, 1, v[] - 2,-2,1); var r[5] := { 0, -2,-1, 0, 0 }; sum(v == r) == v[]",
7917 "var v[5]; iota(v, 1, v[] - 2,-2,2); var r[5] := { 0, -2, 0, 2, 0 }; sum(v == r) == v[]",
7918 "var v[5]; iota(v, 1, v[] - 2, 0 ); var r[5] := { 0, 0, 1, 2, 0 }; sum(v == r) == v[]",
7919 "var v[5]; iota(v, 1, v[] - 2, 1 ); var r[5] := { 0, 1, 2, 3, 0 }; sum(v == r) == v[]",
7920 "var v[5]; iota(v, 1, v[] - 2,-1 ); var r[5] := { 0, -1, 0, 1, 0 }; sum(v == r) == v[]",
7921 "var v[5]; iota(v, 1, v[] - 2,-2 ); var r[5] := { 0, -2,-1, 0, 0 }; sum(v == r) == v[]",
7922
7923 "var v[5]; iota(v, 0, v[] - 2, 0,1); var r[5] := { 0, 1, 2, 3, 0}; sum(v == r) == v[]",
7924 "var v[5]; iota(v, 0, v[] - 2, 0,2); var r[5] := { 0, 2, 4, 6, 0}; sum(v == r) == v[]",
7925 "var v[5]; iota(v, 0, v[] - 2, 1,1); var r[5] := { 1, 2, 3, 4, 0}; sum(v == r) == v[]",
7926 "var v[5]; iota(v, 0, v[] - 2, 1,2); var r[5] := { 1, 3, 5, 7, 0}; sum(v == r) == v[]",
7927 "var v[5]; iota(v, 0, v[] - 2,-1,1); var r[5] := {-1, 0, 1, 2, 0}; sum(v == r) == v[]",
7928 "var v[5]; iota(v, 0, v[] - 2,-1,2); var r[5] := {-1, 1, 3, 5, 0}; sum(v == r) == v[]",
7929 "var v[5]; iota(v, 0, v[] - 2,-2,1); var r[5] := {-2,-1, 0, 1, 0}; sum(v == r) == v[]",
7930 "var v[5]; iota(v, 0, v[] - 2,-2,2); var r[5] := {-2, 0, 2, 4, 0}; sum(v == r) == v[]",
7931 "var v[5]; iota(v, 0, v[] - 2, 0 ); var r[5] := { 0, 1, 2, 3, 0}; sum(v == r) == v[]",
7932 "var v[5]; iota(v, 0, v[] - 2, 1 ); var r[5] := { 1, 2, 3, 4, 0}; sum(v == r) == v[]",
7933 "var v[5]; iota(v, 0, v[] - 2,-1 ); var r[5] := {-1, 0, 1, 2, 0}; sum(v == r) == v[]",
7934 "var v[5]; iota(v, 0, v[] - 2,-2 ); var r[5] := {-2,-1, 0, 1, 0}; sum(v == r) == v[]",
7935
7936 "var v[5]; iota(v, 0, -1); var r[5] := { 0, -1, -2, -3, -4}; sum(v == r) == v[]",
7937 "var v[5]; iota(v, 0, -2); var r[5] := { 0, -2, -4, -6, -8}; sum(v == r) == v[]",
7938 "var v[5]; iota(v, -1, -2); var r[5] := { -1, -3, -5, -7, -9}; sum(v == r) == v[]",
7939
7940 "var v[5]; iota(v, 0, v[] -1, 0, -1); var r[5] := { 0, -1, -2, -3, -4}; sum(v == r) == v[]",
7941 "var v[5]; iota(v, 0, v[] -1, 0, -2); var r[5] := { 0, -2, -4, -6, -8}; sum(v == r) == v[]",
7942 "var v[5]; iota(v, 0, v[] -1, -1, -2); var r[5] := { -1, -3, -5, -7, -9}; sum(v == r) == v[]",
7943
7944 "var v[5]; iota(v, 0,1); threshold_below(v,2, 0); var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7945 "var v[5]; iota(v, 0,1); threshold_above(v,2, 0); var r[5] := { 0, 1, 2, 0, 0}; sum(v == r) == v[]",
7946
7947 "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[]",
7948 "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[]",
7949
7950 "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[]",
7951 "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[]",
7952
7953 "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[]",
7954 "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[]",
7955
7956 " 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[]",
7957 " 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[]",
7958
7959 " 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[]",
7960 " 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[]",
7961 " 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[]",
7962 };
7963
7964 const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
7965
7966 parser_t parser;
7967
7968 for (std::size_t i = 0; i < expr_str_list_size; ++i)
7969 {
7970 expression_t expression;
7971 expression.register_symbol_table(symbol_table);
7972
7973 if (!parser.compile(expr_str_list[i], expression))
7974 {
7975 printf("run_test18() - [14] Error: %s Expression: %s\n",
7976 parser.error().c_str(),
7977 expr_str_list[i].c_str());
7978
7979 error_found = true;
7980
7981 continue;
7982 }
7983
7984 const T result = expression.value();
7985
7986 if (result != T(1))
7987 {
7988 printf("run_test18() - Error in evaluation! (11) Expression: %s\n",
7989 expr_str_list[i].c_str());
7990
7991 error_found = true;
7992 }
7993 }
7994
7995 if (error_found)
7996 {
7997 return false;
7998 }
7999 }
8000
8001 {
8003
8004 std::string a = "a";
8005 std::string b = "b";
8006 std::string c = "c";
8007 std::string d = "d";
8008
8009 T x = T(1.1);
8010 T y = T(2.2);
8011 T z = T(3.3);
8012 T w = T(4.4);
8013
8015 (
8016 "T:T|T:TT|T:TTT|T:TTTT|"
8017 "T:S|T:SS|T:SSS|T:SSSS|"
8018 "T:ST|T:STS|T:STST|"
8019 "T:TS|T:TST|T:TSTS|"
8020 "T:TTSS|T:SSTT|T:STTS|T:TSST"
8021 );
8022
8024
8030
8035
8037
8039 typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
8040
8041 static const test_pack_t test_pack_list[] =
8042 {
8043 test_pack_t("foo(x)" , test_result_t( 0, "T" )),
8044 test_pack_t("foo(x, y)" , test_result_t( 1, "TT" )),
8045 test_pack_t("foo(x, y, z)" , test_result_t( 2, "TTT" )),
8046 test_pack_t("foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
8047 test_pack_t("foo(x + y)" , test_result_t( 0, "T" )),
8048 test_pack_t("foo(x + y, y + z)" , test_result_t( 1, "TT" )),
8049 test_pack_t("foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
8050 test_pack_t("foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
8051 test_pack_t("foo(a)" , test_result_t( 4, "S" )),
8052 test_pack_t("foo(a, b)" , test_result_t( 5, "SS" )),
8053 test_pack_t("foo(a, b, c)" , test_result_t( 6, "SSS" )),
8054 test_pack_t("foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
8055 test_pack_t("foo(a + b)" , test_result_t( 4, "S" )),
8056 test_pack_t("foo(a + b, b + c)" , test_result_t( 5, "SS" )),
8057 test_pack_t("foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
8058 test_pack_t("foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
8059 test_pack_t("foo(a, x)" , test_result_t( 8, "ST" )),
8060 test_pack_t("foo(a, x, b)" , test_result_t( 9, "STS" )),
8061 test_pack_t("foo(a, x, b, y)" , test_result_t(10, "STST")),
8062 test_pack_t("foo(a + b, x + y)" , test_result_t( 8, "ST" )),
8063 test_pack_t("foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
8064 test_pack_t("foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
8065 test_pack_t("foo(x, a)" , test_result_t(11, "TS" )),
8066 test_pack_t("foo(x, a, y)" , test_result_t(12, "TST" )),
8067 test_pack_t("foo(x, a, y, b)" , test_result_t(13, "TSTS")),
8068 test_pack_t("foo(x + y, a + b)" , test_result_t(11, "TS" )),
8069 test_pack_t("foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
8070 test_pack_t("foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
8071 test_pack_t("foo(x, y, a, b)" , test_result_t(14, "TTSS")),
8072 test_pack_t("foo(a, b, x, y)" , test_result_t(15, "SSTT")),
8073 test_pack_t("foo(a, x, y, b)" , test_result_t(16, "STTS")),
8074 test_pack_t("foo(x, a, b, y)" , test_result_t(17, "TSST")),
8075 test_pack_t("foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
8076 test_pack_t("foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
8077 test_pack_t("foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
8078 test_pack_t("foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
8079 };
8080
8081 static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
8082
8084
8085 for (std::size_t i = 0; i < test_pack_list_size; ++i)
8086 {
8087 expression_t expression;
8088 expression.register_symbol_table(symbol_table);
8089
8091
8092 if (!parser.
compile(test_pack_list[i].first, expression))
8093 {
8094 printf("run_test18() - [15] Overload VarArg Error: %s Expression: %s\n",
8095 parser.
error().c_str(),
8096 test_pack_list[i].first.c_str());
8097
8098 return false;
8099 }
8100 else
8102 }
8103
8104 bool error_found = false;
8105
8107 {
8108 ovrld_func.clear();
8109
8111 {
8112 printf("run_test18() - Error in evaluation! (12) Expression: %s\n",
8113 test_pack_list[i].first.c_str());
8114
8115 error_found = true;
8116 }
8117
8118 if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
8119 {
8120 printf("run_test18() - Error with ps_index (12) Expression: %s Expected: %d Got: %d\n",
8121 test_pack_list[i].first.c_str(),
8122 static_cast<int>(test_pack_list[i].second.ps_index),
8123 static_cast<int>(ovrld_func.current_ps_index));
8124
8125 error_found = true;
8126 }
8127
8128 if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
8129 {
8130 printf("run_test18() - Error with parameter seq (12) Expression: %s Expected: %s Got: %s\n",
8131 test_pack_list[i].first.c_str(),
8132 test_pack_list[i].second.param_seq.c_str(),
8133 ovrld_func.current_param_seq.c_str());
8134
8135 error_found = true;
8136 }
8137 ::fflush(stdout);
8138 }
8139
8140 if (error_found)
8141 {
8142 return false;
8143 }
8144 }
8145
8146 {
8148
8149 std::string a = "a";
8150 std::string b = "b";
8151 std::string c = "c";
8152 std::string d = "d";
8153 std::string result = "";
8154
8155 T x = T(1.1);
8156 T y = T(2.2);
8157 T z = T(3.3);
8158 T w = T(4.4);
8159
8161 (
8162 "S:T|S:TT|S:TTT|S:TTTT|"
8163 "S:S|S:SS|S:SSS|S:SSSS|"
8164 "S:ST|S:STS|S:STST|"
8165 "S:TS|S:TST|S:TSTS|"
8166 "S:TTSS|S:SSTT|S:STTS|S:TSST"
8167 );
8168
8170
8176
8182
8184
8186 typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
8187
8188 static const test_pack_t test_pack_list[] =
8189 {
8190 test_pack_t("result := foo(x)" , test_result_t( 0, "T" )),
8191 test_pack_t("result := foo(x, y)" , test_result_t( 1, "TT" )),
8192 test_pack_t("result := foo(x, y, z)" , test_result_t( 2, "TTT" )),
8193 test_pack_t("result := foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
8194 test_pack_t("result := foo(x + y)" , test_result_t( 0, "T" )),
8195 test_pack_t("result := foo(x + y, y + z)" , test_result_t( 1, "TT" )),
8196 test_pack_t("result := foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
8197 test_pack_t("result := foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
8198 test_pack_t("result := foo(a)" , test_result_t( 4, "S" )),
8199 test_pack_t("result := foo(a, b)" , test_result_t( 5, "SS" )),
8200 test_pack_t("result := foo(a, b, c)" , test_result_t( 6, "SSS" )),
8201 test_pack_t("result := foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
8202 test_pack_t("result := foo(a + b)" , test_result_t( 4, "S" )),
8203 test_pack_t("result := foo(a + b, b + c)" , test_result_t( 5, "SS" )),
8204 test_pack_t("result := foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
8205 test_pack_t("result := foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
8206 test_pack_t("result := foo(a, x)" , test_result_t( 8, "ST" )),
8207 test_pack_t("result := foo(a, x, b)" , test_result_t( 9, "STS" )),
8208 test_pack_t("result := foo(a, x, b, y)" , test_result_t(10, "STST")),
8209 test_pack_t("result := foo(a + b, x + y)" , test_result_t( 8, "ST" )),
8210 test_pack_t("result := foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
8211 test_pack_t("result := foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
8212 test_pack_t("result := foo(x, a)" , test_result_t(11, "TS" )),
8213 test_pack_t("result := foo(x, a, y)" , test_result_t(12, "TST" )),
8214 test_pack_t("result := foo(x, a, y, b)" , test_result_t(13, "TSTS")),
8215 test_pack_t("result := foo(x + y, a + b)" , test_result_t(11, "TS" )),
8216 test_pack_t("result := foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
8217 test_pack_t("result := foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
8218 test_pack_t("result := foo(x, y, a, b)" , test_result_t(14, "TTSS")),
8219 test_pack_t("result := foo(a, b, x, y)" , test_result_t(15, "SSTT")),
8220 test_pack_t("result := foo(a, x, y, b)" , test_result_t(16, "STTS")),
8221 test_pack_t("result := foo(x, a, b, y)" , test_result_t(17, "TSST")),
8222 test_pack_t("result := foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
8223 test_pack_t("result := foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
8224 test_pack_t("result := foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
8225 test_pack_t("result := foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
8226 };
8227
8228 static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
8229
8231
8232 for (std::size_t i = 0; i < test_pack_list_size; ++i)
8233 {
8234 expression_t expression;
8235 expression.register_symbol_table(symbol_table);
8236
8238
8239 if (!parser.
compile(test_pack_list[i].first, expression))
8240 {
8241 printf("run_test18() - [16] Overload VarArg Error: %s Expression: %s\n",
8242 parser.
error().c_str(),
8243 test_pack_list[i].first.c_str());
8244
8245 return false;
8246 }
8247 else
8249 }
8250
8251 bool error_found = false;
8252
8254 {
8255 ovrld_func.clear();
8256 result = "";
8258
8259 if (result != "string result")
8260 {
8261 printf("run_test18() - Error in evaluation! (13) Expression: %s\n",
8262 test_pack_list[i].first.c_str());
8263
8264 error_found = true;
8265 }
8266
8267 if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
8268 {
8269 printf("run_test18() - Error with ps_index (13) Expression: %s Expected: %d Got: %d\n",
8270 test_pack_list[i].first.c_str(),
8271 static_cast<int>(test_pack_list[i].second.ps_index),
8272 static_cast<int>(ovrld_func.current_ps_index));
8273
8274 error_found = true;
8275 }
8276
8277 if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
8278 {
8279 printf("run_test18() - Error with parameter seq (13) Expression: %s Expected: %s Got: %s\n",
8280 test_pack_list[i].first.c_str(),
8281 test_pack_list[i].second.param_seq.c_str(),
8282 ovrld_func.current_param_seq.c_str());
8283
8284 error_found = true;
8285 }
8286 }
8287
8288 if (error_found)
8289 {
8290 return false;
8291 }
8292 }
8293
8294 {
8298
8299 typedef std::pair<std::string,std::size_t> rtc_test_t;
8300 static const rtc_test_t rtc_tests[] =
8301 {
8302 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]]; } ", 5 ),
8303 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + 10]; } ", 5 ),
8304 std::make_pair(" x:= 0; for (var i := 0; i < (2 * v[]); i += 1) { x += (v[i] == vv[i]); } ", 10),
8305 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]] := i; } ", 5 ),
8306 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]] <=> v[i]; } ", 5 ),
8307 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i] <=> v[i + v[]]; } ", 10),
8308 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]]; } ", 5 ),
8309 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + 10]; } ", 5 ),
8310 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]] := i; } ", 5 ),
8311 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]] <=> z[i]; } ", 5 ),
8312 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*w)[i + v[]]; } ", 10),
8313 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*w)[i+w[]]; } ", 10),
8314 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+w)[i + v[]]; } ", 10),
8315 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+w)[i+w[]]; } ", 10),
8316 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*z)[i+v[]]; } ", 10),
8317 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*z)[i+w[]]; } ", 9 ),
8318 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+z)[i+v[]]; } ", 10),
8319 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+z)[i+z[]]; } ", 10),
8320 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 ),
8321 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 ),
8322 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 ),
8323 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 ),
8324 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 ),
8325 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 ),
8326 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 ),
8327 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 ),
8328 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 ),
8329 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 ),
8330 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 ),
8331 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 ),
8332 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 ),
8333 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 ),
8334 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 ),
8335 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 ),
8336 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 ),
8337 };
8338
8339 static const std::size_t rtc_tests_size = sizeof(rtc_tests) / sizeof(rtc_test_t);
8340
8341 bool error_found = false;
8342
8343 for (std::size_t i = 0; i < rtc_tests_size; ++i)
8344 {
8345 const std::string& expression_str = rtc_tests[i].first;
8346
8347 {
8348 T x = 6;
8349 T v[5] = { 0, 1, 2, 3, 4 };
8350 T w[3] = { 0, 1, 2 };
8353
8354 symbol_table_t symbol_table;
8355 expression_t expression;
8356 parser_t parser;
8357
8358 symbol_table.add_variable("x" , x );
8359 symbol_table.add_vector ("v" , v );
8360 symbol_table.add_vector ("w" , w );
8361 symbol_table.add_vector ("vv", vv);
8362 symbol_table.add_vector ("ww", ww);
8363
8365
8366 expression.register_symbol_table(symbol_table);
8367
8368 parser.register_vector_access_runtime_check(vartc);
8369
8370 if (!parser.compile(expression_str, expression))
8371 {
8372 printf("run_test18() - Error: %s\t [1] Expression: %s\n",
8373 parser.error().c_str(),
8374 expression_str.c_str());
8375
8376 error_found = true;
8377 return false;
8378 }
8379
8381 expression.value();
8382
8383 if (vartc.
rtc_count != rtc_tests[i].second)
8384 {
8385 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [0] Expression: %s\n",
8386 static_cast<unsigned int>(rtc_tests[i].second),
8387 static_cast<unsigned int>(vartc.
rtc_count),
8388 expression_str.c_str());
8389 error_found = true;
8390 }
8391 }
8392
8393 {
8394 T x = 6;
8395 T v[5] = { 0, 1, 2, 3, 4 };
8396 T w[3] = { 0, 1, 2 };
8397 T v0[5] = { 0, 1, 2, 3, 4 };
8398 T v1[5] = { 0, 1, 2, 3, 4 };
8401
8402 symbol_table_t symbol_table;
8403 expression_t expression;
8404 parser_t parser;
8405
8406 symbol_table.add_variable("x" , x );
8407 symbol_table.add_vector ("v" , v );
8408 symbol_table.add_vector ("w" , w );
8409 symbol_table.add_vector ("vv", vv);
8410 symbol_table.add_vector ("ww", ww);
8411
8413
8414 expression.register_symbol_table(symbol_table);
8415
8416 parser.register_vector_access_runtime_check(vartc);
8417
8418 if (!parser.compile(expression_str, expression))
8419 {
8420 printf("run_test18() - Error: %s\t [2] Expression: %s\n",
8421 parser.error().c_str(),
8422 expression_str.c_str());
8423
8424 error_found = true;
8425 return false;
8426 }
8427
8430 expression.value();
8431
8432 if (vartc.
rtc_count != rtc_tests[i].second)
8433 {
8434 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [1] Expression: %s\n",
8435 static_cast<unsigned int>(rtc_tests[i].second),
8436 static_cast<unsigned int>(vartc.
rtc_count),
8437 expression_str.c_str());
8438 error_found = true;
8439 }
8440
8443 expression.value();
8444
8445 if (vartc.
rtc_count != rtc_tests[i].second)
8446 {
8447 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [2] Expression: %s\n",
8448 static_cast<unsigned int>(rtc_tests[i].second),
8449 static_cast<unsigned int>(vartc.
rtc_count),
8450 expression_str.c_str());
8451 error_found = true;
8452 }
8453 }
8454 }
8455
8456 if (error_found)
8457 {
8458 return false;
8459 }
8460 }
8461
8462 return true;
8463}
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)