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