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