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