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