OpcUaCanOpen
CANopen OPC-UA server
exprtk_test.cpp
Go to the documentation of this file.
1 /*
2  **************************************************************
3  * C++ Mathematical Expression Toolkit Library *
4  * *
5  * Examples and Unit-Tests *
6  * Author: Arash Partow (1999-2019) *
7  * URL: http://www.partow.net/programming/exprtk/index.html *
8  * *
9  * Copyright notice: *
10  * Free use of the Mathematical Expression Toolkit Library is *
11  * permitted under the guidelines and in accordance with the *
12  * most current version of the MIT License. *
13  * http://www.opensource.org/licenses/MIT *
14  * *
15  **************************************************************
16 */
17 
18 
19 #include <cmath>
20 #include <cstddef>
21 #include <cstdio>
22 #include <cstdlib>
23 #include <deque>
24 #include <fstream>
25 #include <iostream>
26 #include <numeric>
27 #include <string>
28 #include <vector>
29 
30 #include "exprtk.hpp"
31 
32 
33 #ifdef exprtk_test_float32_type
34 typedef float numeric_type;
35 #else
36 typedef double numeric_type;
37 #endif
38 
39 typedef std::pair<std::string,numeric_type> test_t;
40 
41 static const test_t global_test_list[] =
42  {
43  // Note: Each of following tests must compile down
44  // to a single literal node.
45  test_t("0",0.0),
46  test_t("1",1.0),
47  test_t("2",2.0),
48  test_t("3",3.0),
49  test_t("4",4.0),
50  test_t("5",5.0),
51  test_t("6",6.0),
52  test_t("7",7.0),
53  test_t("8",8.0),
54  test_t("9",9.0),
55  test_t("12.12",12.12),
56  test_t("123.123",123.123),
57  test_t("1234.1234",1234.1234),
58  test_t("12345.12345",12345.12345),
59  test_t("123456.123456",123456.123456),
60  test_t("0.0",0.0),
61  test_t("1.0",1.0),
62  test_t("2.0",2.0),
63  test_t("3.0",3.0),
64  test_t("4.0",4.0),
65  test_t("5.0",5.0),
66  test_t("6.0",6.0),
67  test_t("7.0",7.0),
68  test_t("8.0",8.0),
69  test_t("9.0",9.0),
70  test_t("0.0",0.0),
71  test_t("1.1",1.1),
72  test_t("2.2",2.2),
73  test_t("3.3",3.3),
74  test_t("4.4",4.4),
75  test_t("5.5",5.5),
76  test_t("6.6",6.6),
77  test_t("7.7",7.7),
78  test_t("8.8",8.8),
79  test_t("9.9",9.9),
80  test_t("+0",0.0),
81  test_t("+1",1.0),
82  test_t("+2",2.0),
83  test_t("+3",3.0),
84  test_t("+4",4.0),
85  test_t("+5",5.0),
86  test_t("+6",6.0),
87  test_t("+7",7.0),
88  test_t("+8",8.0),
89  test_t("+9",9.0),
90  test_t("+0.0",0.0),
91  test_t("+1.0",1.0),
92  test_t("+2.0",2.0),
93  test_t("+3.0",3.0),
94  test_t("+4.0",4.0),
95  test_t("+5.0",5.0),
96  test_t("+6.0",6.0),
97  test_t("+7.0",7.0),
98  test_t("+8.0",8.0),
99  test_t("+9.0",9.0),
100  test_t("+0.0",0.0),
101  test_t("+1.1",1.1),
102  test_t("+2.2",2.2),
103  test_t("+3.3",3.3),
104  test_t("+4.4",4.4),
105  test_t("+5.5",5.5),
106  test_t("+6.6",6.6),
107  test_t("+7.7",7.7),
108  test_t("+8.8",8.8),
109  test_t("+9.9",9.9),
110  test_t("-0",-0.0),
111  test_t("-1",-1.0),
112  test_t("-2",-2.0),
113  test_t("-3",-3.0),
114  test_t("-4",-4.0),
115  test_t("-5",-5.0),
116  test_t("-6",-6.0),
117  test_t("-7",-7.0),
118  test_t("-8",-8.0),
119  test_t("-9",-9.0),
120  test_t("-0.0",-0.0),
121  test_t("-1.0",-1.0),
122  test_t("-2.0",-2.0),
123  test_t("-3.0",-3.0),
124  test_t("-4.0",-4.0),
125  test_t("-5.0",-5.0),
126  test_t("-6.0",-6.0),
127  test_t("-7.0",-7.0),
128  test_t("-8.0",-8.0),
129  test_t("-9.0",-9.0),
130  test_t("-0.0",-0.0),
131  test_t("-1.1",-1.1),
132  test_t("-2.2",-2.2),
133  test_t("-3.3",-3.3),
134  test_t("-4.4",-4.4),
135  test_t("-5.5",-5.5),
136  test_t("-6.6",-6.6),
137  test_t("-7.7",-7.7),
138  test_t("-8.8",-8.8),
139  test_t("-9.9",-9.9),
140  test_t("0.0e+0" ,+0.0e+0),
141  test_t("1.1e+1" ,+1.1e+1),
142  test_t("2.2e+2" ,+2.2e+2),
143  test_t("3.3e+3" ,+3.3e+3),
144  test_t("4.4e+4" ,+4.4e+4),
145  test_t("5.5e+5" ,+5.5e+5),
146  test_t("6.6e+6" ,+6.6e+6),
147  test_t("7.7e+7" ,+7.7e+7),
148  test_t("8.8e+8" ,+8.8e+8),
149  test_t("9.9e+9" ,+9.9e+9),
150  test_t("-0.0e+0",-0.0e+0),
151  test_t("-1.1e+1",-1.1e+1),
152  test_t("-2.2e+2",-2.2e+2),
153  test_t("-3.3e+3",-3.3e+3),
154  test_t("-4.4e+4",-4.4e+4),
155  test_t("-5.5e+5",-5.5e+5),
156  test_t("-6.6e+6",-6.6e+6),
157  test_t("-7.7e+7",-7.7e+7),
158  test_t("-8.8e+8",-8.8e+8),
159  test_t("-9.9e+9",-9.9e+9),
160  test_t("0.0E+0" ,+0.0E+0),
161  test_t("1.1E+1" ,+1.1E+1),
162  test_t("2.2E+2" ,+2.2E+2),
163  test_t("3.3E+3" ,+3.3E+3),
164  test_t("4.4E+4" ,+4.4E+4),
165  test_t("5.5E+5" ,+5.5E+5),
166  test_t("6.6E+6" ,+6.6E+6),
167  test_t("7.7E+7" ,+7.7E+7),
168  test_t("8.8E+8" ,+8.8E+8),
169  test_t("9.9E+9" ,+9.9E+9),
170  test_t("-0.0E+0",-0.0E+0),
171  test_t("-1.1E+1",-1.1E+1),
172  test_t("-2.2E+2",-2.2E+2),
173  test_t("-3.3E+3",-3.3E+3),
174  test_t("-4.4E+4",-4.4E+4),
175  test_t("-5.5E+5",-5.5E+5),
176  test_t("-6.6E+6",-6.6E+6),
177  test_t("-7.7E+7",-7.7E+7),
178  test_t("-8.8E+8",-8.8E+8),
179  test_t("-9.9E+9",-9.9E+9),
180  test_t("(0)",0.0),
181  test_t("(1)",1.0),
182  test_t("(2)",2.0),
183  test_t("(3)",3.0),
184  test_t("(4)",4.0),
185  test_t("(5)",5.0),
186  test_t("(6)",6.0),
187  test_t("(7)",7.0),
188  test_t("(8)",8.0),
189  test_t("(9)",9.0),
190  test_t("(0.0)",0.0),
191  test_t("(1.0)",1.0),
192  test_t("(2.0)",2.0),
193  test_t("(3.0)",3.0),
194  test_t("(4.0)",4.0),
195  test_t("(5.0)",5.0),
196  test_t("(6.0)",6.0),
197  test_t("(7.0)",7.0),
198  test_t("(8.0)",8.0),
199  test_t("(9.0)",9.0),
200  test_t("(0.0)",0.0),
201  test_t("(1.1)",1.1),
202  test_t("(2.2)",2.2),
203  test_t("(3.3)",3.3),
204  test_t("(4.4)",4.4),
205  test_t("(5.5)",5.5),
206  test_t("(6.6)",6.6),
207  test_t("(7.7)",7.7),
208  test_t("(8.8)",8.8),
209  test_t("(9.9)",9.9),
210  test_t("(+0)" ,0.0),
211  test_t("(+1)" ,1.0),
212  test_t("(+2)" ,2.0),
213  test_t("(+3)" ,3.0),
214  test_t("(+4)" ,4.0),
215  test_t("(+5)" ,5.0),
216  test_t("(+6)" ,6.0),
217  test_t("(+7)" ,7.0),
218  test_t("(+8)" ,8.0),
219  test_t("(+9)" ,9.0),
220  test_t("(+0.0)",0.0),
221  test_t("(+1.0)",1.0),
222  test_t("(+2.0)",2.0),
223  test_t("(+3.0)",3.0),
224  test_t("(+4.0)",4.0),
225  test_t("(+5.0)",5.0),
226  test_t("(+6.0)",6.0),
227  test_t("(+7.0)",7.0),
228  test_t("(+8.0)",8.0),
229  test_t("(+9.0)",9.0),
230  test_t("(+0.0)",0.0),
231  test_t("(+1.1)",1.1),
232  test_t("(+2.2)",2.2),
233  test_t("(+3.3)",3.3),
234  test_t("(+4.4)",4.4),
235  test_t("(+5.5)",5.5),
236  test_t("(+6.6)",6.6),
237  test_t("(+7.7)",7.7),
238  test_t("(+8.8)",8.8),
239  test_t("(+9.9)",9.9),
240  test_t("(-0)" ,-0.0),
241  test_t("(-1)" ,-1.0),
242  test_t("(-2)" ,-2.0),
243  test_t("(-3)" ,-3.0),
244  test_t("(-4)" ,-4.0),
245  test_t("(-5)" ,-5.0),
246  test_t("(-6)" ,-6.0),
247  test_t("(-7)" ,-7.0),
248  test_t("(-8)" ,-8.0),
249  test_t("(-9)" ,-9.0),
250  test_t("(-0.0)",-0.0),
251  test_t("(-1.0)",-1.0),
252  test_t("(-2.0)",-2.0),
253  test_t("(-3.0)",-3.0),
254  test_t("(-4.0)",-4.0),
255  test_t("(-5.0)",-5.0),
256  test_t("(-6.0)",-6.0),
257  test_t("(-7.0)",-7.0),
258  test_t("(-8.0)",-8.0),
259  test_t("(-9.0)",-9.0),
260  test_t("(-0.0)",-0.0),
261  test_t("(-1.1)",-1.1),
262  test_t("(-2.2)",-2.2),
263  test_t("(-3.3)",-3.3),
264  test_t("(-4.4)",-4.4),
265  test_t("(-5.5)",-5.5),
266  test_t("(-6.6)",-6.6),
267  test_t("(-7.7)",-7.7),
268  test_t("(-8.8)",-8.8),
269  test_t("(-9.9)",-9.9),
270  test_t("-(1.1)",-1.1),
271  test_t("-(1.1+2.2)",-3.3),
272  test_t("1234567890",1234567890),
273  test_t("123456789.0",123456789.0),
274  test_t("+1234567890",1234567890),
275  test_t("+123456789.0",123456789.0),
276  test_t("-1234567890",-1234567890),
277  test_t("-123456789.0",-123456789.0),
278  test_t("1234.567890",1234.567890),
279  test_t("-1234.567890",-1234.567890),
280  test_t("0+9",9.0),
281  test_t("1+8",9.0),
282  test_t("2+7",9.0),
283  test_t("3+6",9.0),
284  test_t("4+5",9.0),
285  test_t("5+4",9.0),
286  test_t("6+3",9.0),
287  test_t("7+2",9.0),
288  test_t("8+1",9.0),
289  test_t("9+0",9.0),
290  test_t(" 0 + 9 ",9.0),
291  test_t(" 1 + 8 ",9.0),
292  test_t(" 2 + 7 ",9.0),
293  test_t(" 3 + 6 ",9.0),
294  test_t(" 4 + 5 ",9.0),
295  test_t(" 5 + 4 ",9.0),
296  test_t(" 6 + 3 ",9.0),
297  test_t(" 7 + 2 ",9.0),
298  test_t(" 8 + 1 ",9.0),
299  test_t(" 9 + 0 ",9.0),
300  test_t("( 0 + 9 )",9.0),
301  test_t("( 1 + 8 )",9.0),
302  test_t("( 2 + 7 )",9.0),
303  test_t("( 3 + 6 )",9.0),
304  test_t("( 4 + 5 )",9.0),
305  test_t("( 5 + 4 )",9.0),
306  test_t("( 6 + 3 )",9.0),
307  test_t("( 7 + 2 )",9.0),
308  test_t("( 8 + 1 )",9.0),
309  test_t("( 9 + 0 )",9.0),
310  test_t("1E1+1",11.0),
311  test_t("1e1+1",11.0),
312  test_t("1E1-1", 9.0),
313  test_t("1e1-1", 9.0),
314  test_t("1E01+1",11.0),
315  test_t("1e01+1",11.0),
316  test_t("1E01-1", 9.0),
317  test_t("1e01-1", 9.0),
318  test_t("1+2",+3.0),
319  test_t("1-2",-1.0),
320  test_t("1*2",+2.0),
321  test_t("1/2",+0.5),
322  test_t("1.1+2.2", +3.3),
323  test_t("1.1-2.2", -1.1),
324  test_t("1.1*2.2",+2.42),
325  test_t("1.1/2.2", +0.5),
326  test_t("0-9",-9.0),
327  test_t("1-8",-7.0),
328  test_t("2-7",-5.0),
329  test_t("3-6",-3.0),
330  test_t("4-5",-1.0),
331  test_t("5-4",+1.0),
332  test_t("6-3",+3.0),
333  test_t("7-2",+5.0),
334  test_t("8-1",+7.0),
335  test_t("9-0",+9.0),
336  test_t("2.*3",+6.0),
337  test_t("2.*3.",+6.0),
338  test_t("2.+3",+5.0),
339  test_t("2.+3.",+5.0),
340  test_t("123.*456.",+56088.0),
341  test_t(" 0 - 9 ",-9.0),
342  test_t(" 1 - 8 ",-7.0),
343  test_t(" 2 - 7 ",-5.0),
344  test_t(" 3 - 6 ",-3.0),
345  test_t(" 4 - 5 ",-1.0),
346  test_t(" 5 - 4 ",+1.0),
347  test_t(" 6 - 3 ",+3.0),
348  test_t(" 7 - 2 ",+5.0),
349  test_t(" 8 - 1 ",+7.0),
350  test_t(" 9 - 0 ",+9.0),
351  test_t("( 0 - 9 )",-9.0),
352  test_t("( 1 - 8 )",-7.0),
353  test_t("( 2 - 7 )",-5.0),
354  test_t("( 3 - 6 )",-3.0),
355  test_t("( 4 - 5 )",-1.0),
356  test_t("( 5 - 4 )",+1.0),
357  test_t("( 6 - 3 )",+3.0),
358  test_t("( 7 - 2 )",+5.0),
359  test_t("( 8 - 1 )",+7.0),
360  test_t("( 9 - 0 )",+9.0),
361  test_t("-(1+2)",-3.0),
362  test_t("+(1+2)",+3.0),
363  test_t("+(1-2)",-1.0),
364  test_t("-(1-2)",+1.0),
365  test_t("(-3*-6)",+18.0),
366  test_t("(-6*-3)",+18.0),
367  test_t("-(-3*-6)",-18.0),
368  test_t("-(-6*-3)",-18.0),
369  test_t("1.1+2.2+3.3",+6.6),
370  test_t("+1.1+2.2+3.3",+6.6),
371  test_t("-1.1-2.2-3.3",-6.6),
372  test_t("1.1*2.2*3.3",+7.986),
373  test_t("+1.1*2.2*3.3",+7.986),
374  test_t("-1.1*-2.2*-3.3",-7.986),
375  test_t("1 + 1/2",+1.5),
376  test_t("1 + (1/2)",+1.5),
377  test_t("1.1 + 1.1/2.2",+1.6),
378  test_t("1.1 + (1.1/2.2)",+1.6),
379  test_t("2 * 1/2",+1.0),
380  test_t("2 * (1/2)",+1.0),
381  test_t("2.2 * 1.1/2.2",+1.1),
382  test_t("2.2 * (1.1/2.2)",+1.1),
383  test_t("1^2",1.0),
384  test_t("2^1",2.0),
385  test_t("2^3",8.0),
386  test_t("-2^3",-8.0),
387  test_t("-2^4",-16.0),
388  test_t("(-2)^3",-8.0),
389  test_t("(-2)^4",+16.0),
390  test_t("3^2^4",43046721.0),
391  test_t("1.1^2.2",1.23328630055466251099),
392  test_t("2.2^1.1",2.3804822576003541627),
393  test_t("2.2^3.3",13.48946876053338489127),
394  test_t("3.3^2.2^1.1",17.15193942371376191362),
395  test_t("+3.3^2.2^1.1",17.15193942371376191362),
396  test_t("3.3^+2.2^1.1",17.15193942371376191362),
397  test_t("3.3^2.2^+1.1",17.15193942371376191362),
398  test_t("3.3^2.2^-1.1",1.65127293793867959137),
399  test_t("+3.3^+2.2^-1.1",1.65127293793867959137),
400  test_t("1.1^(1.1 * 2.2)",1.25941916576299080582),
401  test_t("2.2^(1.1 * 3.3)",17.49823848953534759743),
402  test_t("3.3^(1.1 * 2.2)",17.98058156638874965269),
403  test_t("1.1^-2.2/1.1",0.73712884727743375853),
404  test_t("1.1^+2.2/1.1",1.121169364140602282717273261774),
405  test_t("1.1^2.2/+1.1",1.121169364140602282717273261774),
406  test_t("1.1^+2.2/+1.1",1.121169364140602282717273261774),
407  test_t("1.1^+2.2/-1.1",-1.121169364140602282717273261774),
408  test_t("1.1^2.2/-1.1",-1.121169364140602282717273261774),
409  test_t("1.1^+2.2/-1.1",-1.121169364140602282717273261774),
410  test_t("+1.1^-2.2/1.1",0.73712884727743375853),
411  test_t("+1.1^+2.2/1.1",1.121169364140602282717273261774),
412  test_t("+1.1^2.2/+1.1",1.121169364140602282717273261774),
413  test_t("+1.1^+2.2/+1.1",1.121169364140602282717273261774),
414  test_t("+1.1^+2.2/-1.1",-1.121169364140602282717273261774),
415  test_t("+1.1^2.2/-1.1",-1.121169364140602282717273261774),
416  test_t("+1.1^+2.2/-1.1",-1.121169364140602282717273261774),
417  test_t("equal(1.23^3,(1.23 * 1.23 * 1.23))",1.0),
418  test_t("equal(1.23^-3,1/(1.23 * 1.23 * 1.23))",1.0),
419  test_t("equal((2.1 + 1.23^3),(2.1 + [1.23 * 1.23 * 1.23]))",1.0),
420  test_t("equal((2.1 - 1.23^3),(2.1 - [1.23 * 1.23 * 1.23]))",1.0),
421  test_t("equal((2.1 * 1.23^3),(2.1 * [1.23 * 1.23 * 1.23]))",1.0),
422  test_t("equal((2.1 / 1.23^3),(2.1 / [1.23 * 1.23 * 1.23]))",1.0),
423  test_t("equal((1.23^3 + 2.1),({1.23 * 1.23 * 1.23} + 2.1))",1.0),
424  test_t("equal((1.23^3 - 2.1),({1.23 * 1.23 * 1.23} - 2.1))",1.0),
425  test_t("equal((1.23^3 * 2.1),({1.23 * 1.23 * 1.23} * 2.1))",1.0),
426  test_t("equal((1.23^3 / 2.1),({1.23 * 1.23 * 1.23} / 2.1))",1.0),
427  test_t("equal(1.0^(1.0/2.0),sqrt(1.0))",1.0),
428  test_t("equal(1.0^(1.0/2.0),root(1.0,2.0))",1.0),
429  test_t("equal(1.0^(1.0/3.0),root(1.0,3.0))",1.0),
430  test_t("equal(1.0^(1.0/4.0),root(1.0,4.0))",1.0),
431  test_t("equal(1.0^(1.0/5.0),root(1.0,5.0))",1.0),
432  test_t("equal(1.0^(1.0/6.0),root(1.0,6.0))",1.0),
433  test_t("equal(1.0^(1.0/7.0),root(1.0,7.0))",1.0),
434  test_t("equal(1.0^(1.0/8.0),root(1.0,8.0))",1.0),
435  test_t("equal(1.0^(1.0/9.0),root(1.0,9.0))",1.0),
436  test_t("equal(2.0^(1.0/2.0),sqrt(2.0))",1.0),
437  test_t("equal(2.0^(1.0/2.0),root(2.0,2.0))",1.0),
438  test_t("equal(3.0^(1.0/3.0),root(3.0,3.0))",1.0),
439  test_t("equal(4.0^(1.0/4.0),root(4.0,4.0))",1.0),
440  test_t("equal(5.0^(1.0/5.0),root(5.0,5.0))",1.0),
441  test_t("equal(6.0^(1.0/6.0),root(6.0,6.0))",1.0),
442  test_t("equal(7.0^(1.0/7.0),root(7.0,7.0))",1.0),
443  test_t("equal(8.0^(1.0/8.0),root(8.0,8.0))",1.0),
444  test_t("equal(9.0^(1.0/9.0),root(9.0,9.0))",1.0),
445  test_t("1 < 2", 1.0),
446  test_t("1 <= 2", 1.0),
447  test_t("1.1 <= 2.2", 1.0),
448  test_t("(1.0 + 0.1) <= (2.0 + 0.2)", 1.0),
449  test_t("1 > 2", 0.0),
450  test_t("1 >= 2", 0.0),
451  test_t("1.1 >= 2.2", 0.0),
452  test_t("(1.0 + 0.1) >= (2.0 + 0.2)", 0.0),
453  test_t("1 <> 2", 1.0),
454  test_t("1 != 2", 1.0),
455  test_t("1.1 <> 2.2", 1.0),
456  test_t("1.1 != 2.2", 1.0),
457  test_t("(1.0 + 0.1) <> (2.0 + 0.2)", 1.0),
458  test_t("(1.0 + 0.1) != (2.0 + 0.2)", 1.0),
459  test_t("1 == 1", 1.0),
460  test_t("1.1 == 1.1", 1.0),
461  test_t("1 = 1", 1.0),
462  test_t("1.1 = 1.1", 1.0),
463  test_t("1 <> 1", 0.0),
464  test_t("1 != 1", 0.0),
465  test_t("1.1 <> 1.1", 0.0),
466  test_t("1.1 != 1.1", 0.0),
467  test_t("(1.0 + 0.1) <> (1.0 + 0.1)", 0.0),
468  test_t("(1.0 + 0.1) != (1.0 + 0.1)", 0.0),
469  test_t("equal(1.1,1.1)",1.0),
470  test_t("equal(1.1,2.2)",0.0),
471  test_t("not_equal(1.1,1.1)",0.0),
472  test_t("not_equal(1.1,2.2)",1.0),
473  test_t("1 and 1",1.0),
474  test_t("1 and 0",0.0),
475  test_t("0 and 1",0.0),
476  test_t("0 and 0",0.0),
477  test_t("1.0 and 1.0",1.0),
478  test_t("1.0 and 0.0",0.0),
479  test_t("0.0 and 1.0",0.0),
480  test_t("0.0 and 0.0",0.0),
481  test_t("(1 and 1)",1.0),
482  test_t("(1 and 0)",0.0),
483  test_t("(0 and 1)",0.0),
484  test_t("(0 and 0)",0.0),
485  test_t("(1.0 and 1.0)",1.0),
486  test_t("(1.0 and 0.0)",0.0),
487  test_t("(0.0 and 1.0)",0.0),
488  test_t("(0.0 and 0.0)",0.0),
489  test_t("1 or 1",1.0),
490  test_t("1 or 0",1.0),
491  test_t("0 or 1",1.0),
492  test_t("0 or 0",0.0),
493  test_t("1.0 or 1.0",1.0),
494  test_t("1.0 or 0.0",1.0),
495  test_t("0.0 or 1.0",1.0),
496  test_t("0.0 or 0.0",0.0),
497  test_t("(1 or 1)",1.0),
498  test_t("(1 or 0)",1.0),
499  test_t("(0 or 1)",1.0),
500  test_t("(0 or 0)",0.0),
501  test_t("(1.0 or 1.0)",1.0),
502  test_t("(1.0 or 0.0)",1.0),
503  test_t("(0.0 or 1.0)",1.0),
504  test_t("(0.0 or 0.0)",0.0),
505  test_t("1 nand 1",0.0),
506  test_t("1 nand 0",1.0),
507  test_t("0 nand 1",1.0),
508  test_t("0 nand 0",1.0),
509  test_t("1.0 nand 1.0",0.0),
510  test_t("1.0 nand 0.0",1.0),
511  test_t("0.0 nand 1.0",1.0),
512  test_t("0.0 nand 0.0",1.0),
513  test_t("(1 nand 1)",0.0),
514  test_t("(1 nand 0)",1.0),
515  test_t("(0 nand 1)",1.0),
516  test_t("(0 nand 0)",1.0),
517  test_t("(1.0 nand 1.0)",0.0),
518  test_t("(1.0 nand 0.0)",1.0),
519  test_t("(0.0 nand 1.0)",1.0),
520  test_t("(0.0 nand 0.0)",1.0),
521  test_t("1 nor 1",0.0),
522  test_t("1 nor 0",0.0),
523  test_t("0 nor 1",0.0),
524  test_t("0 nor 0",1.0),
525  test_t("1.0 nor 1.0",0.0),
526  test_t("1.0 nor 0.0",0.0),
527  test_t("0.0 nor 1.0",0.0),
528  test_t("0.0 nor 0.0",1.0),
529  test_t("(1 nor 1)",0.0),
530  test_t("(1 nor 0)",0.0),
531  test_t("(0 nor 1)",0.0),
532  test_t("(0 nor 0)",1.0),
533  test_t("(1.0 nor 1.0)",0.0),
534  test_t("(1.0 nor 0.0)",0.0),
535  test_t("(0.0 nor 1.0)",0.0),
536  test_t("(0.0 nor 0.0)",1.0),
537  test_t("0 xor 0",0.0),
538  test_t("0 xor 1",1.0),
539  test_t("1 xor 0",1.0),
540  test_t("1 xor 1",0.0),
541  test_t("0.0 xor 0.0",0.0),
542  test_t("0.0 xor 1.0",1.0),
543  test_t("1.0 xor 0.0",1.0),
544  test_t("1.0 xor 1.0",0.0),
545  test_t("(0 xor 0)",0.0),
546  test_t("(0 xor 1)",1.0),
547  test_t("(1 xor 0)",1.0),
548  test_t("(1 xor 1)",0.0),
549  test_t("(0.0 xor 0.0)",0.0),
550  test_t("(0.0 xor 1.0)",1.0),
551  test_t("(1.0 xor 0.0)",1.0),
552  test_t("(1.0 xor 1.0)",0.0),
553  test_t("1 & 1",1.0),
554  test_t("1 & 0",0.0),
555  test_t("0 & 1",0.0),
556  test_t("0 & 0",0.0),
557  test_t("1.0 & 1.0",1.0),
558  test_t("1.0 & 0.0",0.0),
559  test_t("0.0 & 1.0",0.0),
560  test_t("0.0 & 0.0",0.0),
561  test_t("(1 & 1)",1.0),
562  test_t("(1 & 0)",0.0),
563  test_t("(0 & 1)",0.0),
564  test_t("(0 & 0)",0.0),
565  test_t("(1.0 & 1.0)",1.0),
566  test_t("(1.0 & 0.0)",0.0),
567  test_t("(0.0 & 1.0)",0.0),
568  test_t("(0.0 & 0.0)",0.0),
569  test_t("1 | 1",1.0),
570  test_t("1 | 0",1.0),
571  test_t("0 | 1",1.0),
572  test_t("0 | 0",0.0),
573  test_t("1.0 | 1.0",1.0),
574  test_t("1.0 | 0.0",1.0),
575  test_t("0.0 | 1.0",1.0),
576  test_t("0.0 | 0.0",0.0),
577  test_t("(1 | 1)",1.0),
578  test_t("(1 | 0)",1.0),
579  test_t("(0 | 1)",1.0),
580  test_t("(0 | 0)",0.0),
581  test_t("(1.0 | 1.0)",1.0),
582  test_t("(1.0 | 0.0)",1.0),
583  test_t("(0.0 | 1.0)",1.0),
584  test_t("(0.0 | 0.0)",0.0),
585  test_t("(1 nand 1) == not(1 and 1)",1.0),
586  test_t("(1 nand 0) == not(1 and 0)",1.0),
587  test_t("(0 nand 1) == not(0 and 1)",1.0),
588  test_t("(0 nand 0) == not(0 and 0)",1.0),
589  test_t("(1 nor 1) == not(1 or 1)",1.0),
590  test_t("(1 nor 0) == not(1 or 0)",1.0),
591  test_t("(0 nor 1) == not(0 or 1)",1.0),
592  test_t("(0 nor 0) == not(0 or 0)",1.0),
593  test_t("(1.0 nand 1.0) == not(1.0 and 1.0)",1.0),
594  test_t("(1.0 nand 0.0) == not(1.0 and 0.0)",1.0),
595  test_t("(0.0 nand 1.0) == not(0.0 and 1.0)",1.0),
596  test_t("(0.0 nand 0.0) == not(0.0 and 0.0)",1.0),
597  test_t("(1.0 nor 1.0) == not(1.0 or 1.0)",1.0),
598  test_t("(1.0 nor 0.0) == not(1.0 or 0.0)",1.0),
599  test_t("(0.0 nor 1.0) == not(0.0 or 1.0)",1.0),
600  test_t("(0.0 nor 0.0) == not(0.0 or 0.0)",1.0),
601  test_t("(1 nand 1) == not(1 & 1)",1.0),
602  test_t("(1 nand 0) == not(1 & 0)",1.0),
603  test_t("(0 nand 1) == not(0 & 1)",1.0),
604  test_t("(0 nand 0) == not(0 & 0)",1.0),
605  test_t("(1 nor 1) == not(1 | 1)",1.0),
606  test_t("(1 nor 0) == not(1 | 0)",1.0),
607  test_t("(0 nor 1) == not(0 | 1)",1.0),
608  test_t("(0 nor 0) == not(0 | 0)",1.0),
609  test_t("(1.0 nand 1.0) == not(1.0 & 1.0)",1.0),
610  test_t("(1.0 nand 0.0) == not(1.0 & 0.0)",1.0),
611  test_t("(0.0 nand 1.0) == not(0.0 & 1.0)",1.0),
612  test_t("(0.0 nand 0.0) == not(0.0 & 0.0)",1.0),
613  test_t("(1.0 nor 1.0) == not(1.0 | 1.0)",1.0),
614  test_t("(1.0 nor 0.0) == not(1.0 | 0.0)",1.0),
615  test_t("(0.0 nor 1.0) == not(0.0 | 1.0)",1.0),
616  test_t("(0.0 nor 0.0) == not(0.0 | 0.0)",1.0),
617  test_t("mand(1,1)",1.0),
618  test_t("mand(1,0)",0.0),
619  test_t("mand(0,1)",0.0),
620  test_t("mand(0,0)",0.0),
621  test_t("mand(1.0,1.0)",1.0),
622  test_t("mand(1.0,0.0)",0.0),
623  test_t("mand(0.0,1.0)",0.0),
624  test_t("mand(0.0,0.0)",0.0),
625  test_t("mor(1,1)",1.0),
626  test_t("mor(1,0)",1.0),
627  test_t("mor(0,1)",1.0),
628  test_t("mor(0,0)",0.0),
629  test_t("mor(1.0,1.0)",1.0),
630  test_t("mor(1.0,0.0)",1.0),
631  test_t("mor(0.0,1.0)",1.0),
632  test_t("mor(0.0,0.0)",0.0),
633  test_t("(1 nand 1) == not(mand(1,1))",1.0),
634  test_t("(1 nand 0) == not(mand(1,0))",1.0),
635  test_t("(0 nand 1) == not(mand(0,1))",1.0),
636  test_t("(0 nand 0) == not(mand(0,0))",1.0),
637  test_t("(1 nor 1) == not(mor(1,1))",1.0),
638  test_t("(1 nor 0) == not(mor(1,0))",1.0),
639  test_t("(0 nor 1) == not(mor(0,1))",1.0),
640  test_t("(0 nor 0) == not(mor(0,0))",1.0),
641  test_t("(1.0 nand 1.0) == not(mand(1.0,1.0))",1.0),
642  test_t("(1.0 nand 0.0) == not(mand(1.0,0.0))",1.0),
643  test_t("(0.0 nand 1.0) == not(mand(0.0,1.0))",1.0),
644  test_t("(0.0 nand 0.0) == not(mand(0.0,0.0))",1.0),
645  test_t("(1.0 nor 1.0) == not(mor(1.0,1.0))",1.0),
646  test_t("(1.0 nor 0.0) == not(mor(1.0,0.0))",1.0),
647  test_t("(0.0 nor 1.0) == not(mor(0.0,1.0))",1.0),
648  test_t("(0.0 nor 0.0) == not(mor(0.0,0.0))",1.0),
649  test_t("abs(1)",1.0),
650  test_t("abs(-1)",1.0),
651  test_t("abs(1.0)",1.0),
652  test_t("abs(-1.0)",1.0),
653  test_t("min(1,2)",1.0),
654  test_t("min(1,2,3)",1.0),
655  test_t("min(1,2,3,4)",1.0),
656  test_t("min(1,2,3,4,5)",1.0),
657  test_t("min(1,2,3,4,5,6)",1.0),
658  test_t("min(1.1,2.2)",1.1),
659  test_t("min(1.1,2.2,3.3)",1.1),
660  test_t("min(1.1,2.2,3.3,4.4)",1.1),
661  test_t("min(1.1,2.2,3.3,4.4,5.5)",1.1),
662  test_t("min(1.1,2.2,3.3,4.4,5.5,6.6)",1.1),
663  test_t("min(min(1,2),min(3,4))",1.0),
664  test_t("max(1,2)",2.0),
665  test_t("max(1,2,3)",3.0),
666  test_t("max(1,2,3,4)",4.0),
667  test_t("max(1,2,3,4,5)",5.0),
668  test_t("max(1,2,3,4,5,6)",6.0),
669  test_t("max(1.1,2.2)",2.2),
670  test_t("max(1.1,2.2,3.3)",3.3),
671  test_t("max(1.1,2.2,3.3,4.4)",4.4),
672  test_t("max(1.1,2.2,3.3,4.4,5.5)",5.5),
673  test_t("max(1.1,2.2,3.3,4.4,5.5,6.6)",6.6),
674  test_t("max(max(1,2),max(3,4))",4.0),
675  test_t("avg(1,2)",1.5),
676  test_t("avg(1,2,3)",2.0),
677  test_t("avg(1,2,3,4)",2.5),
678  test_t("avg(1,2,3,4,5)",3.0),
679  test_t("avg(1.1,2.2)",1.65),
680  test_t("avg(1.1,2.2,3.3)",2.2),
681  test_t("avg(1.1,2.2,3.3,4.4)",2.75),
682  test_t("avg(1.1,2.2,3.3,4.4,5.5)",3.3),
683  test_t("avg(1.1,2.2,3.3,4.4,5.5,6.6)",3.85),
684  test_t("sum(1,2)",3.0),
685  test_t("sum(1,2,3)",6.0),
686  test_t("sum(1,2,3,4)",10),
687  test_t("sum(1,2,3,4,5)",15.0),
688  test_t("sum(1,2,3,4,5,6)",21),
689  test_t("sum(1.1,2.2)",3.3),
690  test_t("sum(1.1,2.2,3.3)",6.6),
691  test_t("sum(1.1,2.2,3.3,4.4)",11.0),
692  test_t("sum(1.1,2.2,3.3,4.4,5.5)",16.5),
693  test_t("sum(1.1,2.2,3.3,4.4,5.5,6.6)",23.1),
694  test_t("mul(1,2)",2.0),
695  test_t("mul(1,2,3)",6.0),
696  test_t("mul(1,2,3,4)",24.0),
697  test_t("mul(1,2,3,4,5)",120.0),
698  test_t("mul(1,2,3,4,5,6)",720.0),
699  test_t("mul(1.1,2.2)",2.42),
700  test_t("mul(1.1,2.2,3.3)",7.986),
701  test_t("mul(1.1,2.2,3.3,4.4)",35.1384),
702  test_t("mul(1.1,2.2,3.3,4.4,5.5)",193.2612),
703  test_t("mul(1.1,2.2,3.3,4.4,5.5,6.6)",1275.52392),
704  test_t("equal(sum(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),(1.1+2.2+3.3+4.4+5.5+6.6+7.7+8.8+9.9))",1.0),
705  test_t("equal(mul(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),(1.1*2.2*3.3*4.4*5.5*6.6*7.7*8.8*9.9))",1.0),
706  test_t("equal(min(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),1.1)",1.0),
707  test_t("equal(max(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),9.9)",1.0),
708  test_t("equal(avg(1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9),5.5)",1.0),
709  test_t("floor(1.0)",1.0),
710  test_t("floor(1.1)",1.0),
711  test_t("floor(-1.0)",-1.0),
712  test_t("floor(-1.1)",-2.0),
713  test_t("ceil(1.0)",1.0),
714  test_t("ceil(1.1)",2.0),
715  test_t("ceil(-1.0)",-1.0),
716  test_t("ceil(-1.1)",-1.0),
717  test_t("round(1.1)",1.0),
718  test_t("round(1.49)",1.0),
719  test_t("round(1.5)",2.0),
720  test_t("round(1.9)",2.0),
721  test_t("roundn(1/3,2)",0.33),
722  test_t("roundn(1/3,5)",0.33333),
723  test_t("roundn(2/3,2)",0.67),
724  test_t("roundn(2/3,5)",0.66667),
725  test_t("roundn(1.0/3.0,2.0)",0.33),
726  test_t("roundn(1.0/3.0,5.0)",0.33333),
727  test_t("roundn(2.0/3.0,2.0)",0.67),
728  test_t("roundn(2.0/3.0,5.0)",0.66667),
729  test_t("cos(0.0)",1.0),
730  test_t("sin(0.0)",0.0),
731  test_t("equal(sin(pi/4.0),cos(pi/4.0))",1.0),
732  test_t("equal(sin(pi/6.0),cos(pi/3.0))",1.0),
733  test_t("(sin(pi/4.0) - cos(pi/4.0)) <= epsilon",1.0),
734  test_t("(cos(pi/3.0) - sin(pi/6.0)) <= epsilon",1.0),
735  test_t("sin(deg2rad(30))",0.5),
736  test_t("cos(deg2rad(60))",0.5),
737  test_t("sin(deg2rad(30)) + cos(deg2rad(60))",1.0),
738  test_t("equal(sin(deg2rad(30))/cos(deg2rad(30)),tan(deg2rad(30)))",1.0),
739  test_t("equal(sinh(pi),11.5487393572577483779773343153884) ",1.0),
740  test_t("equal(asinh(11.5487393572577483779773343153884),pi)",1.0),
741  test_t("equal(cosh(pi),11.5919532755215206277517520525601) ",1.0),
742  test_t("equal(acosh(11.5919532755215206277517520525601),pi)",1.0),
743  test_t("equal(tanh(pi),0.99627207622074994426469058001253) ",1.0),
744  test_t("equal(atanh(0.99627207622074994426469058001253),pi)",1.0),
745  test_t("exp(1.0)",2.71828182845904523536028747135266249775724),
746  test_t("exp(0.0)",1.0),
747  test_t("log(2.7182818284590451)",1.0),
748  test_t("log10(10.0)",1.0),
749  test_t("frac(12.34) + trunc(12.34)",12.34),
750  test_t("hypot(3.0,4.0)",5.0),
751  test_t("hypot(1.0,sqrt(3.0))",2.0),
752  test_t("if(1 < 2, 3, 4)",3.0),
753  test_t("if(1.1 < 2.2, 3.3, 4.4)",3.3),
754  test_t("if((1.0+1.1) < (2.0+1.2), 3.3, 4.4)",3.3),
755  test_t("if(1 = 2, 3, 4)",4.0),
756  test_t("if(1.1 = 2.2, 3.3, 4.4)",4.4),
757  test_t("if((1.0+1.1) = (2.0+1.2), 3.3, 4.4)",4.4),
758  test_t("if(1 == 2, 3, 4)",4.0),
759  test_t("if(1.1 == 2.2, 3.3, 4.4)",4.4),
760  test_t("if((1.0+1.1) == (2.0+1.2), 3.3, 4.4)",4.4),
761  test_t("if(1 >= 2, 3, 4)",4.0),
762  test_t("if(1.1 >= 2.2, 3.3, 4.4)",4.4),
763  test_t("if((1.0+1.1) >= (2.0+1.2), 3.3, 4.4)",4.4),
764  test_t("if(((1.0 + 2.0) == 3.0) and ((4.0 + 5.0) < 9.0),1,2)",2.0),
765  test_t("(3.0 - 1.0 - 2.0) == ((3.0 - 1.0) - 2.0)",1.0),
766  test_t("true == true",1.0),
767  test_t("false == false",1.0),
768  test_t("true != false",1.0),
769  test_t("false != true",1.0),
770  test_t("(1 < 2) == true",1.0),
771  test_t("(1 > 2) == false",1.0),
772  test_t("true == (1 < 2)",1.0),
773  test_t("false == (1 > 2)",1.0),
774  test_t("(1 > 2) != true",1.0),
775  test_t("(1 < 2) != false",1.0),
776  test_t("true != (1 > 2)",1.0),
777  test_t("false != (1 < 2)",1.0),
778  test_t("(true and true) == true",1.0),
779  test_t("(false and false) == false",1.0),
780  test_t("(true or true) == true",1.0),
781  test_t("(false or false) == false",1.0),
782  test_t("(true and false) == false",1.0),
783  test_t("(false and true) == false",1.0),
784  test_t("(true or false) == true",1.0),
785  test_t("(false or true) == true",1.0),
786  test_t("(true & true) == true",1.0),
787  test_t("(false & false) == false",1.0),
788  test_t("(true | true) == true",1.0),
789  test_t("(false | false) == false",1.0),
790  test_t("(true & false) == false",1.0),
791  test_t("(false & true) == false",1.0),
792  test_t("(true | false) == true",1.0),
793  test_t("(false | true) == true",1.0),
794  test_t("clamp(-1,1,+1)",1.0),
795  test_t("clamp(-1,-1.5,+1.0)",-1.0),
796  test_t("clamp(-1,+1.5,+1.0)",+1.0),
797  test_t("clamp(-1,-1.5,+1.0) + clamp(-1,+1.5,+1.0)",0.0),
798  test_t("inrange(-2,1,+2) == ((-2 <= 1) and (1 <= +2))",1.0),
799  test_t("inrange(-2,1,+2) == if(({-2 <= 1} and [1 <= +2]),1.0,0.0)",1.0),
800  test_t("sgn( 0)", 0.0),
801  test_t("sgn(+3)",+1.0),
802  test_t("sgn(-3)",-1.0),
803  test_t("equal($f00(1.1,2.2,3.3),(1.1+2.2)/3.3)",1.0),
804  test_t("equal($f01(1.1,2.2,3.3),(1.1+2.2)*3.3)",1.0),
805  test_t("equal($f02(1.1,2.2,3.3),(1.1+2.2)-3.3)",1.0),
806  test_t("equal($f03(1.1,2.2,3.3),(1.1+2.2)+3.3)",1.0),
807  test_t("equal($f04(1.1,2.2,3.3),(1.1-2.2)+3.3)",1.0),
808  test_t("equal($f05(1.1,2.2,3.3),(1.1-2.2)/3.3)",1.0),
809  test_t("equal($f06(1.1,2.2,3.3),(1.1-2.2)*3.3)",1.0),
810  test_t("equal($f07(1.1,2.2,3.3),(1.1*2.2)+3.3)",1.0),
811  test_t("equal($f08(1.1,2.2,3.3),(1.1*2.2)-3.3)",1.0),
812  test_t("equal($f09(1.1,2.2,3.3),(1.1*2.2)/3.3)",1.0),
813  test_t("equal($f10(1.1,2.2,3.3),(1.1*2.2)*3.3)",1.0),
814  test_t("equal($f11(1.1,2.2,3.3),(1.1/2.2)+3.3)",1.0),
815  test_t("equal($f12(1.1,2.2,3.3),(1.1/2.2)-3.3)",1.0),
816  test_t("equal($f13(1.1,2.2,3.3),(1.1/2.2)/3.3)",1.0),
817  test_t("equal($f14(1.1,2.2,3.3),(1.1/2.2)*3.3)",1.0),
818  test_t("equal($f15(1.1,2.2,3.3),1.1/(2.2+3.3))",1.0),
819  test_t("equal($f16(1.1,2.2,3.3),1.1/(2.2-3.3))",1.0),
820  test_t("equal($f17(1.1,2.2,3.3),1.1/(2.2*3.3))",1.0),
821  test_t("equal($f18(1.1,2.2,3.3),1.1/(2.2/3.3))",1.0),
822  test_t("equal($f19(1.1,2.2,3.3),1.1*(2.2+3.3))",1.0),
823  test_t("equal($f20(1.1,2.2,3.3),1.1*(2.2-3.3))",1.0),
824  test_t("equal($f21(1.1,2.2,3.3),1.1*(2.2*3.3))",1.0),
825  test_t("equal($f22(1.1,2.2,3.3),1.1*(2.2/3.3))",1.0),
826  test_t("equal($f23(1.1,2.2,3.3),1.1-(2.2+3.3))",1.0),
827  test_t("equal($f24(1.1,2.2,3.3),1.1-(2.2-3.3))",1.0),
828  test_t("equal($f25(1.1,2.2,3.3),1.1-(2.2/3.3))",1.0),
829  test_t("equal($f26(1.1,2.2,3.3),1.1-(2.2*3.3))",1.0),
830  test_t("equal($f27(1.1,2.2,3.3),1.1+(2.2*3.3))",1.0),
831  test_t("equal($f28(1.1,2.2,3.3),1.1+(2.2/3.3))",1.0),
832  test_t("equal($f29(1.1,2.2,3.3),1.1+(2.2+3.3))",1.0),
833  test_t("equal($f30(1.1,2.2,3.3),1.1+(2.2-3.3))",1.0),
834  test_t("equal($f31(1.1,2.2,3.3),1.1*2.2^2+3.3)",1.0),
835  test_t("equal($f32(1.1,2.2,3.3),1.1*2.2^3+3.3)",1.0),
836  test_t("equal($f33(1.1,2.2,3.3),1.1*2.2^4+3.3)",1.0),
837  test_t("equal($f34(1.1,2.2,3.3),1.1*2.2^5+3.3)",1.0),
838  test_t("equal($f35(1.1,2.2,3.3),1.1*2.2^6+3.3)",1.0),
839  test_t("equal($f36(1.1,2.2,3.3),1.1*2.2^7+3.3)",1.0),
840  test_t("equal($f37(1.1,2.2,3.3),1.1*2.2^8+3.3)",1.0),
841  test_t("equal($f38(1.1,2.2,3.3),1.1*2.2^9+3.3)",1.0),
842  test_t("equal($f39(1.1,2.2,3.3),1.1*log(2.2)+3.3)",1.0),
843  test_t("equal($f40(1.1,2.2,3.3),1.1*log(2.2)-3.3)",1.0),
844  test_t("equal($f41(1.1,2.2,3.3),1.1*log10(2.2)+3.3)",1.0),
845  test_t("equal($f42(1.1,2.2,3.3),1.1*log10(2.2)-3.3)",1.0),
846  test_t("equal($f43(1.1,2.2,3.3),1.1*sin(2.2)+3.3)",1.0),
847  test_t("equal($f44(1.1,2.2,3.3),1.1*sin(2.2)-3.3)",1.0),
848  test_t("equal($f45(1.1,2.2,3.3),1.1*cos(2.2)+3.3)",1.0),
849  test_t("equal($f46(1.1,2.2,3.3),1.1*cos(2.2)-3.3)",1.0),
850  test_t("equal($f47(1.1,2.2,3.3),if(0!=1.1,2.2,3.3))",1.0),
851  test_t("equal($f48(1.1,2.2,3.3,4.4),1.1+((2.2+3.3)/4.4))",1.0),
852  test_t("equal($f49(1.1,2.2,3.3,4.4),1.1+((2.2+3.3)*4.4))",1.0),
853  test_t("equal($f50(1.1,2.2,3.3,4.4),1.1+((2.2-3.3)/4.4))",1.0),
854  test_t("equal($f51(1.1,2.2,3.3,4.4),1.1+((2.2-3.3)*4.4))",1.0),
855  test_t("equal($f52(1.1,2.2,3.3,4.4),1.1+((2.2*3.3)/4.4))",1.0),
856  test_t("equal($f53(1.1,2.2,3.3,4.4),1.1+((2.2*3.3)*4.4))",1.0),
857  test_t("equal($f54(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)+4.4))",1.0),
858  test_t("equal($f55(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)/4.4))",1.0),
859  test_t("equal($f56(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)*4.4))",1.0),
860  test_t("equal($f57(1.1,2.2,3.3,4.4),1.1-((2.2+3.3)/4.4))",1.0),
861  test_t("equal($f58(1.1,2.2,3.3,4.4),1.1-((2.2+3.3)*4.4))",1.0),
862  test_t("equal($f59(1.1,2.2,3.3,4.4),1.1-((2.2-3.3)/4.4))",1.0),
863  test_t("equal($f60(1.1,2.2,3.3,4.4),1.1-((2.2-3.3)*4.4))",1.0),
864  test_t("equal($f61(1.1,2.2,3.3,4.4),1.1-((2.2*3.3)/4.4))",1.0),
865  test_t("equal($f62(1.1,2.2,3.3,4.4),1.1-((2.2*3.3)*4.4))",1.0),
866  test_t("equal($f63(1.1,2.2,3.3,4.4),1.1-((2.2/3.3)/4.4))",1.0),
867  test_t("equal($f64(1.1,2.2,3.3,4.4),1.1-((2.2/3.3)*4.4))",1.0),
868  test_t("equal($f65(1.1,2.2,3.3,4.4),((1.1+2.2)*3.3)-4.4)",1.0),
869  test_t("equal($f66(1.1,2.2,3.3,4.4),((1.1-2.2)*3.3)-4.4)",1.0),
870  test_t("equal($f67(1.1,2.2,3.3,4.4),((1.1*2.2)*3.3)-4.4)",1.0),
871  test_t("equal($f68(1.1,2.2,3.3,4.4),((1.1/2.2)*3.3)-4.4)",1.0),
872  test_t("equal($f69(1.1,2.2,3.3,4.4),((1.1+2.2)/3.3)-4.4)",1.0),
873  test_t("equal($f70(1.1,2.2,3.3,4.4),((1.1-2.2)/3.3)-4.4)",1.0),
874  test_t("equal($f71(1.1,2.2,3.3,4.4),((1.1*2.2)/3.3)-4.4)",1.0),
875  test_t("equal($f72(1.1,2.2,3.3,4.4),((1.1/2.2)/3.3)-4.4)",1.0),
876  test_t("equal($f73(1.1,2.2,3.3,4.4),(1.1*2.2)+(3.3*4.4))",1.0),
877  test_t("equal($f74(1.1,2.2,3.3,4.4),(1.1*2.2)-(3.3*4.4))",1.0),
878  test_t("equal($f75(1.1,2.2,3.3,4.4),(1.1*2.2)+(3.3/4.4))",1.0),
879  test_t("equal($f76(1.1,2.2,3.3,4.4),(1.1*2.2)-(3.3/4.4))",1.0),
880  test_t("equal($f77(1.1,2.2,3.3,4.4),(1.1/2.2)+(3.3/4.4))",1.0),
881  test_t("equal($f78(1.1,2.2,3.3,4.4),(1.1/2.2)-(3.3/4.4))",1.0),
882  test_t("equal($f79(1.1,2.2,3.3,4.4),(1.1/2.2)-(3.3*4.4))",1.0),
883  test_t("equal($f80(1.1,2.2,3.3,4.4),1.1/(2.2+(3.3*4.4)))",1.0),
884  test_t("equal($f81(1.1,2.2,3.3,4.4),1.1/(2.2-(3.3*4.4)))",1.0),
885  test_t("equal($f82(1.1,2.2,3.3,4.4),1.1*(2.2+(3.3*4.4)))",1.0),
886  test_t("equal($f83(1.1,2.2,3.3,4.4),1.1*(2.2-(3.3*4.4)))",1.0),
887  test_t("equal($f84(1.1,2.2,3.3,4.4),1.1*2.2^2+3.3*4.4^2)",1.0),
888  test_t("equal($f85(1.1,2.2,3.3,4.4),1.1*2.2^3+3.3*4.4^3)",1.0),
889  test_t("equal($f86(1.1,2.2,3.3,4.4),1.1*2.2^4+3.3*4.4^4)",1.0),
890  test_t("equal($f87(1.1,2.2,3.3,4.4),1.1*2.2^5+3.3*4.4^5)",1.0),
891  test_t("equal($f88(1.1,2.2,3.3,4.4),1.1*2.2^6+3.3*4.4^6)",1.0),
892  test_t("equal($f89(1.1,2.2,3.3,4.4),1.1*2.2^7+3.3*4.4^7)",1.0),
893  test_t("equal($f90(1.1,2.2,3.3,4.4),1.1*2.2^8+3.3*4.4^8)",1.0),
894  test_t("equal($f91(1.1,2.2,3.3,4.4),1.1*2.2^9+3.3*4.4^9)",1.0),
895  test_t("equal($f92(1.1,2.2,3.3,4.4),if(1.1 and 2.2,3.3,4.4))",1.0),
896  test_t("equal($f93(1.1,2.2,3.3,4.4),if(1.1 or 2.2,3.3,4.4))",1.0),
897  test_t("equal($f94(1.1,2.2,3.3,4.4),if(1.1 < 2.2,3.3,4.4))",1.0),
898  test_t("equal($f95(1.1,2.2,3.3,4.4),if(1.1 <= 2.2,3.3,4.4))",1.0),
899  test_t("equal($f96(1.1,2.2,3.3,4.4),if(1.1 > 2.2,3.3,4.4))",1.0),
900  test_t("equal($f97(1.1,2.2,3.3,4.4),if(1.1 >= 2.2,3.3,4.4))",1.0),
901  test_t("equal($f98(1.1,2.2,3.3,4.4),if(equal(1.1,2.2),3.3,4.4))",1.0),
902  test_t("equal($f99(1.1,2.2,3.3,4.4),1.1*sin(2.2)+3.3*cos(4.4))",1.0),
903  test_t("equal((48.0/2.0*(9.0+3.0)),288.0)",1.0),
904  test_t("equal((48.0/2.0(9.0+3.0)),288.0)",1.0),
905  test_t("equal((6.0/2.0(1.0+2.0)),9.0)",1.0),
906  test_t("1+2+3+4+5+6+7+8+9+0",45.0),
907  test_t("1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0",45.0),
908  test_t("1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0 + 8.0 + 9.0 + 0.0",45.0),
909  test_t("(1+2)+(3+4)+(5+6)+(7+8)+(9+0)",45.0),
910  test_t("(1-2)+(3-4)+(5-6)+(7-8)+(9-0)",+5.0),
911  test_t("(1+2)-(3+4)-(5+6)-(7+8)-(9+0)",-39.0),
912  test_t("(1.0+2.0)+(3.0+4.0)+(5.0+6.0)+(7.0+8.0)+(9.0+0.0)",45.0),
913  test_t("(1.0-2.0)+(3.0-4.0)+(5.0-6.0)+(7.0-8.0)+(9.0-0.0)",+5.0),
914  test_t("(1.0+2.0)-(3.0+4.0)-(5.0+6.0)-(7.0+8.0)-(9.0+0.0)",-39.0),
915  test_t("[(1.0+2.0)+[3.0+4.0]+(5.0+6.0)]+([7.0+8.0]+(9.0+0.0))",45.0),
916  test_t("([1.0-2.0]+(3.0-4.0)+[5.0-6.0])+[(7.0-8.0)+[9.0-0.0]]",+5.0),
917  test_t("((1.0+2.0))-[(3.0+4.0)]-((5.0+6.0))-[(7.0+8.0)]-((9.0+0.0))",-39.0),
918  test_t("{[(1.0+2.0)+[3.0+4.0]+({5.0+6.0})]}+({[7.0+8.0]+(9.0+0.0)})",45.0),
919  test_t("{([1.0-2.0]+(3.0-4.0)+[5.0-6.0])}+[({+7.0}-{+8.0})+[{+9.0-0.0}]]",+5.0),
920  test_t("((+1.0+2.0))-[({+3.0+4.0})]-(({+5.0+6.0}))-[({+7.0}+8.0)]-(({+9.0}+{0.0}))",-39.0),
921  test_t("1+2-3*4/5+6-7*8/9+0",0.37777777777777777778),
922  test_t("1.1+2.2-3.3*4.4/5.5+6.6-7.7*8.8/9.9+0.0",0.41555555555555555556),
923  test_t("(1+2)-(3*4)/(5+6)-(7*8)/(9+0)",-4.31313131313131313131),
924  test_t("1/1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9",2.82896825396825396825),
925  test_t("(1/1)+(1/2)+(1/3)+(1/4)+(1/5)+(1/6)+(1/7)+(1/8)+(1/9)",2.82896825396825396825),
926  test_t("1.0/1.0+1.0/2.0+1.0/3.0+1.0/4.0+1.0/5.0+1.0/6.0+1.0/7.0+1.0/8.0+1.0/9",2.82896825396825396825),
927  test_t("(1.0/1.0)+(1.0/2.0)+(1.0/3.0)+(1.0/4.0)+(1.0/5.0)+(1.0/6.0)+(1.0/7.0)+(1.0/8.0)+(1.0/9)",2.82896825396825396825),
928  test_t("1/1*1/2*1/3*1/4*1/5*1/6*1/7*1/8*1/9",0.00000275573192239859),
929  test_t("(1/1)*(1/2)*(1/3)*(1/4)*(1/5)*(1/6)*(1/7)*(1/8)*(1/9)",0.00000275573192239859),
930  test_t("1.0/1.0*1.0/2.0*1.0/3.0*1.0/4.0*1.0/5.0*1.0/6.0*1.0/7.0*1.0/8.0*1.0/9",0.00000275573192239859),
931  test_t("(1.0/1.0)*(1.0/2.0)*(1.0/3.0)*(1.0/4.0)*(1.0/5.0)*(1.0/6.0)*(1.0/7.0)*(1.0/8.0)*(1.0/9)",0.00000275573192239859),
932  test_t("equal(poly01(1.2345,2.2,1.1),(2.2*1.2345^1+1.1))",1.0),
933  test_t("equal(poly02(1.2345,3.3,2.2,1.1),(3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
934  test_t("equal(poly03(1.2345,4.4,3.3,2.2,1.1),(4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
935  test_t("equal(poly04(1.2345,5.5,4.4,3.3,2.2,1.1),(5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
936  test_t("equal(poly05(1.2345,6.6,5.5,4.4,3.3,2.2,1.1),(6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
937  test_t("equal(poly06(1.2345,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
938  test_t("equal(poly07(1.2345,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
939  test_t("equal(poly08(1.2345,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9*1.2345^8+8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
940  test_t("equal(poly09(1.2345,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1*1.2345^9+9.9*1.2345^8+8.8*1.2345^7+7.7*1.2345^6+6.6*1.2345^5+5.5*1.2345^4+4.4*1.2345^3+3.3*1.2345^2+2.2*1.2345^1+1.1))",1.0),
941  test_t("equal(poly10(1.37,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2*1.37^10+1.1*1.37^9+9.9*1.37^8+8.8*1.37^7+7.7*1.37^6+6.6*1.37^5+5.5*1.37^4+4.4*1.37^3+3.3*1.37^2+2.2*1.37^1+1.1))",1.0),
942  test_t("equal(poly11(1.37,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3*1.37^11+2.2*1.37^10+1.1*1.37^9+9.9*1.37^8+8.8*1.37^7+7.7*1.37^6+6.6*1.37^5+5.5*1.37^4+4.4*1.37^3+3.3*1.37^2+2.2*1.37^1+1.1))",1.0),
943  test_t("equal(poly12(1.37,4.4,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(4.4*1.37^12+3.3*1.37^11+2.2*1.37^10+1.1*1.37^9+9.9*1.37^8+8.8*1.37^7+7.7*1.37^6+6.6*1.37^5+5.5*1.37^4+4.4*1.37^3+3.3*1.37^2+2.2*1.37^1+1.1))",1.0),
944  test_t("equal(\t \n(\n \r1.1\t\t - \n\n 2.2\n\n/\r3.3\t),(1.1-2.2/3.3))",1.0),
945  test_t("equal((pi^2^3),(pi^8))",1.0),
946  test_t("equal((pi^(2^3)),(pi^8))",1.0),
947  test_t("equal(pi^2^3-pi^8,0)",1.0),
948  test_t("equal((2*pi^2^3),2*(pi^8))",1.0),
949  test_t("equal((pi^2^3*2),2*(pi^8))",1.0),
950  test_t("equal((pi^2^3/2),(pi^8)/2)",1.0),
951  test_t("equal((pi^2.2^3.3),(pi^13.4894687605338489))",1.0),
952  test_t("equal((pi^(2.2^3.3)),(pi^13.4894687605338489))",1.0),
953  test_t("equal((2.2*pi^2.2^3.3),2.2*(pi^13.4894687605338489))",1.0),
954  test_t("equal((pi^2.2^3.3*2),2*(pi^13.4894687605338489))",1.0),
955  test_t("equal((pi^2.2^3.3/2.2),(pi^13.4894687605338489)/2.2)",1.0),
956  test_t("equal((pi^-2^3),1/(pi^8))",1.0),
957  test_t("equal((pi^(-2^3)),1/(pi^8))",1.0),
958  test_t("equal((pi^2^-3),(pi^(1/8)))",1.0),
959  test_t("equal((pi^(2^-3)),(pi^(1/8)))",1.0),
960  test_t("equal((pi^-2^-3),1/(pi^(1/8)))",1.0),
961  test_t("equal((pi^(-2^-3)),1/(pi^(1/8)))",1.0),
962  test_t("equal((-pi^2^3),(-pi^8))",1.0),
963  test_t("equal((-pi^(2^3)),(-pi^8))",1.0),
964  test_t("equal(-pi^2^3--pi^8,0)",1.0),
965  test_t("equal((2*-pi^2^3),2*(-pi^8))",1.0),
966  test_t("equal((-pi^2^3*2),2*(-pi^8))",1.0),
967  test_t("equal((-pi^2^3/2),(-pi^8)/2)",1.0),
968  test_t("equal((-pi^2.2^3.3),(-pi^13.4894687605338489))",1.0),
969  test_t("equal((-pi^(2.2^3.3)),(-pi^13.4894687605338489))",1.0),
970  test_t("equal((2.2*-pi^2.2^3.3),2.2*(-pi^13.4894687605338489))",1.0),
971  test_t("equal((-pi^2.2^3.3*2),2*(-pi^13.4894687605338489))",1.0),
972  test_t("equal((-pi^2.2^3.3/2.2),(-pi^13.4894687605338489)/2.2)",1.0),
973  test_t("equal((-pi^-2^3),1/(-pi^8))",1.0),
974  test_t("equal((-pi^(-2^3)),1/(-pi^8))",1.0),
975  test_t("equal((-pi^2^-3),(-pi^(1/8)))",1.0),
976  test_t("equal((-pi^(2^-3)),(-pi^(1/8)))",1.0),
977  test_t("equal((-pi^-2^-3),1/(-pi^(1/8)))",1.0),
978  test_t("equal((-pi^(-2^-3)),1/(-pi^(1/8)))",1.0),
979  test_t("equal((+pi^+2^+3),(+pi^+8))",1.0),
980  test_t("equal((+pi^(2^3)),(+pi^+8))",1.0),
981  test_t("equal(+pi^+2^+3-+pi^+8,0)",1.0),
982  test_t("equal((+2*+pi^+2^+3),+2*(+pi^+8))",1.0),
983  test_t("equal((+pi^+2^+3*+2),+2*(+pi^+8))",1.0),
984  test_t("equal((+pi^+2^+3/+2),(+pi^+8)/+2)",1.0),
985  test_t("equal((+pi^+2.2^+3.3),(+pi^+13.4894687605338489))",1.0),
986  test_t("equal((+pi^(+2.2^+3.3)),(+pi^+13.4894687605338489))",1.0),
987  test_t("equal((+2.2*+pi^+2.2^+3.3),+2.2*(+pi^+13.4894687605338489))",1.0),
988  test_t("equal((+pi^+2.2^+3.3*+2),+2*(+pi^+13.4894687605338489))",1.0),
989  test_t("equal((+pi^+2.2^+3.3/+2.2),(+pi^+13.4894687605338489)/+2.2)",1.0),
990  test_t("equal((+pi^-2^3),1/(+pi^+8))",1.0),
991  test_t("equal((+pi^(-2^3)),1/(+pi^+8))",1.0),
992  test_t("equal((+pi^2^-3),(+pi^(+1/+8)))",1.0),
993  test_t("equal((+pi^(2^-3)),(+pi^(+1/+8)))",1.0),
994  test_t("equal((+pi^-2^-3),1/(+pi^(+1/+8)))",1.0),
995  test_t("equal((+pi^(-2^-3)),1/(+pi^(+1/+8)))",1.0),
996  test_t("equal((-pi^+2^+3),(-pi^+8))",1.0),
997  test_t("equal((-pi^(2^3)),(-pi^+8))",1.0),
998  test_t("equal(-pi^+2^+3--pi^+8,0)",1.0),
999  test_t("equal((+2*-pi^+2^+3),2*(-pi^+8))",1.0),
1000  test_t("equal((-pi^+2^+3*2),2*(-pi^+8))",1.0),
1001  test_t("equal((-pi^+2^+3/+2),(-pi^+8)/+2)",1.0),
1002  test_t("equal((-pi^+2.2^+3.3),(-pi^+13.4894687605338489))",1.0),
1003  test_t("equal((-pi^(2.2^3.3)),(-pi^+13.4894687605338489))",1.0),
1004  test_t("equal((+2.2*-pi^+2.2^+3.3),2.2*(-pi^+13.4894687605338489))",1.0),
1005  test_t("equal((-pi^+2.2^+3.3*2),2*(-pi^+13.4894687605338489))",1.0),
1006  test_t("equal((-pi^+2.2^+3.3/+2.2),(-pi^+13.4894687605338489)/+2.2)",1.0),
1007  test_t("equal((-pi^-2^3),1/(-pi^+8))",1.0),
1008  test_t("equal((-pi^(-2^3)),1/(-pi^+8))",1.0),
1009  test_t("equal((-pi^2^-3),(-pi^(+1/+8)))",1.0),
1010  test_t("equal((-pi^(2^-3)),(-pi^(+1/+8)))",1.0),
1011  test_t("equal((-pi^-2^-3),1/(-pi^(+1/+8)))",1.0),
1012  test_t("equal((-pi^(-2^-3)),1/(-pi^(+1/+8)))",1.0),
1013  test_t("switch { case (1 <= 2) : 1; default: 1.12345; }",1.0),
1014  test_t("switch { case (1 > 2) : 0; case (1 <= 2) : 1; default: 1.12345; }",1.0),
1015  test_t("switch { case (1 <= 2) : switch { case (1 <= 2) : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1016  test_t("switch { case [1 <= 2] : 1; default: 1.12345; }",1.0),
1017  test_t("switch { case [1 > 2] : 0; case [1 <= 2] : 1; default: 1.12345; }",1.0),
1018  test_t("switch { case [1 <= 2] : switch { case [1 <= 2] : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1019  test_t("switch { case {1 <= 2} : 1; default: 1.12345; }",1.0),
1020  test_t("switch { case {1 > 2} : 0; case {1 <= 2} : 1; default: 1.12345; }",1.0),
1021  test_t("switch { case {1 <= 2} : switch { case {1 <= 2} : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1022  test_t("switch { case [(1 <= 2)] : {1}; default: 1.12345; }",1.0),
1023  test_t("switch { case ([1 > 2]) : [0]; case ([1 <= 2]) : 1; default: 1.12345; }",1.0),
1024  test_t("switch { case {(1 <= 2)} : switch { case ({1 <= 2}) : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1025  test_t("switch { case 1 > 1 : 1; case 2 > 2 : 2; case 3 = 3 : 3; case 4 > 4 : 4; default : 5; }",3.0),
1026  test_t("repeat 1.1 + 2.2 until (1 < 2)",3.3),
1027  test_t("repeat (1.1 + 2.2) until (1 < 2)",3.3),
1028  test_t("repeat 1.1 + 2.2; until (1 < 2)",3.3),
1029  test_t("repeat (1.1 + 2.2); until (1 < 2)",3.3),
1030  test_t("repeat 1.1234; 1 < 2; 1.1 + 2.2 until (1 < 2)",3.3),
1031  test_t("repeat 1.1234; 1 < 2; (1.1 + 2.2) until (1 < 2)",3.3),
1032  test_t("repeat 1.1234; 1 < 2; 1.1 + 2.2; until (1 < 2)",3.3),
1033  test_t("repeat 1.1234; 1 < 2; (1.1 + 2.2); until (1 < 2)",3.3),
1034  test_t("[*] { case 1 < 2 : 1 / 2; case (1 < 3) : 2 / 2; case 1 < 4 : 3 / 2; case (1 < 5) : 4 / 2; }",2.0),
1035  test_t(" 0 ? 1 : 2",2.0),
1036  test_t(" 1 ? 3 : 4",3.0),
1037  test_t("(0 ? 1 : 2) == 2",1.0),
1038  test_t("(1 ? 3 : 4) == 3",1.0),
1039  test_t("[(0)] ? [(1)] : [(2)]",2.0),
1040  test_t("([(0)] ? [(1)] : [(2)]) == 2",1.0),
1041  test_t("([(1)] ? [(3)] : [(4)]) == 3",1.0),
1042  test_t("(1 < 2 ? 3 : 4) == 3",1.0),
1043  test_t("(1 > 2 ? 3 : 4) == 4",1.0),
1044  test_t("(1 < 2 ? 3 + 5 : 4) == 8",1.0),
1045  test_t("(1 > 2 ? 3 : 4 + 5) == 9",1.0),
1046  test_t("(2 < 3 + 3 ? 7 : 9) == 7",1.0),
1047  test_t("(1 + 1 < 3 ? 7 : 9) == 7",1.0),
1048  test_t("(1 + 1 < 3 + 3 ? 7 : 9) == 7",1.0),
1049  test_t("(2 > 3 + 3 ? 7 : 9) == 9",1.0),
1050  test_t("(1 + 1 > 3 ? 7 : 9) == 9",1.0),
1051  test_t("(1 + 1 > 3 + 3 ? 7 : 9) == 9",1.0),
1052  test_t("(2 < (3 + 3) ? 7 : 9) == 7",1.0),
1053  test_t("((1 + 1) < 3 ? 7 : 9) == 7",1.0),
1054  test_t("((1 + 1) < (3 + 3) ? 7 : 9) == 7",1.0),
1055  test_t("(min(1,2) ? 1 + 3 : 1 + 4) == 4",1.0),
1056  test_t("(min(0,1) ? 1 + 3 : 1 + 4) == 5",1.0),
1057  test_t("if (1 < 2) 3; == 3",1.0),
1058  test_t("if (1 > 2) 3; == null",1.0),
1059  test_t("if (1 < 2) 3; else 4; == 3",1.0),
1060  test_t("if (1 > 2) 3; else 4; == 4",1.0),
1061  test_t("if (1 < 2) 3; else {1+2; 4;} == 3",1.0),
1062  test_t("if (1 > 2) 3; else {1+2; 4;} == 4",1.0),
1063  test_t("if (1 < 2) 3; else if (1 < 2) 4; == 3",1.0),
1064  test_t("if (1 > 2) 3; else if (1 < 2) 4; == 4",1.0),
1065  test_t("if (1 > 2) 3; else if (1 > 2) 4; == null",1.0),
1066  test_t("if (1 < 2) 3; else if (1 < 2) {1+2; 4;} == 3",1.0),
1067  test_t("if (1 > 2) 3; else if (1 < 2) {1+2; 4;} == 4",1.0),
1068  test_t("if (1 > 2) 3; else if (1 > 2) {1+2; 4;} == null",1.0),
1069  test_t("if (1 < 2) { 1+2; 3;} == 3",1.0),
1070  test_t("if (1 > 2) { 1+2; 3;} == null",1.0),
1071  test_t("if (1 < 2) { 1+2; 3;} else 4; == 3",1.0),
1072  test_t("if (1 > 2) { 1+2; 3;} else 4; == 4",1.0),
1073  test_t("if (1 < 2) { 1+2; 3;} else {1+2; 4;} == 3",1.0),
1074  test_t("if (1 > 2) { 1+2; 3;} else {1+2; 4;} == 4",1.0),
1075  test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) 4; == 3",1.0),
1076  test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) 4; == 4",1.0),
1077  test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) 4; == null",1.0),
1078  test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 3",1.0),
1079  test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 4",1.0),
1080  test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) {1+2; 4;} == null",1.0)
1081  };
1082 
1083 static const std::size_t global_test_list_size = sizeof(global_test_list) / sizeof(test_t);
1084 
1085 template <typename T>
1086 inline bool not_equal_impl(const T& t1,
1087  const T& t2,
1088  const T& epsilon = 0.0000000001/*std::numeric_limits<T>::epsilon()*/)
1089 {
1090  if (t1 != t1) return true;
1091  if (t2 != t2) return true;
1092  T diff = std::abs(t1 - t2);
1093  T eps_norm = (std::max(T(1),std::max(std::abs(t1),std::abs(t2))) * epsilon);
1094  return diff > eps_norm;
1095 }
1096 
1097 template <typename T>
1098 inline bool not_equal(const T& t0, const T& t1,
1099  const T& epsilon = T(0.0000000001))
1100 {
1101  return not_equal_impl(t0,t1,epsilon);
1102 }
1103 
1104 inline bool not_equal(const float& t0, const float& t1, const float& epsilon = 0.000001f)
1105 {
1106  return not_equal_impl(t0,t1,epsilon);
1107 }
1108 
1109 template <typename T>
1110 inline bool test_expression(const std::string& expression_string, const T& expected_result)
1111 {
1112  exprtk::symbol_table<T> symbol_table;
1113  symbol_table.add_constants();
1114 
1115  exprtk::polynomial<T, 1> poly01;
1116  exprtk::polynomial<T, 2> poly02;
1117  exprtk::polynomial<T, 3> poly03;
1118  exprtk::polynomial<T, 4> poly04;
1119  exprtk::polynomial<T, 5> poly05;
1120  exprtk::polynomial<T, 6> poly06;
1121  exprtk::polynomial<T, 7> poly07;
1122  exprtk::polynomial<T, 8> poly08;
1123  exprtk::polynomial<T, 9> poly09;
1124  exprtk::polynomial<T,10> poly10;
1125  exprtk::polynomial<T,11> poly11;
1126  exprtk::polynomial<T,12> poly12;
1127 
1128  symbol_table.add_function("poly01", poly01);
1129  symbol_table.add_function("poly02", poly02);
1130  symbol_table.add_function("poly03", poly03);
1131  symbol_table.add_function("poly04", poly04);
1132  symbol_table.add_function("poly05", poly05);
1133  symbol_table.add_function("poly06", poly06);
1134  symbol_table.add_function("poly07", poly07);
1135  symbol_table.add_function("poly08", poly08);
1136  symbol_table.add_function("poly09", poly09);
1137  symbol_table.add_function("poly10", poly10);
1138  symbol_table.add_function("poly11", poly11);
1139  symbol_table.add_function("poly12", poly12);
1140 
1141  exprtk::expression<T> expression;
1142  expression.register_symbol_table(symbol_table);
1143 
1144  {
1146 
1147  if (!parser.compile(expression_string,expression))
1148  {
1149  printf("test_expression() - Error: %s Expression: %s\n",
1150  parser.error().c_str(),
1151  expression_string.c_str());
1152 
1153  return false;
1154  }
1155  }
1156 
1158  {
1159  printf("test_expression() - Error: Expression did not compile to a constant! Expression: %s\n",
1160  expression_string.c_str());
1161 
1162  return false;
1163  }
1164 
1165  T result = expression.value();
1166 
1167  if (not_equal(result,expected_result))
1168  {
1169  printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1170  expression_string.c_str(),
1171  (double)expected_result,
1172  (double)result);
1173 
1174  return false;
1175  }
1176 
1177  return true;
1178 }
1179 
1180 template <typename T>
1181 inline bool run_test00()
1182 {
1183  const std::size_t rounds = 10;
1184  for (std::size_t r = 0; r < rounds; ++r)
1185  {
1186  bool result = true;
1187  for (std::size_t i = 0; i < global_test_list_size; ++i)
1188  {
1189  if (!test_expression<T>(global_test_list[i].first,T(global_test_list[i].second)))
1190  {
1191  result = false;
1192  }
1193  }
1194 
1195  if (!result)
1196  {
1197  return false;
1198  }
1199  }
1200 
1201  return true;
1202 }
1203 
1204 template <typename T>
1205 struct test_xy
1206 {
1207  test_xy(const std::string& e, const T& v0, const T& v1, const T& r)
1208  : expr(e),
1209  x(v0),
1210  y(v1),
1211  result(r)
1212  {}
1213 
1215  T x;
1216  T y;
1218 };
1219 
1220 template <typename T>
1222 {
1223  test_xyzw(const std::string& e, const T& v0, const T& v1, const T& v2, const T& v3, const T& r)
1224  : expr(e),
1225  x(v0),
1226  y(v1),
1227  z(v2),
1228  w(v3),
1229  result(r)
1230  {}
1231 
1233  T x;
1234  T y;
1235  T z;
1236  T w;
1238 };
1239 
1240 template <typename T>
1241 inline bool run_test01()
1242 {
1243  {
1244  static const test_xy<T> test_list[] =
1245  {
1246  test_xy<T>("x + y" ,T(2.2),T(3.3),T(5.5 )),
1247  test_xy<T>("x - y" ,T(3.3),T(2.2),T(1.1 )),
1248  test_xy<T>("x * y" ,T(3.3),T(2.2),T(7.26 )),
1249  test_xy<T>("x / y" ,T(3.3),T(2.2),T(1.5 )),
1250  test_xy<T>("(x + y) * (x + y)" ,T(2.2),T(3.3),T(30.25)),
1251  test_xy<T>("(x + y) / (x + y)" ,T(2.2),T(3.3),T(1.0 )),
1252  test_xy<T>("x + y > x and x + y > y" ,T(2.2),T(3.3),T(1.0)),
1253  test_xy<T>("1 + (x + y)" ,T(2.2),T(3.3),T(6.5 )),
1254  test_xy<T>("(x + y) - 1" ,T(2.2),T(3.3),T(4.5 )),
1255  test_xy<T>("1 + (x + y) * 2" ,T(2.2),T(3.3),T(12.0 )),
1256  test_xy<T>("2 * (x + y) - 1" ,T(2.2),T(3.3),T(10.0 )),
1257  test_xy<T>("y + (x + 1)" ,T(2.2),T(3.3),T(6.5 )),
1258  test_xy<T>("(x + 1) + y" ,T(2.2),T(3.3),T(6.5 )),
1259  test_xy<T>("2 * x" ,T(2.2),T(0.0),T(4.4)),
1260  test_xy<T>("x * 2" ,T(2.2),T(0.0),T(4.4)),
1261  test_xy<T>("1.1 + x",T(2.2),T(0.0),T(3.3)),
1262  test_xy<T>("x + 1.1",T(2.2),T(0.0),T(3.3)),
1263  test_xy<T>("x * 1 == x" ,T(2.0),T(3.0),T(1.0)),
1264  test_xy<T>("1 * x == x" ,T(2.0),T(3.0),T(1.0)),
1265  test_xy<T>("y * 1 == y" ,T(2.0),T(3.0),T(1.0)),
1266  test_xy<T>("1 * y == y" ,T(2.0),T(3.0),T(1.0)),
1267  test_xy<T>("x * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
1268  test_xy<T>("0 * x == 0" ,T(2.0),T(3.0),T(1.0)),
1269  test_xy<T>("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
1270  test_xy<T>("0 * y == 0" ,T(2.0),T(3.0),T(1.0)),
1271  test_xy<T>("x + 1 == 1 + x",T(2.0),T(3.0),T(1.0)),
1272  test_xy<T>("y + 1 == 1 + y",T(2.0),T(3.0),T(1.0)),
1273  test_xy<T>("x + y == y + x",T(2.0),T(3.0),T(1.0)),
1274  test_xy<T>("x * y == y * x",T(2.0),T(3.0),T(1.0)),
1275  test_xy<T>("x < y" ,T(2.0),T(3.0),T(1.0)),
1276  test_xy<T>("y > x" ,T(2.0),T(3.0),T(1.0)),
1277  test_xy<T>("x <= y" ,T(2.0),T(3.0),T(1.0)),
1278  test_xy<T>("y >= x" ,T(2.0),T(3.0),T(1.0)),
1279  test_xy<T>("x + y > y" ,T(2.0),T(3.0),T(1.0)),
1280  test_xy<T>("x + y > x" ,T(2.0),T(3.0),T(1.0)),
1281  test_xy<T>("x * y > y" ,T(2.0),T(3.0),T(1.0)),
1282  test_xy<T>("x * y > x" ,T(2.0),T(3.0),T(1.0)),
1283  test_xy<T>("(x + y) > y" ,T(2.0),T(3.0),T(1.0)),
1284  test_xy<T>("(x + y) > x" ,T(2.0),T(3.0),T(1.0)),
1285  test_xy<T>("(x * y) > y" ,T(2.0),T(3.0),T(1.0)),
1286  test_xy<T>("(x * y) > x" ,T(2.0),T(3.0),T(1.0)),
1287  test_xy<T>("(2x + 3y) == (2*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
1288  test_xy<T>("2(x + y) == (2*x + 2*y)" ,T(2.0),T(3.0),T(1.0)),
1289  test_xy<T>(" (x + y)3 == (3*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
1290  test_xy<T>("2x + 3y == 2*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
1291  test_xy<T>("2(x + y) == 2*x + 2*y" ,T(2.0),T(3.0),T(1.0)),
1292  test_xy<T>(" (x + y)3 == 3*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
1293  test_xy<T>(" (x)y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1294  test_xy<T>(" x(y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1295  test_xy<T>(" (x) y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1296  test_xy<T>(" x (y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1297  test_xy<T>(" ((x) y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1298  test_xy<T>(" (x (y)) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1299  test_xy<T>(" (x)3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1300  test_xy<T>(" x(3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1301  test_xy<T>(" (x) 3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1302  test_xy<T>(" x (3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1303  test_xy<T>(" ((x) 3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1304  test_xy<T>(" (x (3)) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1305  test_xy<T>(" (2)y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1306  test_xy<T>(" 2(y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1307  test_xy<T>(" (2) y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1308  test_xy<T>(" 2 (y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1309  test_xy<T>(" ((2) y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1310  test_xy<T>(" (2 (y)) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1311  test_xy<T>("var a := 2; (a)(3) == 6" ,T(2.0),T(3.0),T(1.0)),
1312  test_xy<T>("var a := 2; (A){3} == 6" ,T(2.0),T(3.0),T(1.0)),
1313  test_xy<T>("var a := 2; (a)[3] == 6" ,T(2.0),T(3.0),T(1.0)),
1314  test_xy<T>("var a := 2; {a}(3) == 6" ,T(2.0),T(3.0),T(1.0)),
1315  test_xy<T>("var a := 2; {a}{3} == 6" ,T(2.0),T(3.0),T(1.0)),
1316  test_xy<T>("var a := 2; {a}[3] == 6" ,T(2.0),T(3.0),T(1.0)),
1317  test_xy<T>("var a := 2; var b := 3; (a)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1318  test_xy<T>("var a := 2; var b := 3; (a){B} == 6" ,T(2.0),T(3.0),T(1.0)),
1319  test_xy<T>("var a := 2; var b := 3; (a)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1320  test_xy<T>("var a := 2; var b := 3; {a}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1321  test_xy<T>("var a := 2; var b := 3; {a}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
1322  test_xy<T>("var a := 2; var b := 3; {a}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1323  test_xy<T>("var a := 2; (a)(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
1324  test_xy<T>("var a := 2; (a){a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
1325  test_xy<T>("var a := 2; (a)[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
1326  test_xy<T>("var a := 2; {a}(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
1327  test_xy<T>("var a := 2; {a}{a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
1328  test_xy<T>("var a := 2; {a}[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
1329  test_xy<T>("var a := 2; var b := 3; (b-1)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1330  test_xy<T>("var a := 2; var b := 3; (b-1){b} == 6" ,T(2.0),T(3.0),T(1.0)),
1331  test_xy<T>("var a := 2; var b := 3; (b-1)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1332  test_xy<T>("var a := 2; var b := 3; {b-1}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1333  test_xy<T>("var a := 2; var b := 3; {b-1}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
1334  test_xy<T>("var a := 2; var b := 3; {b-1}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1335  test_xy<T>("equal(x^2.2^1.1,17.15193942371376191362)" ,T(3.3),T(0.0),T(1.0)),
1336  test_xy<T>("equal(3.3^x^1.1,17.15193942371376191362)" ,T(2.2),T(0.0),T(1.0)),
1337  test_xy<T>("equal(3.3^2.2^x,17.15193942371376191362)" ,T(1.1),T(0.0),T(1.0)),
1338  test_xy<T>("equal(x^2.2^y,17.15193942371376191362)" ,T(3.3),T(1.1),T(1.0)),
1339  test_xy<T>("equal(x^y^1.1,17.15193942371376191362)" ,T(3.3),T(2.2),T(1.0)),
1340  test_xy<T>("equal(3.3^x^y,17.15193942371376191362)" ,T(2.2),T(1.1),T(1.0)),
1341  test_xy<T>("equal(x+y^3/7,x+(y*y*y)/7)",T(2.0),T(3.0),T(1.0)),
1342  test_xy<T>("equal(1-x^3+y^2*7,1-(x*x*x)+(y*y)*7)",T(2.0),T(3.0),T(1.0)),
1343  test_xy<T>("equal( x^0,1)",T(12.34),T(0.0),T(1.0)),
1344  test_xy<T>("equal( x^1,x)",T(12.34),T(0.0),T(1.0)),
1345  test_xy<T>("equal( x^2,x*x)",T(12.34),T(0.0),T(1.0)),
1346  test_xy<T>("equal( x^3,x*x*x)",T(12.34),T(0.0),T(1.0)),
1347  test_xy<T>("equal( x^4,x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1348  test_xy<T>("equal( x^5,x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1349  test_xy<T>("equal( x^6,x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1350  test_xy<T>("equal( x^7,x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1351  test_xy<T>("equal( x^8,x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1352  test_xy<T>("equal( x^9,x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1353  test_xy<T>("equal(x^10,x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1354  test_xy<T>("equal(x^11,x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1355  test_xy<T>("equal(x^12,x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1356  test_xy<T>("equal(x^13,x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1357  test_xy<T>("equal(x^14,x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1358  test_xy<T>("equal(x^15,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1359  test_xy<T>("equal(x^16,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1360  test_xy<T>("equal(x^17,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1361  test_xy<T>("equal(x^18,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1362  test_xy<T>("equal(x^19,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1363  test_xy<T>("equal(x^20,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1364  test_xy<T>("equal(x^21,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1365  test_xy<T>("equal(x^22,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1366  test_xy<T>("equal(x^23,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1367  test_xy<T>("equal(x^24,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1368  test_xy<T>("equal(x^25,x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1369  test_xy<T>("equal( y^0,1)",T(0.0),T(12.34),T(1.0)),
1370  test_xy<T>("equal( y^1,y)",T(0.0),T(12.34),T(1.0)),
1371  test_xy<T>("equal( y^2,y*y)",T(0.0),T(12.34),T(1.0)),
1372  test_xy<T>("equal( y^3,y*y*y)",T(0.0),T(12.34),T(1.0)),
1373  test_xy<T>("equal( y^4,y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1374  test_xy<T>("equal( y^5,y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1375  test_xy<T>("equal( y^6,y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1376  test_xy<T>("equal( y^7,y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1377  test_xy<T>("equal( y^8,y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1378  test_xy<T>("equal( y^9,y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1379  test_xy<T>("equal(y^10,y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1380  test_xy<T>("equal(y^11,y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1381  test_xy<T>("equal(y^12,y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1382  test_xy<T>("equal(y^13,y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1383  test_xy<T>("equal(y^14,y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1384  test_xy<T>("equal(y^15,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1385  test_xy<T>("equal(y^16,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1386  test_xy<T>("equal(y^17,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1387  test_xy<T>("equal(y^18,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1388  test_xy<T>("equal(y^19,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1389  test_xy<T>("equal(y^20,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1390  test_xy<T>("equal(y^21,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1391  test_xy<T>("equal(y^22,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1392  test_xy<T>("equal(y^23,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1393  test_xy<T>("equal(y^24,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1394  test_xy<T>("equal(y^25,y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1395  test_xy<T>("equal( x^-0,1/1)",T(12.34),T(0.0),T(1.0)),
1396  test_xy<T>("equal( x^-1,1/(x))",T(12.34),T(0.0),T(1.0)),
1397  test_xy<T>("equal( x^-2,1/(x*x))",T(12.34),T(0.0),T(1.0)),
1398  test_xy<T>("equal( x^-3,1/(x*x*x))",T(12.34),T(0.0),T(1.0)),
1399  test_xy<T>("equal( x^-4,1/(x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1400  test_xy<T>("equal( x^-5,1/(x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1401  test_xy<T>("equal( x^-6,1/(x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1402  test_xy<T>("equal( x^-7,1/(x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1403  test_xy<T>("equal( x^-8,1/(x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1404  test_xy<T>("equal( x^-9,1/(x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1405  test_xy<T>("equal(x^-10,1/(x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1406  test_xy<T>("equal(x^-11,1/(x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1407  test_xy<T>("equal(x^-12,1/(x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1408  test_xy<T>("equal(x^-13,1/(x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1409  test_xy<T>("equal(x^-14,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1410  test_xy<T>("equal(x^-15,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1411  test_xy<T>("equal(x^-16,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1412  test_xy<T>("equal(x^-17,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1413  test_xy<T>("equal(x^-18,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1414  test_xy<T>("equal(x^-19,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1415  test_xy<T>("equal(x^-20,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1416  test_xy<T>("equal(x^-21,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1417  test_xy<T>("equal(x^-22,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1418  test_xy<T>("equal(x^-23,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1419  test_xy<T>("equal(x^-24,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1420  test_xy<T>("equal(x^-25,1/(x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1421  test_xy<T>("equal( y^-0,1/1)",T(0.0),T(12.34),T(1.0)),
1422  test_xy<T>("equal( y^-1,1/(y))",T(0.0),T(12.34),T(1.0)),
1423  test_xy<T>("equal( y^-2,1/(y*y))",T(0.0),T(12.34),T(1.0)),
1424  test_xy<T>("equal( y^-3,1/(y*y*y))",T(0.0),T(12.34),T(1.0)),
1425  test_xy<T>("equal( y^-4,1/(y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1426  test_xy<T>("equal( y^-5,1/(y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1427  test_xy<T>("equal( y^-6,1/(y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1428  test_xy<T>("equal( y^-7,1/(y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1429  test_xy<T>("equal( y^-8,1/(y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1430  test_xy<T>("equal( y^-9,1/(y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1431  test_xy<T>("equal(y^-10,1/(y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1432  test_xy<T>("equal(y^-11,1/(y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1433  test_xy<T>("equal(y^-12,1/(y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1434  test_xy<T>("equal(y^-13,1/(y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1435  test_xy<T>("equal(y^-14,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1436  test_xy<T>("equal(y^-15,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1437  test_xy<T>("equal(y^-16,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1438  test_xy<T>("equal(y^-17,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1439  test_xy<T>("equal(y^-18,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1440  test_xy<T>("equal(y^-19,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1441  test_xy<T>("equal(y^-20,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1442  test_xy<T>("equal(y^-21,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1443  test_xy<T>("equal(y^-22,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1444  test_xy<T>("equal(y^-23,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1445  test_xy<T>("equal(y^-24,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1446  test_xy<T>("equal(y^-25,1/(y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1447  test_xy<T>("(2 + x) + 7",T(3.0),T(0.0),T((2.0 + 3.0) + 7.0)),
1448  test_xy<T>("(2 + x) - 7",T(3.0),T(0.0),T((2.0 + 3.0) - 7.0)),
1449  test_xy<T>("(2 - x) + 7",T(3.0),T(0.0),T((2.0 - 3.0) + 7.0)),
1450  test_xy<T>("(2 - x) - 7",T(3.0),T(0.0),T((2.0 - 3.0) - 7.0)),
1451  test_xy<T>("(2 * x) * 7",T(3.0),T(0.0),T((2.0 * 3.0) * 7.0)),
1452  test_xy<T>("(2 * x) / 7",T(3.0),T(0.0),T((2.0 * 3.0) / 7.0)),
1453  test_xy<T>("(2 / x) * 7",T(3.0),T(0.0),T((2.0 / 3.0) * 7.0)),
1454  test_xy<T>("(2 / x) / 7",T(3.0),T(0.0),T((2.0 / 3.0) / 7.0)),
1455  test_xy<T>("2 + (x + 7)",T(3.0),T(0.0),T(2.0 + (3.0 + 7.0))),
1456  test_xy<T>("2 + (x - 7)",T(3.0),T(0.0),T(2.0 + (3.0 - 7.0))),
1457  test_xy<T>("2 - (x + 7)",T(3.0),T(0.0),T(2.0 - (3.0 + 7.0))),
1458  test_xy<T>("2 - (x - 7)",T(3.0),T(0.0),T(2.0 - (3.0 - 7.0))),
1459  test_xy<T>("2 * (x * 7)",T(3.0),T(0.0),T(2.0 * (3.0 * 7.0))),
1460  test_xy<T>("2 * (x / 7)",T(3.0),T(0.0),T(2.0 * (3.0 / 7.0))),
1461  test_xy<T>("2 / (x * 7)",T(3.0),T(0.0),T(2.0 / (3.0 * 7.0))),
1462  test_xy<T>("2 / (x / 7)",T(3.0),T(0.0),T(2.0 / (3.0 / 7.0))),
1463  test_xy<T>("2 + (7 + x)",T(3.0),T(0.0),T(2.0 + (7.0 + 3.0))),
1464  test_xy<T>("2 + (7 - x)",T(3.0),T(0.0),T(2.0 + (7.0 - 3.0))),
1465  test_xy<T>("2 - (7 + x)",T(3.0),T(0.0),T(2.0 - (7.0 + 3.0))),
1466  test_xy<T>("2 - (7 - x)",T(3.0),T(0.0),T(2.0 - (7.0 - 3.0))),
1467  test_xy<T>("2 * (7 * x)",T(3.0),T(0.0),T(2.0 * (7.0 * 3.0))),
1468  test_xy<T>("2 * (7 / x)",T(3.0),T(0.0),T(2.0 * (7.0 / 3.0))),
1469  test_xy<T>("2 / (7 * x)",T(3.0),T(0.0),T(2.0 / (7.0 * 3.0))),
1470  test_xy<T>("2 / (7 / x)",T(3.0),T(0.0),T(2.0 / (7.0 / 3.0))),
1471  test_xy<T>("(x + 2) + 7",T(3.0),T(0.0),T((3.0 + 2.0) + 7.0)),
1472  test_xy<T>("(x + 2) - 7",T(3.0),T(0.0),T((3.0 + 2.0) - 7.0)),
1473  test_xy<T>("(x - 2) + 7",T(3.0),T(0.0),T((3.0 - 2.0) + 7.0)),
1474  test_xy<T>("(x - 2) - 7",T(3.0),T(0.0),T((3.0 - 2.0) - 7.0)),
1475  test_xy<T>("(x * 2) * 7",T(3.0),T(0.0),T((3.0 * 2.0) * 7.0)),
1476  test_xy<T>("(x * 2) / 7",T(3.0),T(0.0),T((3.0 * 2.0) / 7.0)),
1477  test_xy<T>("(x / 2) * 7",T(3.0),T(0.0),T((3.0 / 2.0) * 7.0)),
1478  test_xy<T>("(x / 2) / 7",T(3.0),T(0.0),T((3.0 / 2.0) / 7.0)),
1479  test_xy<T>("((2 + x) + (3 + y))",T(7.0),T(9.0),T(((2.0 + 7.0) + (3.0 + 9.0)))),
1480  test_xy<T>("((2 + x) - (3 + y))",T(7.0),T(9.0),T(((2.0 + 7.0) - (3.0 + 9.0)))),
1481  test_xy<T>("((2 - x) - (3 - y))",T(7.0),T(9.0),T(((2.0 - 7.0) - (3.0 - 9.0)))),
1482  test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1483  test_xy<T>("((x + 2) + (y + 3))",T(7.0),T(9.0),T(((7.0 + 2.0) + (9.0 + 3.0)))),
1484  test_xy<T>("((x + 2) - (y + 3))",T(7.0),T(9.0),T(((7.0 + 2.0) - (9.0 + 3.0)))),
1485  test_xy<T>("((x - 2) - (y - 3))",T(7.0),T(9.0),T(((7.0 - 2.0) - (9.0 - 3.0)))),
1486  test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1487  test_xy<T>("((2 + x) + (y + 3))",T(7.0),T(9.0),T(((2.0 + 7.0) + (9.0 + 3.0)))),
1488  test_xy<T>("((2 + x) - (y + 3))",T(7.0),T(9.0),T(((2.0 + 7.0) - (9.0 + 3.0)))),
1489  test_xy<T>("((2 - x) - (y - 3))",T(7.0),T(9.0),T(((2.0 - 7.0) - (9.0 - 3.0)))),
1490  test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1491  test_xy<T>("((x + 2) + (3 + y))",T(7.0),T(9.0),T(((7.0 + 2.0) + (3.0 + 9.0)))),
1492  test_xy<T>("((x + 2) - (3 + y))",T(7.0),T(9.0),T(((7.0 + 2.0) - (3.0 + 9.0)))),
1493  test_xy<T>("((x - 2) - (3 - y))",T(7.0),T(9.0),T(((7.0 - 2.0) - (3.0 - 9.0)))),
1494  test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1495  test_xy<T>("((2 * x) / (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) / (3.0 * 9.0)))),
1496  test_xy<T>("((2 / x) * (3 / y))",T(7.0),T(9.0),T(((2.0 / 7.0) * (3.0 / 9.0)))),
1497  test_xy<T>("((2 * x) / (3 / y))",T(7.0),T(9.0),T(((2.0 * 7.0) / (3.0 / 9.0)))),
1498  test_xy<T>("((2 / x) / (3 * y))",T(7.0),T(9.0),T(((2.0 / 7.0) / (3.0 * 9.0)))),
1499  test_xy<T>("((x * 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 * 2.0) / (9.0 * 3.0)))),
1500  test_xy<T>("((x / 2) * (y / 3))",T(7.0),T(9.0),T(((7.0 / 2.0) * (9.0 / 3.0)))),
1501  test_xy<T>("((x * 2) / (y / 3))",T(7.0),T(9.0),T(((7.0 * 2.0) / (9.0 / 3.0)))),
1502  test_xy<T>("((x / 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 / 2.0) / (9.0 * 3.0)))),
1503  test_xy<T>("((2 * x) / (y * 3))",T(7.0),T(9.0),T(((2.0 * 7.0) / (9.0 * 3.0)))),
1504  test_xy<T>("((2 / x) * (y / 3))",T(7.0),T(9.0),T(((2.0 / 7.0) * (9.0 / 3.0)))),
1505  test_xy<T>("((2 * x) / (y / 3))",T(7.0),T(9.0),T(((2.0 * 7.0) / (9.0 / 3.0)))),
1506  test_xy<T>("((2 / x) / (y * 3))",T(7.0),T(9.0),T(((2.0 / 7.0) / (9.0 * 3.0)))),
1507  test_xy<T>("((x * 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 * 2.0) / (3.0 * 9.0)))),
1508  test_xy<T>("((x / 2) * (3 / y))",T(7.0),T(9.0),T(((7.0 / 2.0) * (3.0 / 9.0)))),
1509  test_xy<T>("((x * 2) / (3 / y))",T(7.0),T(9.0),T(((7.0 * 2.0) / (3.0 / 9.0)))),
1510  test_xy<T>("((x / 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 / 2.0) / (3.0 * 9.0)))),
1511  test_xy<T>("([(min(x,8) + y) + 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) - 4.0))),
1512  test_xy<T>("([(min(x,8) + y) + 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) + 4.0))),
1513  test_xy<T>("([(min(x,8) + y) + 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) * 4.0))),
1514  test_xy<T>("([(min(x,8) + y) + 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) + 3.0) / 4.0))),
1515  test_xy<T>("([(min(x,8) + y) - 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) - 4.0))),
1516  test_xy<T>("([(min(x,8) + y) - 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) + 4.0))),
1517  test_xy<T>("([(min(x,8) + y) - 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) * 4.0))),
1518  test_xy<T>("([(min(x,8) + y) - 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) - 3.0) / 4.0))),
1519  test_xy<T>("([(min(x,8) + y) * 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) - 4.0))),
1520  test_xy<T>("([(min(x,8) + y) * 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) + 4.0))),
1521  test_xy<T>("([(min(x,8) + y) * 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) * 4.0))),
1522  test_xy<T>("([(min(x,8) + y) * 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) * 3.0) / 4.0))),
1523  test_xy<T>("([(min(x,8) + y) / 3] - 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) - 4.0))),
1524  test_xy<T>("([(min(x,8) + y) / 3] + 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) + 4.0))),
1525  test_xy<T>("([(min(x,8) + y) / 3] * 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) * 4.0))),
1526  test_xy<T>("([(min(x,8) + y) / 3] / 4)",T(7.0),T(9.0),T((((std::min(7.0,8.0) + 9.0) / 3.0) / 4.0))),
1527  test_xy<T>("(4 - [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 + (std::min(7.0,8.0) + 9.0))))),
1528  test_xy<T>("(4 + [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 + (std::min(7.0,8.0) + 9.0))))),
1529  test_xy<T>("(4 * [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 + (std::min(7.0,8.0) + 9.0))))),
1530  test_xy<T>("(4 / [3 + (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 + (std::min(7.0,8.0) + 9.0))))),
1531  test_xy<T>("(4 - [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 - (std::min(7.0,8.0) + 9.0))))),
1532  test_xy<T>("(4 + [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 - (std::min(7.0,8.0) + 9.0))))),
1533  test_xy<T>("(4 * [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 - (std::min(7.0,8.0) + 9.0))))),
1534  test_xy<T>("(4 / [3 - (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 - (std::min(7.0,8.0) + 9.0))))),
1535  test_xy<T>("(4 - [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 * (std::min(7.0,8.0) + 9.0))))),
1536  test_xy<T>("(4 + [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 * (std::min(7.0,8.0) + 9.0))))),
1537  test_xy<T>("(4 * [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 * (std::min(7.0,8.0) + 9.0))))),
1538  test_xy<T>("(4 / [3 * (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 * (std::min(7.0,8.0) + 9.0))))),
1539  test_xy<T>("(4 - [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 - (3.0 / (std::min(7.0,8.0) + 9.0))))),
1540  test_xy<T>("(4 + [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 + (3.0 / (std::min(7.0,8.0) + 9.0))))),
1541  test_xy<T>("(4 * [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 * (3.0 / (std::min(7.0,8.0) + 9.0))))),
1542  test_xy<T>("(4 / [3 / (min(x,8) + y)])",T(7.0),T(9.0),T((4.0 / (3.0 / (std::min(7.0,8.0) + 9.0))))),
1543  test_xy<T>("((2 * x) + (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) + (2.0 * 9.0)))),
1544  test_xy<T>("((2 * x) - (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) - (2.0 * 9.0)))),
1545  test_xy<T>("((2 * x) + (y * 2))",T(7.0),T(9.0),T(((2.0 * 7.0) + (9.0 * 2.0)))),
1546  test_xy<T>("((x * 2) - (y * 2))",T(7.0),T(9.0),T(((7.0 * 2.0) - (9.0 * 2.0)))),
1547  test_xy<T>("0 * (abs (x) + acos (y) + asin (x) + atan (y))",T(1.0),T(1.0),T(0.0)),
1548  test_xy<T>("0 * (ceil (x) + cos (y) + cosh (x) + exp (y))",T(1.0),T(1.0),T(0.0)),
1549  test_xy<T>("0 * (floor(x) + log (y) + log10(x) + round(y))",T(1.0),T(1.0),T(0.0)),
1550  test_xy<T>("0 * (sin (x) + sinh (y) + sqrt (x) + tan (y))",T(1.0),T(1.0),T(0.0)),
1551  test_xy<T>("0 * (sec (x) + csc (y) + tanh (x) + cot (y))",T(1.0),T(1.0),T(0.0)),
1552  test_xy<T>("0 * (erf (x) + erfc (y) + sgn (y) + frac (y))",T(1.0),T(1.0),T(0.0)),
1553  test_xy<T>("0 * (log1p(x) + expm1(y) + acosh(x) + asinh(y))",T(1.0),T(1.0),T(0.0)),
1554  test_xy<T>("0 * (deg2grad(x) + grad2deg(y) + rad2deg(x) + deg2rad(y))",T(1.0),T(1.0),T(0.0)),
1555  test_xy<T>("switch { case (x <= y) : (y - x); default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1556  test_xy<T>("switch { case (x > y) : 0; case (x <= y) : (y - x); default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1557  test_xy<T>("switch { case (x <= y) : switch { case (x <= y) : (y - x); default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1558  test_xy<T>("switch { case [x <= y] : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1559  test_xy<T>("switch { case [x > y] : 0; case [x <= y] : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1560  test_xy<T>("switch { case [x <= y] : switch { case [x <= y] : {y - x}; default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1561  test_xy<T>("switch { case {x <= y} : x; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1562  test_xy<T>("switch { case {x > y} : 0; case {x <= y} : {y - x}; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1563  test_xy<T>("switch { case {x <= y} : switch { case {x <= y} : x; default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1564  test_xy<T>("switch { case [(x <= y)] : {y - x}; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1565  test_xy<T>("switch { case ([x > y]) : [0]; case ([x <= y]) : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1566  test_xy<T>("switch { case {(x <= y)} : switch { case ({x <= y}) : x; default: 1.12345; }; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1567  test_xy<T>("[*]{ case x < y : x + y; case y < x : y - x; }",T(2.0),T(3.0),T(5.0)),
1568  test_xy<T>("[*]{ case x > y : x + y; case y > x : y - x; }",T(2.0),T(3.0),T(1.0)),
1569  test_xy<T>("[*]{ case x > y : x - y; case y < x : y + x; }",T(2.0),T(3.0),T(0.0)),
1570  test_xy<T>("0 ? x : y" ,T(1.0),T(2.0),T( 2.0)),
1571  test_xy<T>("1 ? x : y" ,T(1.0),T(2.0),T( 1.0)),
1572  test_xy<T>("x ? x : y" ,T(1.0),T(2.0),T( 1.0)),
1573  test_xy<T>("x ? x : y" ,T(0.0),T(2.0),T( 2.0)),
1574  test_xy<T>("(x + y < 4) ? 1 : 2" ,T(1.0),T(2.0),T( 1.0)),
1575  test_xy<T>("(x + y > 4) ? 1 : 2" ,T(1.0),T(2.0),T( 2.0)),
1576  test_xy<T>("x < y ? x + y : x - y" ,T(1.0),T(2.0),T( 3.0)),
1577  test_xy<T>("x > y ? x + y : x - y" ,T(1.0),T(2.0),T(-1.0)),
1578  test_xy<T>("(x + x < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1579  test_xy<T>("(x + x < y + y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1580  test_xy<T>("(x > y + y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1581  test_xy<T>("(x + x > y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1582  test_xy<T>("(x + x > y + 3 ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1583  test_xy<T>("(x < (y + y) ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1584  test_xy<T>("((x + x) < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1585  test_xy<T>("((x + x) < (y + y) ? 7 : 9) == 7",T(1.0),T(3.0),T( 1.0)),
1586  test_xy<T>("(x += 2 ) == 3 " ,T(1),T(3),T(1)),
1587  test_xy<T>("(x += 2y) == 7 " ,T(1),T(3),T(1)),
1588  test_xy<T>("(x -= 2 ) == -1 " ,T(1),T(3),T(1)),
1589  test_xy<T>("(x -= 2y) == -5 " ,T(1),T(3),T(1)),
1590  test_xy<T>("(x *= 2 ) == 2 " ,T(1),T(3),T(1)),
1591  test_xy<T>("(x *= 2y) == 6 " ,T(1),T(3),T(1)),
1592  test_xy<T>("(x /= 2 ) == (1/2)" ,T(1),T(3),T(1)),
1593  test_xy<T>("(x /= 2y) == (1/6)" ,T(1),T(3),T(1)),
1594  test_xy<T>("for(var i := 0; (i < 10);) { i += 1; }; x;" ,T(1),T(20),T( 1)),
1595  test_xy<T>("for(var i := 0; (i < 10) and (i != y); i+=2) { x += i; }; x;" ,T(1),T(20),T(21)),
1596  test_xy<T>("for(var i := 0; (i < 10) and (i != y);) { x += i; i+=2; }; x;",T(1),T(20),T(21)),
1597  test_xy<T>("for(var i := 0; (i < y); i += 1) { if (i <= (y / 2)) x += i; else break; }; x;" ,T(0),T(10),T(15)),
1598  test_xy<T>("for(var i := 0; (i < y); i += 1) { if (i <= (y / 2)) continue; else x += i; }; x;" ,T(0),T(10),T(30)),
1599  test_xy<T>("var a := 2; (0 * a) == 0",T(0),T(0),T(1)),
1600  test_xy<T>("var a := 2; (0 / a) == 0",T(0),T(0),T(1)),
1601  test_xy<T>("var a := 2; (a * 0) == 0",T(0),T(0),T(1)),
1602  test_xy<T>("var a := 2; (a / 1) == a",T(0),T(0),T(1)),
1603  test_xy<T>("var a := 2; (0 + a) == a",T(0),T(0),T(1)),
1604  test_xy<T>("var a := 2; (a + 0) == a",T(0),T(0),T(1)),
1605  test_xy<T>("var a := 2; (1 * a) == a",T(0),T(0),T(1)),
1606  test_xy<T>("var a.b := 3; (2 * a.b ) == 6",T(0),T(0),T(1)),
1607  test_xy<T>("var aa.bb := 3; (2 * aa.bb ) == 6",T(0),T(0),T(1)),
1608  test_xy<T>("var aaa.bbb := 3; (2 * aAa.BbB) == 6",T(0),T(0),T(1)),
1609  test_xy<T>("var a1.b2 := 3; (2 * a1.b2 ) == 6",T(0),T(0),T(1))
1610  };
1611 
1612  static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xy<T>);
1613 
1614  const std::size_t rounds = 60;
1615 
1616  for (std::size_t r = 0; r < rounds; ++r)
1617  {
1618  bool loop_result = true;
1619 
1620  for (std::size_t i = 0; i < test_list_size; ++i)
1621  {
1622  test_xy<T>& test = const_cast<test_xy<T>&>(test_list[i]);
1623 
1624  T x = test.x;
1625  T y = test.y;
1626 
1627  exprtk::symbol_table<T> symbol_table;
1628  symbol_table.add_variable("x",x);
1629  symbol_table.add_variable("y",y);
1630 
1631  exprtk::expression<T> expression;
1632  expression.register_symbol_table(symbol_table);
1633 
1634  {
1636 
1637  if (!parser.compile(test.expr,expression))
1638  {
1639  printf("run_test01() - Error: %s Expression: %s\n",
1640  parser.error().c_str(),
1641  test.expr.c_str());
1642 
1643  loop_result = false;
1644 
1645  continue;
1646  }
1647  }
1648 
1649  T result = expression.value();
1650 
1651  if (not_equal(result,test.result))
1652  {
1653  printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1654  test.expr.c_str(),
1655  (double)test.result,
1656  (double)result);
1657 
1658  loop_result = false;
1659  }
1660  }
1661 
1662  if (!loop_result)
1663  {
1664  return false;
1665  }
1666  }
1667  }
1668 
1669  {
1670  static const test_xyzw<T> test_list[] =
1671  {
1672  test_xyzw<T>("((x / y) / z )",T(7.0),T(9.0),T(3.0),T(0.0),T(((7.0 / 9.0) / 3.0 ))),
1673  test_xyzw<T>("((x / y) / 2 )",T(7.0),T(9.0),T(3.0),T(0.0),T(((7.0 / 9.0) / 2.0 ))),
1674  test_xyzw<T>("((x / 2) / y )",T(7.0),T(9.0),T(3.0),T(0.0),T(((7.0 / 2.0) / 9.0 ))),
1675  test_xyzw<T>("((2 / x) / y )",T(7.0),T(9.0),T(3.0),T(0.0),T(((2.0 / 7.0) / 9.0 ))),
1676  test_xyzw<T>("( x / (y / z))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 7.0 / (9.0 / 3.0)))),
1677  test_xyzw<T>("( x / (y / 2))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 7.0 / (9.0 / 2.0)))),
1678  test_xyzw<T>("( x / (2 / y))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 7.0 / (2.0 / 9.0)))),
1679  test_xyzw<T>("( 2 / (x / y))",T(7.0),T(9.0),T(3.0),T(0.0),T(( 2.0 / (7.0 / 9.0)))),
1680  test_xyzw<T>("([(min(x,y) + z) + 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) - 4.0))),
1681  test_xyzw<T>("([(min(x,y) + z) + 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) + 4.0))),
1682  test_xyzw<T>("([(min(x,y) + z) + 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) * 4.0))),
1683  test_xyzw<T>("([(min(x,y) + z) + 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) + 3.0) / 4.0))),
1684  test_xyzw<T>("([(min(x,y) + z) - 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) - 4.0))),
1685  test_xyzw<T>("([(min(x,y) + z) - 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) + 4.0))),
1686  test_xyzw<T>("([(min(x,y) + z) - 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) * 4.0))),
1687  test_xyzw<T>("([(min(x,y) + z) - 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) - 3.0) / 4.0))),
1688  test_xyzw<T>("([(min(x,y) + z) * 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) - 4.0))),
1689  test_xyzw<T>("([(min(x,y) + z) * 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) + 4.0))),
1690  test_xyzw<T>("([(min(x,y) + z) * 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) * 4.0))),
1691  test_xyzw<T>("([(min(x,y) + z) * 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) * 3.0) / 4.0))),
1692  test_xyzw<T>("([(min(x,y) + z) / 3] - 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) - 4.0))),
1693  test_xyzw<T>("([(min(x,y) + z) / 3] + 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) + 4.0))),
1694  test_xyzw<T>("([(min(x,y) + z) / 3] * 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) * 4.0))),
1695  test_xyzw<T>("([(min(x,y) + z) / 3] / 4)",T(5.0),T(7.0),T(9.0),T(0.0),T((((std::min(5.0,7.0) + 9.0) / 3.0) / 4.0))),
1696  test_xyzw<T>("(4 - [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 + (std::min(5.0,7.0) + 9.0))))),
1697  test_xyzw<T>("(4 + [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 + (std::min(5.0,7.0) + 9.0))))),
1698  test_xyzw<T>("(4 * [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 + (std::min(5.0,7.0) + 9.0))))),
1699  test_xyzw<T>("(4 / [3 + (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 + (std::min(5.0,7.0) + 9.0))))),
1700  test_xyzw<T>("(4 - [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 - (std::min(5.0,7.0) + 9.0))))),
1701  test_xyzw<T>("(4 + [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 - (std::min(5.0,7.0) + 9.0))))),
1702  test_xyzw<T>("(4 * [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 - (std::min(5.0,7.0) + 9.0))))),
1703  test_xyzw<T>("(4 / [3 - (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 - (std::min(5.0,7.0) + 9.0))))),
1704  test_xyzw<T>("(4 - [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 * (std::min(5.0,7.0) + 9.0))))),
1705  test_xyzw<T>("(4 + [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 * (std::min(5.0,7.0) + 9.0))))),
1706  test_xyzw<T>("(4 * [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 * (std::min(5.0,7.0) + 9.0))))),
1707  test_xyzw<T>("(4 / [3 * (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 * (std::min(5.0,7.0) + 9.0))))),
1708  test_xyzw<T>("(4 - [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 - (3.0 / (std::min(5.0,7.0) + 9.0))))),
1709  test_xyzw<T>("(4 + [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 + (3.0 / (std::min(5.0,7.0) + 9.0))))),
1710  test_xyzw<T>("(4 * [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 * (3.0 / (std::min(5.0,7.0) + 9.0))))),
1711  test_xyzw<T>("(4 / [3 / (min(x,y) + z)])",T(5.0),T(7.0),T(9.0),T(0.0),T((4.0 / (3.0 / (std::min(5.0,7.0) + 9.0))))),
1712  test_xyzw<T>("if (x < y) { z+2; z;} == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1713  test_xyzw<T>("if (x > y) { z+2; z;} == null" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1714  test_xyzw<T>("if (x < y) { z+2; z;} else w; == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1715  test_xyzw<T>("if (x > y) { z+2; z;} else 1 + w; == (w + 1)" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1716  test_xyzw<T>("if (x < y) { z+2; z;} else {1+2; w;} == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1717  test_xyzw<T>("if (x > y) { z+2; z;} else {1+2; w;} == w" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1718  test_xyzw<T>("if (x < y) { z+2; z;} else if (x < y) w; == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1719  test_xyzw<T>("if (x > y) { z+2; z;} else if (x < y) 1 + w; == w + 1" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1720  test_xyzw<T>("if (x > y) { z+2; z;} else if (x > y) w; == null" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1721  test_xyzw<T>("if (x < y) { z+2; z;} else if (x < y) {w+2; w;} == z" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1722  test_xyzw<T>("if (x > y) { z+2; z;} else if (x < y) {w+2; w;} == w" ,T(1.0),T(2.0),T(3.0),T(4.0),T(1.0)),
1723  test_xyzw<T>("if (x > y) { z+2; z;} else if (x > y) {w+2; w;} == null",T(1.0),T(2.0),T(3.0),T(4.0),T(1.0))
1724  };
1725 
1726  static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xyzw<T>);
1727 
1728  const std::size_t rounds = 60;
1729 
1730  for (std::size_t r = 0; r < rounds; ++r)
1731  {
1732  bool loop_result = true;
1733  for (std::size_t i = 0; i < test_list_size; ++i)
1734  {
1735  test_xyzw<T>& test = const_cast<test_xyzw<T>&>(test_list[i]);
1736 
1737  exprtk::symbol_table<T> symbol_table;
1738  symbol_table.add_variable("x",test.x);
1739  symbol_table.add_variable("y",test.y);
1740  symbol_table.add_variable("z",test.z);
1741  symbol_table.add_variable("w",test.w);
1742 
1743  exprtk::expression<T> expression;
1744  expression.register_symbol_table(symbol_table);
1745 
1746  {
1748 
1749  if (!parser.compile(test.expr,expression))
1750  {
1751  printf("run_test01() - Error: %s Expression: %s\n",
1752  parser.error().c_str(),
1753  test.expr.c_str());
1754 
1755  loop_result = false;
1756 
1757  continue;
1758  }
1759  }
1760 
1761  T result = expression.value();
1762 
1763  if (not_equal(result,test.result))
1764  {
1765  printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1766  test.expr.c_str(),
1767  (double)test.result,
1768  (double)result);
1769 
1770  loop_result = false;
1771  }
1772  }
1773 
1774  if (!loop_result)
1775  {
1776  return false;
1777  }
1778  }
1779  }
1780 
1781  {
1782  const std::string expr_list[] =
1783  {
1784  "((v[1] + x) == (x + v[1]))",
1785  "((v[0] += x) == x)",
1786  "((v[0] += x + y) == (x + y))",
1787  "((v[0] -= x) == -x)",
1788  "((v[0] -= (x + y)) == -(x + y))",
1789  "((v[1] + v[2]) == (v[3 - 1] + v[2 * 1/2]))",
1790  "(v[v[1]] == v[1])",
1791  "(v[1] += v[1]) == v[1 + 1]",
1792  "((v[i[1]] + x) == (x + v[i[1]]))",
1793  "((v[i[0]] += x) == x)",
1794  "((v[i[0]] += x + y) == (x + y))",
1795  "((v[i[0]] -= x) == -x)",
1796  "((v[i[0]] -= (x + y)) == -(x + y))",
1797  "((v[i[1]] + v[2]) == (v[i[3] - i[1]] + v[i[2] * 1/2]))",
1798  "(v[v[i[1]]] == v[i[1]])",
1799  "(v[i[1]] += v[i[1]]) == v[i[1] + 1]"
1800  };
1801 
1802  const std::size_t expr_list_size = sizeof(expr_list) / sizeof(std::string);
1803 
1804  const std::size_t rounds = 60;
1805 
1806  for (std::size_t r = 0; r < rounds; ++r)
1807  {
1808  bool loop_result = true;
1809 
1810  for (std::size_t i = 0; i < expr_list_size; ++i)
1811  {
1812  T v[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
1813  T index[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
1814 
1815  T x = T(6.6);
1816  T y = T(7.7);
1817  T z = T(8.8);
1818 
1819  exprtk::symbol_table<T> symbol_table;
1820  symbol_table.add_variable("x",x);
1821  symbol_table.add_variable("y",y);
1822  symbol_table.add_variable("z",z);
1823  symbol_table.add_vector ("v",v);
1824  symbol_table.add_vector ("i",index);
1825 
1826  exprtk::expression<T> expression;
1827  expression.register_symbol_table(symbol_table);
1828 
1829  {
1831 
1832  if (!parser.compile(expr_list[i],expression))
1833  {
1834  printf("run_test01() - Error: %s Expression: %s\n",
1835  parser.error().c_str(),
1836  expr_list[i].c_str());
1837 
1838  loop_result = false;
1839 
1840  continue;
1841  }
1842  }
1843 
1844  T result = expression.value();
1845 
1846  if (not_equal(result,T(1)))
1847  {
1848  printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1849  expr_list[i].c_str(),
1850  (double)1.0,
1851  (double)result);
1852 
1853  loop_result = false;
1854  }
1855  }
1856 
1857  if (!loop_result)
1858  {
1859  return false;
1860  }
1861  }
1862 
1863  for (std::size_t r = 0; r < rounds; ++r)
1864  {
1865  bool loop_result = true;
1866 
1867  for (std::size_t i = 0; i < expr_list_size; ++i)
1868  {
1869  T v_[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
1870  T index_[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
1871 
1872  T x = T(6.6);
1873  T y = T(7.7);
1874  T z = T(8.8);
1875 
1878 
1879  exprtk::symbol_table<T> symbol_table;
1880  symbol_table.add_variable("x",x);
1881  symbol_table.add_variable("y",y);
1882  symbol_table.add_variable("z",z);
1883  symbol_table.add_vector ("v",v);
1884  symbol_table.add_vector ("i",index);
1885 
1886  exprtk::expression<T> expression;
1887  expression.register_symbol_table(symbol_table);
1888 
1889  {
1891 
1892  if (!parser.compile(expr_list[i],expression))
1893  {
1894  printf("run_test01() - Error: %s Expression: %s\n",
1895  parser.error().c_str(),
1896  expr_list[i].c_str());
1897 
1898  loop_result = false;
1899 
1900  continue;
1901  }
1902  }
1903 
1904  T result = expression.value();
1905 
1906  if (not_equal(result,T(1)))
1907  {
1908  printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1909  expr_list[i].c_str(),
1910  (double)1.0,
1911  (double)result);
1912  loop_result = false;
1913  }
1914  }
1915 
1916  if (!loop_result)
1917  {
1918  return false;
1919  }
1920  }
1921  }
1922 
1923  return true;
1924 }
1925 
1926 template <typename T>
1927 struct test_ab
1928 {
1929  test_ab(const std::string& e, const std::string& v0, const std::string& v1, const T& r)
1930  : expr(e),
1931  a(v0),
1932  b(v1),
1933  c("ccc"),
1934  result(r)
1935  {}
1936 
1942 };
1943 
1944 template <typename T>
1945 inline bool run_test02()
1946 {
1947  static const test_ab<T> test_list[] =
1948  {
1949  test_ab<T>("'aaa' == 'aaa'" ,"","",T(1.0)),
1950  test_ab<T>("'aaa' < 'bbb'" ,"","",T(1.0)),
1951  test_ab<T>("'aaa' <= 'bbb'" ,"","",T(1.0)),
1952  test_ab<T>("'bbb' > 'aaa'" ,"","",T(1.0)),
1953  test_ab<T>("'bbb' >= 'aaa'" ,"","",T(1.0)),
1954  test_ab<T>("'aaa' != 'aaa'" ,"","",T(0.0)),
1955  test_ab<T>("'aaa' != 'bbb'" ,"","",T(1.0)),
1956  test_ab<T>("'aaa' + '123' == 'aaa123'" ,"","",T(1.0)),
1957  test_ab<T>("'aaa123' == 'aaa' + '123'" ,"","",T(1.0)),
1958  test_ab<T>("('aaa' + '123') == 'aaa123'" ,"","",T(1.0)),
1959  test_ab<T>("'aaa123' == ('aaa' + '123')" ,"","",T(1.0)),
1960  test_ab<T>("'aaa' in 'aaa123'" ,"","",T(1.0)),
1961  test_ab<T>("'123' in 'aaa123'" ,"","",T(1.0)),
1962  test_ab<T>("'a123b' like '*123*'" ,"","",T(1.0)),
1963  test_ab<T>("'a123b' like '*123?'" ,"","",T(1.0)),
1964  test_ab<T>("'1XYZ2' ilike '*xyz*'" ,"","",T(1.0)),
1965  test_ab<T>("'1XYZ2' ilike '*xyz?'" ,"","",T(1.0)),
1966  test_ab<T>("inrange('aaa','bbb','ccc')" ,"","",T(1.0)),
1967  test_ab<T>("a == b" ,"aaa","aaa",T(1.0)),
1968  test_ab<T>("a != b" ,"aaa","bbb",T(1.0)),
1969  test_ab<T>("a < b" ,"aaa","bbb",T(1.0)),
1970  test_ab<T>("a <= b" ,"aaa","bbb",T(1.0)),
1971  test_ab<T>("b > a" ,"aaa","bbb",T(1.0)),
1972  test_ab<T>("b >= a" ,"aaa","bbb",T(1.0)),
1973  test_ab<T>("a in b" ,"aaa","aaa123",T(1.0)),
1974  test_ab<T>("a in b" ,"123","aaa123",T(1.0)),
1975  test_ab<T>("a == 'aaa'" ,"aaa","aaa",T(1.0)),
1976  test_ab<T>("'aaa' == a" ,"aaa","aaa",T(1.0)),
1977  test_ab<T>("a != 'bbb'" ,"aaa","bbb",T(1.0)),
1978  test_ab<T>("'bbb' != a" ,"aaa","bbb",T(1.0)),
1979  test_ab<T>("a < 'bbb'" ,"aaa","bbb",T(1.0)),
1980  test_ab<T>("a <= 'bbb'" ,"aaa","bbb",T(1.0)),
1981  test_ab<T>("'bbb' > a" ,"aaa","bbb",T(1.0)),
1982  test_ab<T>("'bbb' >= a" ,"aaa","bbb",T(1.0)),
1983  test_ab<T>("a in 'aaa123'" ,"aaa","aaa123",T(1.0)),
1984  test_ab<T>("a in 'aaa123'" ,"123","aaa123",T(1.0)),
1985  test_ab<T>("'aaa' in b" ,"aaa","aaa123",T(1.0)),
1986  test_ab<T>("'123' in b" ,"aaa","aaa123",T(1.0)),
1987  test_ab<T>("(a < b) or (a == b)" ,"aaa","bbb",T(1.0)),
1988  test_ab<T>("(a == b) or (a < b)" ,"aaa","bbb",T(1.0)),
1989  test_ab<T>("(b > a) or (b == a)" ,"aaa","bbb",T(1.0)),
1990  test_ab<T>("(b == a) or (b > a)" ,"aaa","bbb",T(1.0)),
1991  test_ab<T>("(a < b) and (b > a)" ,"aaa","bbb",T(1.0)),
1992  test_ab<T>("a like '*123*'" ,"a123b","",T(1.0)),
1993  test_ab<T>("a like '*123?'" ,"a123b","",T(1.0)),
1994  test_ab<T>("'a123b' like b" ,"a123b","*123*",T(1.0)),
1995  test_ab<T>("'a123b' like b" ,"a123b","*123?",T(1.0)),
1996  test_ab<T>("a ilike '*xyz*'" ,"1XYZ2","",T(1.0)),
1997  test_ab<T>("a ilike '*xyz?'" ,"1XYZ2","",T(1.0)),
1998  test_ab<T>("'1XYZ2' ilike b" ,"","*xyz*",T(1.0)),
1999  test_ab<T>("'1XYZ2' ilike b" ,"","*xyz?",T(1.0)),
2000  test_ab<T>("inrange(a,'bbb',c)" ,"aaa","bbb",T(1.0)),
2001  test_ab<T>("inrange('aaa',b,'ccc')" ,"aaa","bbb",T(1.0)),
2002  test_ab<T>("inrange(a,b,c)" ,"aaa","bbb",T(1.0)),
2003  test_ab<T>("inrange(a,b,'ccc')" ,"aaa","bbb",T(1.0)),
2004  test_ab<T>("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
2005  test_ab<T>("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
2006  test_ab<T>("(a < b ? a : b) == a" ,"aaa","bbb",T(1.0)),
2007  test_ab<T>("(a > b ? a : b) == b" ,"aaa","bbb",T(1.0)),
2008  test_ab<T>("(a == (a + '1') ? a : b) == b" ,"aaa","bbb",T(1.0)),
2009  test_ab<T>("((a + '2') != a ? a : b) == a" ,"aaa","bbb",T(1.0)),
2010  test_ab<T>("(a < b ? a + '1' : b) == 'aaa1'","aaa","bbb",T(1.0)),
2011  test_ab<T>("(a > b ? a : b + '2') == 'bbb2'","aaa","bbb",T(1.0)),
2012  test_ab<T>("b == (a == (a + '1') ? a : b)" ,"aaa","bbb",T(1.0)),
2013  test_ab<T>("a == (a != (a + '2') ? a : b)" ,"aaa","bbb",T(1.0)),
2014  test_ab<T>("'aaa1' == (a < b ? a + '1' : b)","aaa","bbb",T(1.0)),
2015  test_ab<T>("'bbb2' == (a > b ? a : b + '2')","aaa","bbb",T(1.0)),
2016  test_ab<T>("(a < b ? a[1:2] : b) == '23'" ,"1234","67890",T(1.0)),
2017  test_ab<T>("(a > b ? a : b[0:3]) == '6789'" ,"1234","67890",T(1.0)),
2018  test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x : y) == x }}","","",T(1.0)),
2019  test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y) == y }}","","",T(1.0)),
2020  test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x == (x + '1') ? x : y) == y }}","","",T(1.0)),
2021  test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{((x + '2') != x ? x : y) == x }}","","",T(1.0)),
2022  test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x + '1' : y) == 'xxx1'}}","","",T(1.0)),
2023  test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y + '2') == 'yyy2'}}","","",T(1.0)),
2024  test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{y == (x == (x + '1') ? x : y) }}","","",T(1.0)),
2025  test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{x == (x != (x + '2') ? x : y) }}","","",T(1.0)),
2026  test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'xxx1' == (x < y ? x + '1' : y)}}","","",T(1.0)),
2027  test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'yyy2' == (x > y ? x : y + '2')}}","","",T(1.0)),
2028  test_ab<T>("'01234567890123456789'[0:9] == '0123456789' ","","",T(1.0)),
2029  test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:] ","","",T(1.0)),
2030  test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[0:]","","",T(1.0)),
2031  test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:9]","","",T(1.0)),
2032  test_ab<T>("'01234567890123456789'[:9] == '0123456789'[:9]","","",T(1.0)),
2033  test_ab<T>("'01234567890123456789'[10:] == '0123456789'[:] ","","",T(1.0)),
2034  test_ab<T>("'01234567890123456789'[0:9] != '123456789' ","","",T(1.0)),
2035  test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:] ","","",T(1.0)),
2036  test_ab<T>("'01234567890123456789'[0:9] != '123456789'[0:] ","","",T(1.0)),
2037  test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:8] ","","",T(1.0)),
2038  test_ab<T>("'01234567890123456789'[:9] != '123456789'[:8] ","","",T(1.0)),
2039  test_ab<T>("'01234567890123456789'[10:] != '123456789'[:] ","","",T(1.0)),
2040  test_ab<T>("'01234567890123456789'[2*6:10+6] == '23456' ","","",T(1.0)),
2041  test_ab<T>("'0123456789' == '01234567890123456789'[0:9]","","",T(1.0)),
2042  test_ab<T>("'0123456789'[:] == '01234567890123456789'[0:9]","","",T(1.0)),
2043  test_ab<T>("'0123456789'[0:] == '01234567890123456789'[0:9]","","",T(1.0)),
2044  test_ab<T>("'0123456789'[:9] == '01234567890123456789'[0:9]","","",T(1.0)),
2045  test_ab<T>("'0123456789'[:9] == '01234567890123456789'[:9] ","","",T(1.0)),
2046  test_ab<T>("'0123456789'[:] == '01234567890123456789'[10:]","","",T(1.0)),
2047  test_ab<T>("'0123456789'[3:3] == '3'[:] ","","",T(1.0)),
2048  test_ab<T>("'0123456789'[3:3] == '3'[0:0] ","","",T(1.0)),
2049  test_ab<T>("'123456789' != '01234567890123456789'[0:9]","","",T(1.0)),
2050  test_ab<T>("'123456789'[:] != '01234567890123456789'[0:9]","","",T(1.0)),
2051  test_ab<T>("'123456789'[0:] != '01234567890123456789'[0:9]","","",T(1.0)),
2052  test_ab<T>("'123456789'[:8] != '01234567890123456789'[0:9]","","",T(1.0)),
2053  test_ab<T>("'123456789'[:8] != '01234567890123456789'[:9] ","","",T(1.0)),
2054  test_ab<T>("'123456789'[:] != '01234567890123456789'[10:]","","",T(1.0)),
2055  test_ab<T>("'23456' == '01234567890123456789'[2*6:10+6] ","","",T(1.0)),
2056  test_ab<T>("'01234567890123456789'[r0: 6] == '23456' ","","",T(1.0)),
2057  test_ab<T>("'01234567890123456789'[2: r1] == '23456' ","","",T(1.0)),
2058  test_ab<T>("'01234567890123456789'[r0:3*2] == '23456' ","","",T(1.0)),
2059  test_ab<T>("'01234567890123456789'[1+1:r1] == '23456' ","","",T(1.0)),
2060  test_ab<T>("'01234567890123456789'[r0: ] == '234567890123456789' ","","",T(1.0)),
2061  test_ab<T>("'01234567890123456789'[: r1] == '0123456' ","","",T(1.0)),
2062  test_ab<T>("'01234567890123456789'[r0:r1] == '23456' ","","",T(1.0)),
2063  test_ab<T>("'01234567890123456789'[r0:r1+2] == '2345678' ","","",T(1.0)),
2064  test_ab<T>("'01234567890123456789'[r0+2:r1] == '456' ","","",T(1.0)),
2065  test_ab<T>("'01234567890123456789'[r1-r0:] == '4567890123456789' ","","",T(1.0)),
2066  test_ab<T>("'01234567890123456789'[:r1-r0] == '01234' ","","",T(1.0)),
2067  test_ab<T>("'23456' == '01234567890123456789'[r0: 6] ","","",T(1.0)),
2068  test_ab<T>("'23456' == '01234567890123456789'[2: r1] ","","",T(1.0)),
2069  test_ab<T>("'23456' == '01234567890123456789'[r0:3*2] ","","",T(1.0)),
2070  test_ab<T>("'23456' == '01234567890123456789'[1+1:r1] ","","",T(1.0)),
2071  test_ab<T>("'234567890123456789' == '01234567890123456789'[r0: ] ","","",T(1.0)),
2072  test_ab<T>("'0123456' == '01234567890123456789'[: r1] ","","",T(1.0)),
2073  test_ab<T>("'23456' == '01234567890123456789'[r0:r1] ","","",T(1.0)),
2074  test_ab<T>("'2345678' == '01234567890123456789'[r0:r1+2] ","","",T(1.0)),
2075  test_ab<T>("'456' == '01234567890123456789'[r0+2:r1] ","","",T(1.0)),
2076  test_ab<T>("'4567890123456789' == '01234567890123456789'[r1-r0:] ","","",T(1.0)),
2077  test_ab<T>("'01234' == '01234567890123456789'[:r1-r0] ","","",T(1.0)),
2078  test_ab<T>("a[r0: 6] == '23456' ","01234567890123456789","",T(1.0)),
2079  test_ab<T>("a[2: r1] == '23456' ","01234567890123456789","",T(1.0)),
2080  test_ab<T>("a[r0:3*2] == '23456' ","01234567890123456789","",T(1.0)),
2081  test_ab<T>("a[1+1:r1] == '23456' ","01234567890123456789","",T(1.0)),
2082  test_ab<T>("a[r0: ] == '234567890123456789' ","01234567890123456789","",T(1.0)),
2083  test_ab<T>("a[: r1] == '0123456' ","01234567890123456789","",T(1.0)),
2084  test_ab<T>("a[r0:r1] == '23456' ","01234567890123456789","",T(1.0)),
2085  test_ab<T>("a[r0:r1+2] == '2345678' ","01234567890123456789","",T(1.0)),
2086  test_ab<T>("a[r0+2:r1] == '456' ","01234567890123456789","",T(1.0)),
2087  test_ab<T>("a[r1-r0:] == '4567890123456789' ","01234567890123456789","",T(1.0)),
2088  test_ab<T>("a[:r1-r0] == '01234' ","01234567890123456789","",T(1.0)),
2089  test_ab<T>("'23456' == a[r0: 6] ","01234567890123456789","",T(1.0)),
2090  test_ab<T>("'23456' == a[2: r1] ","01234567890123456789","",T(1.0)),
2091  test_ab<T>("'23456' == a[r0:3*2] ","01234567890123456789","",T(1.0)),
2092  test_ab<T>("'23456' == a[1+1:r1] ","01234567890123456789","",T(1.0)),
2093  test_ab<T>("'234567890123456789' == a[r0: ] ","01234567890123456789","",T(1.0)),
2094  test_ab<T>("'0123456' == a[: r1] ","01234567890123456789","",T(1.0)),
2095  test_ab<T>("'23456' == a[r0:r1] ","01234567890123456789","",T(1.0)),
2096  test_ab<T>("'2345678' == a[r0:r1+2] ","01234567890123456789","",T(1.0)),
2097  test_ab<T>("'456' == a[r0+2:r1] ","01234567890123456789","",T(1.0)),
2098  test_ab<T>("'4567890123456789' == a[r1-r0:] ","01234567890123456789","",T(1.0)),
2099  test_ab<T>("'01234' == a[:r1-r0] ","01234567890123456789","",T(1.0)),
2100  test_ab<T>("a[r0: 6] == b ","01234567890123456789","23456",T(1.0)),
2101  test_ab<T>("a[2: r1] == b ","01234567890123456789","23456",T(1.0)),
2102  test_ab<T>("a[r0:3*2] == b ","01234567890123456789","23456",T(1.0)),
2103  test_ab<T>("a[1+1:r1] == b ","01234567890123456789","23456",T(1.0)),
2104  test_ab<T>("a[r0: ] == b ","01234567890123456789","234567890123456789",T(1.0)),
2105  test_ab<T>("a[: r1] == b ","01234567890123456789","0123456",T(1.0)),
2106  test_ab<T>("a[r0:r1] == b ","01234567890123456789","23456",T(1.0)),
2107  test_ab<T>("a[r0:r1+2] == b ","01234567890123456789","2345678",T(1.0)),
2108  test_ab<T>("a[r0+2:r1] == b ","01234567890123456789","456",T(1.0)),
2109  test_ab<T>("a[r1-r0:] == b ","01234567890123456789","4567890123456789",T(1.0)),
2110  test_ab<T>("a[:r1-r0] == b ","01234567890123456789","01234",T(1.0)),
2111  test_ab<T>("b == a[r0: 6] ","01234567890123456789","23456",T(1.0)),
2112  test_ab<T>("b == a[2: r1] ","01234567890123456789","23456",T(1.0)),
2113  test_ab<T>("b == a[r0:3*2] ","01234567890123456789","23456",T(1.0)),
2114  test_ab<T>("b == a[1+1:r1] ","01234567890123456789","23456",T(1.0)),
2115  test_ab<T>("b == a[r0: ] ","01234567890123456789","234567890123456789",T(1.0)),
2116  test_ab<T>("b == a[: r1] ","01234567890123456789","0123456",T(1.0)),
2117  test_ab<T>("b == a[r0:r1] ","01234567890123456789","23456",T(1.0)),
2118  test_ab<T>("b == a[r0:r1+2] ","01234567890123456789","2345678",T(1.0)),
2119  test_ab<T>("b == a[r0+2:r1] ","01234567890123456789","456",T(1.0)),
2120  test_ab<T>("b == a[r1-r0:] ","01234567890123456789","4567890123456789",T(1.0)),
2121  test_ab<T>("b == a[:r1-r0] ","01234567890123456789","01234",T(1.0)),
2122  test_ab<T>("'01234567890123456789'[0:9] == a ","0123456789","",T(1.0)),
2123  test_ab<T>("'01234567890123456789'[0:9] == a[:] ","0123456789","",T(1.0)),
2124  test_ab<T>("'01234567890123456789'[0:9] == a[0:] ","0123456789","",T(1.0)),
2125  test_ab<T>("'01234567890123456789'[0:9] == a[:9] ","0123456789","",T(1.0)),
2126  test_ab<T>("'01234567890123456789'[:9] == a[:9] ","0123456789","",T(1.0)),
2127  test_ab<T>("'01234567890123456789'[10:] == a[:] ","0123456789","",T(1.0)),
2128  test_ab<T>("'01234567890123456789'[0:9] != a ","123456789" ,"",T(1.0)),
2129  test_ab<T>("'01234567890123456789'[0:9] != a[:] ","123456789" ,"",T(1.0)),
2130  test_ab<T>("'01234567890123456789'[0:9] != a[0:] ","123456789" ,"",T(1.0)),
2131  test_ab<T>("'01234567890123456789'[0:9] != a[:8] ","123456789" ,"",T(1.0)),
2132  test_ab<T>("'01234567890123456789'[:9] != a[:8] ","123456789" ,"",T(1.0)),
2133  test_ab<T>("'01234567890123456789'[10:] != a[:] ","123456789" ,"",T(1.0)),
2134  test_ab<T>("'01234567890123456789'[2*6:10+6] == a","23456" ,"",T(1.0)),
2135  test_ab<T>("'23456' == a[:] ","23456" ,"",T(1.0)),
2136  test_ab<T>("a == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2137  test_ab<T>("a[:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2138  test_ab<T>("a[0:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2139  test_ab<T>("a[:9] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2140  test_ab<T>("a[:9] == '01234567890123456789'[:9] ","0123456789","",T(1.0)),
2141  test_ab<T>("a[:] == '01234567890123456789'[10:] ","0123456789","",T(1.0)),
2142  test_ab<T>("a != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2143  test_ab<T>("a[:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2144  test_ab<T>("a[0:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2145  test_ab<T>("a[:8] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2146  test_ab<T>("a[:8] != '01234567890123456789'[:9] ","123456789" ,"",T(1.0)),
2147  test_ab<T>("a[:] != '01234567890123456789'[10:] ","123456789" ,"",T(1.0)),
2148  test_ab<T>("a == '01234567890123456789'[2*6:10+6]","23456" ,"",T(1.0)),
2149  test_ab<T>("a[:] == '23456' ","23456" ,"",T(1.0)),
2150  test_ab<T>("a[0:9] == b ","01234567890123456789","0123456789",T(1.0)),
2151  test_ab<T>("a[0:9] == b[:] ","01234567890123456789","0123456789",T(1.0)),
2152  test_ab<T>("a[0:9] == b[0:] ","01234567890123456789","0123456789",T(1.0)),
2153  test_ab<T>("a[0:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
2154  test_ab<T>("a[:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
2155  test_ab<T>("a[10:] == b[:] ","01234567890123456789","0123456789",T(1.0)),
2156  test_ab<T>("a[0:9] != b ","01234567890123456789","123456789" ,T(1.0)),
2157  test_ab<T>("a[0:9] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
2158  test_ab<T>("a[0:9] != b[0:] ","01234567890123456789","123456789" ,T(1.0)),
2159  test_ab<T>("a[0:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
2160  test_ab<T>("a[:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
2161  test_ab<T>("a[10:] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
2162  test_ab<T>("a[2*6:10+6] == b ","01234567890123456789","23456" ,T(1.0)),
2163  test_ab<T>("b == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2164  test_ab<T>("b[:] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2165  test_ab<T>("b[0:] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2166  test_ab<T>("b[:9] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2167  test_ab<T>("b[:9] == a[:9] ","01234567890123456789","0123456789",T(1.0)),
2168  test_ab<T>("b[:] == a[10:] ","01234567890123456789","0123456789",T(1.0)),
2169  test_ab<T>("b != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2170  test_ab<T>("b[:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2171  test_ab<T>("b[0:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2172  test_ab<T>("b[:8] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2173  test_ab<T>("b[:8] != a[:9] ","01234567890123456789","123456789" ,T(1.0)),
2174  test_ab<T>("b[:] != a[10:] ","01234567890123456789","123456789" ,T(1.0)),
2175  test_ab<T>("b == a[2*6:10+6] ","01234567890123456789","23456" ,T(1.0)),
2176  test_ab<T>("a[2:6] == b" ,"0123456789","23456" ,T(1.0)),
2177  test_ab<T>("a == b[2:6]" ,"23456","0123456789" ,T(1.0)),
2178  test_ab<T>("a[1+1:2*3] == b" ,"0123456789","23456" ,T(1.0)),
2179  test_ab<T>("a == b[4/2:sqrt(36)]","23456","0123456789" ,T(1.0)),
2180  test_ab<T>("a[0:6] == b" ,"0123456789","0123456",T(1.0)),
2181  test_ab<T>("a[:6] == b" ,"0123456789","0123456",T(1.0)),
2182  test_ab<T>("a[4/2-2:2+4] == b" ,"0123456789","0123456",T(1.0)),
2183  test_ab<T>("a[:12/2] == b" ,"0123456789","0123456",T(1.0)),
2184  test_ab<T>("a[0:] == b" ,"0123456","0123456" ,T(1.0)),
2185  test_ab<T>("a[:] == b" ,"0123456","0123456" ,T(1.0)),
2186  test_ab<T>("a == b[0:6]" ,"0123456","0123456789",T(1.0)),
2187  test_ab<T>("a == b[:6]" ,"0123456","0123456789",T(1.0)),
2188  test_ab<T>("a == b[4/2-2:2+4]" ,"0123456","0123456789",T(1.0)),
2189  test_ab<T>("a == b[:12/2]" ,"0123456","0123456789",T(1.0)),
2190  test_ab<T>("a == b[0:]" ,"0123456","0123456" ,T(1.0)),
2191  test_ab<T>("a == b[:]" ,"0123456","0123456" ,T(1.0)),
2192  test_ab<T>("a[:9] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2193  test_ab<T>("a[0:9] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2194  test_ab<T>("a[0:] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2195  test_ab<T>("a[:] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2196  test_ab<T>("a[:] == b[10:]" ,"0123456789","01234567890123456789",T(1.0)),
2197  test_ab<T>("'!@#$%^&*([{}])-=' != ')]}{[(*&^%$#@!'","","",T(1.0)),
2198  test_ab<T>("('!@#$%^&*([{}])-=') != (')]}{[(*&^%$#@!')","","",T(1.0)),
2199  test_ab<T>("{[('a')]} == [{('a')}]","","",T(1.0)),
2200  test_ab<T>("{[('!@#$%^&*([{}])-=')]} != [{(')]}{[(*&^%$#@!')}]","","",T(1.0)),
2201  test_ab<T>("'!@#$%^&*([{}])-=' == '!@#$%^&*([{}])-='","","",T(1.0)),
2202  test_ab<T>("('!@#$%^&*([{}])-=') == ('!@#$%^&*([{}])-=')","","",T(1.0)),
2203  test_ab<T>("{[('!@#$%^&*([{}])-=')]} == [{('!@#$%^&*([{}])-=')}]","","",T(1.0)),
2204  test_ab<T>("'1234\\\\abc\nxyz\r890\tqaz\\'567' == a","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
2205  test_ab<T>("a == '1234\\\\abc\nxyz\r890\tqaz\\'567'","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
2206  test_ab<T>("'123'[] == 3" ,"","" ,T(1.0)),
2207  test_ab<T>("3 == '123'[]" ,"","" ,T(1.0)),
2208  test_ab<T>("'123'[] + '1234'[] == 7" ,"","" ,T(1.0)),
2209  test_ab<T>("abs('123'[] - '1234'[]) == 1" ,"","" ,T(1.0)),
2210  test_ab<T>("'1234'[] == a[]" ,"1234","" ,T(1.0)),
2211  test_ab<T>("'123'[] + a[] == 7" ,"1234","" ,T(1.0)),
2212  test_ab<T>("abs(a[] - '12345'[]) == 1" ,"1234","" ,T(1.0)),
2213  test_ab<T>("'1234'[] + '12345'[] == a[] + b[]" ,"1234","12345" ,T(1.0)),
2214  test_ab<T>("abs('123'[] -'1234'[]) == abs(a[] - b[])" ,"1234","12345",T(1.0)),
2215  test_ab<T>("(a + b) == 'abc123' ","abc","123" ,T(1.0)),
2216  test_ab<T>("(a + '123') == 'abc123' ","abc","123" ,T(1.0)),
2217  test_ab<T>("('abc' + b) == 'abc123' ","abc","123" ,T(1.0)),
2218  test_ab<T>("(a + '1') == 'abc1' ","abc","123" ,T(1.0)),
2219  test_ab<T>("('a' + b) == 'a123' ","abc","123" ,T(1.0)),
2220  test_ab<T>("(a[2:7] + b) == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
2221  test_ab<T>("(a + b[2:7]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
2222  test_ab<T>("(a[2:7] + '0123') == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
2223  test_ab<T>("('abc' + b[2:7]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
2224  test_ab<T>("(a[2:2] + b[3:3]) == 'c3' ","abc","0123456789" ,T(1.0)),
2225  test_ab<T>("(a[3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2226  test_ab<T>("('abc' + b[:7]) == 'abc01234567' ","abc","0123456789" ,T(1.0)),
2227  test_ab<T>("a + '123' == 'abc'+ b ","abc" , "123" , T(1.0)),
2228  test_ab<T>("a[0:2] + '123' == 'abc' + b[0:2] ","abcXYZ", "123XYZ", T(1.0)),
2229  test_ab<T>("a[ :2] + '123' == 'abc' + b[ :2] ","abcXYZ", "123XYZ", T(1.0)),
2230  test_ab<T>("a[3: ] + '123' == 'abc' + b[3: ]","XYZabc", "XYZ123", T(1.0)),
2231  test_ab<T>("a[3:a[] - 1] + '123' == 'abc' + b[3:b[] - 1]","XYZabc", "XYZ123", T(1.0)),
2232  test_ab<T>("(a[r0:r2] + b) == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
2233  test_ab<T>("(a + b[r0:r2]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
2234  test_ab<T>("(a[r0:r2] + '0123') == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
2235  test_ab<T>("('abc' + b[r0:r2]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
2236  test_ab<T>("(a[r0:r0] + b[r3:r3]) == 'c3' ","abc","0123456789" ,T(1.0)),
2237  test_ab<T>("(a[r3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2238  test_ab<T>("('abc' + b[:r2]) == 'abc01234567' ","abc","0123456789" ,T(1.0)),
2239  test_ab<T>("a[0:r0] + '123' == 'abc' + b[0:r0] ","abcXYZ", "123XYZ", T(1.0)),
2240  test_ab<T>("a[ :r0] + '123' == 'abc' + b[ :r0] ","abcXYZ", "123XYZ", T(1.0)),
2241  test_ab<T>("a[r3: ] + '123' == 'abc' + b[r3: ]","XYZabc", "XYZ123", T(1.0)),
2242  test_ab<T>("a[r3:a[] - 1] + '123' == 'abc' + b[r3:b[] - 1]","XYZabc", "XYZ123", T(1.0)),
2243  test_ab<T>("(a[r0:r0] + b[r3:r0+1]) == 'c3' ","abc","0123456789" ,T(1.0)),
2244  test_ab<T>("(a[r0+1:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2245  test_ab<T>("a[r0+1: ] + '123' == 'abc' + b[r0+1: ]","XYZabc", "XYZ123", T(1.0)),
2246  test_ab<T>("a[r0+1:a[] - 1] + '123' == 'abc' + b[r0+1:b[] - 1]","XYZabc", "XYZ123", T(1.0)),
2247  test_ab<T>("(a + b)[ :13] == 'abcdefghij0123' ", "abcdefghij", "0123456789" ,T(1.0)),
2248  test_ab<T>("(a + b)[ 6: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2249  test_ab<T>("(a + b)[ 2:3r1-1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2250  test_ab<T>("(a[2:7] + b[2:7]) == 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2251  test_ab<T>("(a[2:7] + b[2:7])[3:8] == 'fgh234' ", "abcdefghij", "0123456789" ,T(1.0)),
2252  test_ab<T>("(a + b)[r0 - 2: r1 + r2] == 'abcdefghij0123' ", "abcdefghij", "0123456789" ,T(1.0)),
2253  test_ab<T>("(a + b)[r0*r3:] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2254  test_ab<T>("(a + b)[3r0: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2255  test_ab<T>("(a + b)[2r3: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2256  test_ab<T>("(a + b)[2:3r1 - 1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2257  test_ab<T>("(a[r0:7] + b[r0:r2])== 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2258  test_ab<T>("(a[r1 / r3:7] + b[r0:r2])[3:r2 + 1] == 'fgh234'", "abcdefghij", "0123456789" ,T(1.0)),
2259  test_ab<T>("(a += b) == 'abc123' ", "abc","123" ,T(1.0)),
2260  test_ab<T>("(a += '123') == 'abc123' ", "abc","123" ,T(1.0)),
2261  test_ab<T>("(a += b[3:5]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2262  test_ab<T>("(a += 'XXX123XXX'[3:5]) == 'abc123' ", "abc","123" ,T(1.0)),
2263  test_ab<T>("(a += b)[:] == 'abc123' ", "abc","123" ,T(1.0)),
2264  test_ab<T>("(a += '123')[:] == 'abc123' ", "abc","123" ,T(1.0)),
2265  test_ab<T>("(a += b[3:5])[:] == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2266  test_ab<T>("(a += 'XXX123XXX'[3:5])[:] == 'abc123' ", "abc","123" ,T(1.0)),
2267  test_ab<T>("(a += b[r1/2:r1-1]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2268  test_ab<T>("(a += 'XXX123XXX'[r0+1:r1-1]) == 'abc123' ", "abc","123" ,T(1.0)),
2269  test_ab<T>("(a += b)[] == 6 ", "abc","123" ,T(1.0)),
2270  test_ab<T>("(a += '123')[] == 6 ", "abc","123" ,T(1.0)),
2271  test_ab<T>("(a += b[3:5])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
2272  test_ab<T>("(a += b[r0+1:r1-1])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
2273  test_ab<T>("(a + b)[:][] == 6 ","abc","123" ,T(1.0)),
2274  test_ab<T>("(a + b)[:][:][] == 6 ","abc","123" ,T(1.0)),
2275  test_ab<T>("(a + b)[:][:][:][] == 6 ","abc","123" ,T(1.0)),
2276  test_ab<T>("(a + b)[:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
2277  test_ab<T>("(a + b)[:][:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
2278  test_ab<T>("(a + b)[:][:][:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
2279  test_ab<T>("(a + b)[:][:][:][:][:][:][:][]== 6 ","abc","123" ,T(1.0)),
2280  test_ab<T>("(a + b)[0:5] == 'abc123' ","abc","123" ,T(1.0)),
2281  test_ab<T>("(a + b)[0:5][1:4] == 'bc12' ","abc","123" ,T(1.0)),
2282  test_ab<T>("(a + b)[0:5][1:4][1:2] == 'c1' ","abc","123" ,T(1.0)),
2283  test_ab<T>("(a + b)[0:5][1:4][1:2][0:0] == 'c' ","abc","123" ,T(1.0)),
2284  test_ab<T>("(a + b)[0:5][] == 6 ","abc","123" ,T(1.0)),
2285  test_ab<T>("(a + b)[0:5][1:4][] == 4 ","abc","123" ,T(1.0)),
2286  test_ab<T>("(a + b)[0:5][1:4][1:2][] == 2 ","abc","123" ,T(1.0)),
2287  test_ab<T>("(a + b)[0:5][1:4][1:2][0:0][] == 1 ","abc","123" ,T(1.0)),
2288  test_ab<T>("(a[ : ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2289  test_ab<T>("(a[0: ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2290  test_ab<T>("(a[ :9] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2291  test_ab<T>("(a[3:7] := b); (a == '012ABCDE89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2292  test_ab<T>("(a[2:8] := b); (a == '01ABCDEFG9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2293  test_ab<T>("(a[1:9] := b); (a == '0ABCDEFGHI');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2294  test_ab<T>("(a[0:0] := b); (a == 'A123456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2295  test_ab<T>("(a[1:1] := b); (a == '0A23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2296  test_ab<T>("(a[2:2] := b); (a == '01A3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2297  test_ab<T>("(a[3:3] := b); (a == '012A456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2298  test_ab<T>("(a[4:4] := b); (a == '0123A56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2299  test_ab<T>("(a[5:5] := b); (a == '01234A6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2300  test_ab<T>("(a[6:6] := b); (a == '012345A789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2301  test_ab<T>("(a[7:7] := b); (a == '0123456A89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2302  test_ab<T>("(a[8:8] := b); (a == '01234567A9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2303  test_ab<T>("(a[9:9] := b); (a == '012345678A');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2304  test_ab<T>("(a[0:1] := b); (a == 'AB23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2305  test_ab<T>("(a[1:2] := b); (a == '0AB3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2306  test_ab<T>("(a[2:3] := b); (a == '01AB456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2307  test_ab<T>("(a[3:4] := b); (a == '012AB56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2308  test_ab<T>("(a[4:5] := b); (a == '0123AB6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2309  test_ab<T>("(a[5:6] := b); (a == '01234AB789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2310  test_ab<T>("(a[6:7] := b); (a == '012345AB89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2311  test_ab<T>("(a[7:8] := b); (a == '0123456AB9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2312  test_ab<T>("(a[8:9] := b); (a == '01234567AB');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2313  test_ab<T>("(a[ : ] := b[3:b[] - 3]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2314  test_ab<T>("(a[0: ] := b[3:b[] - 3]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2315  test_ab<T>("(a[ :9] := b[3:b[] - 3]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2316  test_ab<T>("(a[3:7] := b[3:b[] - 3]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2317  test_ab<T>("(a[2:8] := b[3:b[] - 3]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2318  test_ab<T>("(a[1:9] := b[3:b[] - 3]); (a == '0ABCDEFGHI');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2319  test_ab<T>("(a[0:0] := b[3:b[] - 3]); (a == 'A123456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2320  test_ab<T>("(a[1:1] := b[3:b[] - 3]); (a == '0A23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2321  test_ab<T>("(a[2:2] := b[3:b[] - 3]); (a == '01A3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2322  test_ab<T>("(a[3:3] := b[3:b[] - 3]); (a == '012A456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2323  test_ab<T>("(a[4:4] := b[3:b[] - 3]); (a == '0123A56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2324  test_ab<T>("(a[5:5] := b[3:b[] - 3]); (a == '01234A6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2325  test_ab<T>("(a[6:6] := b[3:b[] - 3]); (a == '012345A789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2326  test_ab<T>("(a[7:7] := b[3:b[] - 3]); (a == '0123456A89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2327  test_ab<T>("(a[8:8] := b[3:b[] - 3]); (a == '01234567A9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2328  test_ab<T>("(a[9:9] := b[3:b[] - 3]); (a == '012345678A');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2329  test_ab<T>("(a[0:1] := b[3:b[] - 3]); (a == 'AB23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2330  test_ab<T>("(a[1:2] := b[3:b[] - 3]); (a == '0AB3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2331  test_ab<T>("(a[2:3] := b[3:b[] - 3]); (a == '01AB456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2332  test_ab<T>("(a[3:4] := b[3:b[] - 3]); (a == '012AB56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2333  test_ab<T>("(a[4:5] := b[3:b[] - 3]); (a == '0123AB6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2334  test_ab<T>("(a[5:6] := b[3:b[] - 3]); (a == '01234AB789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2335  test_ab<T>("(a[6:7] := b[3:b[] - 3]); (a == '012345AB89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2336  test_ab<T>("(a[7:8] := b[3:b[] - 3]); (a == '0123456AB9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2337  test_ab<T>("(a[8:9] := b[3:b[] - 3]); (a == '01234567AB');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2338  test_ab<T>("(a[0:9] := b); (a == 'A123456789');", "0123456789","A" ,T(1.0)),
2339  test_ab<T>("(a[0:9] := b); (a == 'AB23456789');", "0123456789","AB" ,T(1.0)),
2340  test_ab<T>("(a[0:9] := b); (a == 'ABC3456789');", "0123456789","ABC" ,T(1.0)),
2341  test_ab<T>("(a[0:9] := b); (a == 'ABCD456789');", "0123456789","ABCD" ,T(1.0)),
2342  test_ab<T>("(a[0:9] := b); (a == 'ABCDE56789');", "0123456789","ABCDE" ,T(1.0)),
2343  test_ab<T>("(a[0:9] := b); (a == 'ABCDEF6789');", "0123456789","ABCDEF" ,T(1.0)),
2344  test_ab<T>("(a[0:9] := b); (a == 'ABCDEFG789');", "0123456789","ABCDEFG" ,T(1.0)),
2345  test_ab<T>("(a[0:9] := b); (a == 'ABCDEFGH89');", "0123456789","ABCDEFGH" ,T(1.0)),
2346  test_ab<T>("(a[0:9] := b); (a == 'ABCDEFGHI9');", "0123456789","ABCDEFGHI" ,T(1.0)),
2347  test_ab<T>("(a[3:9] := b); (a == '012A456789');", "0123456789","A" ,T(1.0)),
2348  test_ab<T>("(a[3:9] := b); (a == '012AB56789');", "0123456789","AB" ,T(1.0)),
2349  test_ab<T>("(a[3:9] := b); (a == '012ABC6789');", "0123456789","ABC" ,T(1.0)),
2350  test_ab<T>("(a[3:9] := b); (a == '012ABCD789');", "0123456789","ABCD" ,T(1.0)),
2351  test_ab<T>("(a[3:9] := b); (a == '012ABCDE89');", "0123456789","ABCDE" ,T(1.0)),
2352  test_ab<T>("(a[3:9] := b); (a == '012ABCDEF9');", "0123456789","ABCDEF" ,T(1.0)),
2353  test_ab<T>("(a[r1 / r0:r2] := b[3:b[] - r3]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2354  test_ab<T>("(a[r0:r2 + 1] := b[r3:b[] - r3]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2355  test_ab<T>("'\\0x30\\0x31\\0x32\\0x33\\0x34\\0x35\\0x36\\0x37\\0x38\\0x39' == '0123456789'","","",T(1.0)),
2356  test_ab<T>("'abc\\0x30\\0x31\\0x32\\0x33xyz' == 'abc0123xyz'" ,"","",T(1.0)),
2357  test_ab<T>("'\\0x30\\n\\0x31\\n\\0x32\\n\\0x33' == '0\\n1\\n2\\n3'" ,"","",T(1.0)),
2358  test_ab<T>("('\\0x30' + '') == '0'" ,"","",T(1.0)),
2359  test_ab<T>("('\\0x30' + '\\0x31\\0x32') == '012'" ,"","",T(1.0)),
2360  test_ab<T>("('\\0x30' + '\\0x31\\0x32' + '\\0x33\\0x34\\0x35') == '012345'" ,"","",T(1.0)),
2361  test_ab<T>("'a\\'\\\\b' == a" ,"a'\\b","",T(1.0)),
2362  test_ab<T>("'a\\\\\\'b' == a" ,"a\\'b","",T(1.0)),
2363  test_ab<T>("'a\\'\\\\\\\\b' == a" ,"a'\\\\b","",T(1.0)),
2364  test_ab<T>("'a\\0x30\\'\\0x31\\\\\\0x32b' == a" ,"a0'1\\2b","",T(1.0)),
2365 
2366  test_ab<T>("var x := 3; x > 2 and 'abc' like '*bc'" ,"","",T(1.0)),
2367  test_ab<T>("var x := 3; x > 2 and 'abc' ilike '*Bc'" ,"","",T(1.0)),
2368  test_ab<T>("var x := 3; x > 2 and 'abc' in '123abc123'","","",T(1.0)),
2369 
2370  test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s like '*bc'" ,"","",T(1.0)),
2371  test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s ilike '*Bc'" ,"","",T(1.0)),
2372  test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s in '123abc123'","","",T(1.0)),
2373 
2374  test_ab<T>("var x := 3; var s := 'abc'; var t := '*bc'; x > 2 and s like t" ,"","",T(1.0)),
2375  test_ab<T>("var x := 3; var s := 'abc'; var t := '*Bc'; x > 2 and s ilike t" ,"","",T(1.0)),
2376  test_ab<T>("var x := 3; var s := 'abc'; var t := '123abc123'; x > 2 and s in t","","",T(1.0)),
2377 
2378  test_ab<T>("var x := 3; x > 2 and a like '*bc'" ,"abc","",T(1.0)),
2379  test_ab<T>("var x := 3; x > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
2380  test_ab<T>("var x := 3; x > 2 and a in '123abc123'","abc","",T(1.0)),
2381 
2382  test_ab<T>("var x := 3; x > 2 and a like b ","abc","*bc",T(1.0)),
2383  test_ab<T>("var x := 3; x > 2 and a ilike b","abc","*Bc",T(1.0)),
2384  test_ab<T>("var x := 3; x > 2 and a in b ","abc","123abc123",T(1.0)),
2385 
2386  test_ab<T>("a[] > 2 and a like '*bc'" ,"abc","",T(1.0)),
2387  test_ab<T>("a[] > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
2388  test_ab<T>("a[] > 2 and a in '123abc123'","abc","",T(1.0)),
2389 
2390  test_ab<T>("a[] > 2 and a like b ","abc","*bc",T(1.0)),
2391  test_ab<T>("a[] > 2 and a ilike b","abc","*Bc",T(1.0)),
2392  test_ab<T>("a[] > 2 and a in b ","abc","123abc123",T(1.0)),
2393 
2394  test_ab<T>("a[0:0] := b[ :]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
2395  test_ab<T>("a[0:1] := b[ :]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
2396  test_ab<T>("a[0:2] := b[ :]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
2397  test_ab<T>("a[0:3] := b[ :]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
2398  test_ab<T>("a[0:4] := b[ :]; a == '01234'", "XXXXX","01234567890",T(1.0)),
2399  test_ab<T>("a[0:0] := b[6:]; a == '6XXXX'", "XXXXX","01234567890",T(1.0)),
2400  test_ab<T>("a[0:1] := b[6:]; a == '67XXX'", "XXXXX","01234567890",T(1.0)),
2401  test_ab<T>("a[0:2] := b[6:]; a == '678XX'", "XXXXX","01234567890",T(1.0)),
2402  test_ab<T>("a[0:3] := b[6:]; a == '6789X'", "XXXXX","01234567890",T(1.0)),
2403  test_ab<T>("a[0:4] := b[6:]; a == '67890'", "XXXXX","01234567890",T(1.0)),
2404  test_ab<T>("a[0:0] <=> b[ :]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
2405  test_ab<T>("a[0:1] <=> b[ :]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
2406  test_ab<T>("a[0:2] <=> b[ :]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
2407  test_ab<T>("a[0:3] <=> b[ :]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
2408  test_ab<T>("a[0:4] <=> b[ :]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
2409  test_ab<T>("a[0:0] <=> b[6:]; (a == '6XXXX') and (b == '012345X7890')", "XXXXX","01234567890",T(1.0)),
2410  test_ab<T>("a[0:1] <=> b[6:]; (a == '67XXX') and (b == '012345XX890')", "XXXXX","01234567890",T(1.0)),
2411  test_ab<T>("a[0:2] <=> b[6:]; (a == '678XX') and (b == '012345XXX90')", "XXXXX","01234567890",T(1.0)),
2412  test_ab<T>("a[0:3] <=> b[6:]; (a == '6789X') and (b == '012345XXXX0')", "XXXXX","01234567890",T(1.0)),
2413  test_ab<T>("a[0:4] <=> b[6:]; (a == '67890') and (b == '012345XXXXX')", "XXXXX","01234567890",T(1.0)),
2414  test_ab<T>("var i := 0; a[0:i+0] := b[:]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
2415  test_ab<T>("var i := 0; a[0:i+1] := b[:]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
2416  test_ab<T>("var i := 0; a[0:i+2] := b[:]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
2417  test_ab<T>("var i := 0; a[0:i+3] := b[:]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
2418  test_ab<T>("var i := 0; a[0:i+4] := b[:]; a == '01234'", "XXXXX","01234567890",T(1.0)),
2419  test_ab<T>("var i := 0; a[0:i+0] <=> b[:]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
2420  test_ab<T>("var i := 0; a[0:i+1] <=> b[:]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
2421  test_ab<T>("var i := 0; a[0:i+2] <=> b[:]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
2422  test_ab<T>("var i := 0; a[0:i+3] <=> b[:]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
2423  test_ab<T>("var i := 0; a[0:i+4] <=> b[:]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
2424 
2425  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] := y[:]; x == '0XXXX'", "","",T(1.0)),
2426  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[:]; x == '01XXX'", "","",T(1.0)),
2427  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[:]; x == '012XX'", "","",T(1.0)),
2428  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[:]; x == '0123X'", "","",T(1.0)),
2429  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[:]; x == '01234'", "","",T(1.0)),
2430  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] := y[6:]; x == '6XXXX'", "","",T(1.0)),
2431  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[6:]; x == '67XXX'", "","",T(1.0)),
2432  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[6:]; x == '678XX'", "","",T(1.0)),
2433  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[6:]; x == '6789X'", "","",T(1.0)),
2434  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[6:]; x == '67890'", "","",T(1.0)),
2435  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] <=> y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
2436  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] <=> y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
2437  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] <=> y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
2438  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] <=> y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
2439  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] <=> y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
2440  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:0] <=> y[6:]; (x == '6XXXX') and (y == '012345X7890')", "","",T(1.0)),
2441  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] <=> y[6:]; (x == '67XXX') and (y == '012345XX890')", "","",T(1.0)),
2442  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] <=> y[6:]; (x == '678XX') and (y == '012345XXX90')", "","",T(1.0)),
2443  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] <=> y[6:]; (x == '6789X') and (y == '012345XXXX0')", "","",T(1.0)),
2444  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] <=> y[6:]; (x == '67890') and (y == '012345XXXXX')", "","",T(1.0)),
2445  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+0] := y[:]; x == '0XXXX'", "","",T(1.0)),
2446  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] := y[:]; x == '01XXX'", "","",T(1.0)),
2447  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] := y[:]; x == '012XX'", "","",T(1.0)),
2448  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] := y[:]; x == '0123X'", "","",T(1.0)),
2449  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] := y[:]; x == '01234'", "","",T(1.0)),
2450  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+0] <=> y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
2451  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] <=> y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
2452  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] <=> y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
2453  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] <=> y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
2454  test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] <=> y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
2455 
2456  test_ab<T>("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] += 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) + (v[] * 10)", "","",T(1.0)),
2457  test_ab<T>("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] -= 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) - (v[] * 10)", "","",T(1.0)),
2458  test_ab<T>("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] *= 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) * 10", "","",T(1.0)),
2459  test_ab<T>("var v[4] := {1,2,3,4}; for (var i := 0; i < v[]; i += 1) { v[i] /= 10; v[i] == 0 }; sum(v) == (1 + 2 + 3 + 4) / 10", "","",T(1.0)),
2460 
2461  test_ab<T>("a like b", "abcd", "abcd*", T(1.0)),
2462  test_ab<T>("a like b", "abcd", "abcd" , T(1.0)),
2463  test_ab<T>("a like b", "abcd", "abc*" , T(1.0)),
2464  test_ab<T>("a like b", "abcd", "*bcd" , T(1.0)),
2465  test_ab<T>("a like b", "abcd", "abc?" , T(1.0)),
2466  test_ab<T>("a like b", "abcd", "?bcd" , T(1.0)),
2467  test_ab<T>("a like b", "abcd", "ab?d" , T(1.0)),
2468  test_ab<T>("a like b", "abcd", "ab*d" , T(1.0)),
2469  test_ab<T>("a like b", "abcd", "a?cd" , T(1.0)),
2470  test_ab<T>("a like b", "abcd", "a*cd" , T(1.0)),
2471  test_ab<T>("a like b", "abcd", "a??d" , T(1.0)),
2472  test_ab<T>("a like b", "abcd", "a*?d" , T(1.0)),
2473  test_ab<T>("a like b", "abcd", "*bc*" , T(1.0)),
2474  test_ab<T>("a like b", "abcd", "?bc?" , T(1.0)),
2475  test_ab<T>("a like b", "abcd", "????" , T(1.0)),
2476  test_ab<T>("a like b", "abcd", "a???" , T(1.0)),
2477  test_ab<T>("a like b", "abcd", "ab??" , T(1.0)),
2478  test_ab<T>("a like b", "abcd", "abc?" , T(1.0)),
2479  test_ab<T>("a like b", "abcd", "???d" , T(1.0)),
2480  test_ab<T>("a like b", "abcd", "??cd" , T(1.0)),
2481  test_ab<T>("a like b", "abcd", "?bcd" , T(1.0)),
2482  test_ab<T>("a like b", "abcd", "?b?d" , T(1.0)),
2483  test_ab<T>("a like b", "abcd", "a?c?" , T(1.0)),
2484  test_ab<T>("a like b", "abcd", "a??d" , T(1.0)),
2485  test_ab<T>("a like b", "abcd", "?bc?" , T(1.0)),
2486  test_ab<T>("a like b", "abcd", "ab**" , T(1.0)),
2487  test_ab<T>("a like b", "abcd", "ab*?" , T(1.0)),
2488  test_ab<T>("a like b", "abcd", "a***" , T(1.0)),
2489  test_ab<T>("a like b", "abcd", "**cd" , T(1.0)),
2490  test_ab<T>("a like b", "abcd", "*?cd" , T(1.0)),
2491  test_ab<T>("a like b", "abcd", "***d" , T(1.0)),
2492  test_ab<T>("a like b", "abcd", "*bc*" , T(1.0)),
2493  test_ab<T>("a like b", "abcd", "*bc?" , T(1.0)),
2494  test_ab<T>("a like b", "abcd", "*b??" , T(1.0)),
2495  test_ab<T>("a like b", "abcd", "?bc*" , T(1.0)),
2496  test_ab<T>("a like b", "abcd", "??c*" , T(1.0)),
2497  test_ab<T>("a like b", "abcd", "*b?*" , T(1.0)),
2498  test_ab<T>("a like b", "ab" , "a*" , T(1.0)),
2499  test_ab<T>("a like b", "ab" , "a?" , T(1.0)),
2500 
2501  test_ab<T>("a ilike b", "aBcD", "abcd*", T(1.0)),
2502  test_ab<T>("a ilike b", "aBcD", "abcd" , T(1.0)),
2503  test_ab<T>("a ilike b", "aBcD", "abc*" , T(1.0)),
2504  test_ab<T>("a ilike b", "aBcD", "*bcd" , T(1.0)),
2505  test_ab<T>("a ilike b", "aBcD", "abc?" , T(1.0)),
2506  test_ab<T>("a ilike b", "aBcD", "?bcd" , T(1.0)),
2507  test_ab<T>("a ilike b", "aBcD", "ab?d" , T(1.0)),
2508  test_ab<T>("a ilike b", "aBcD", "ab*d" , T(1.0)),
2509  test_ab<T>("a ilike b", "aBcD", "a?cd" , T(1.0)),
2510  test_ab<T>("a ilike b", "aBcD", "a*cd" , T(1.0)),
2511  test_ab<T>("a ilike b", "aBcD", "a??d" , T(1.0)),
2512  test_ab<T>("a ilike b", "aBcD", "a*?d" , T(1.0)),
2513  test_ab<T>("a ilike b", "aBcD", "*bc*" , T(1.0)),
2514  test_ab<T>("a ilike b", "aBcD", "?bc?" , T(1.0)),
2515  test_ab<T>("a ilike b", "aBcD", "????" , T(1.0)),
2516  test_ab<T>("a ilike b", "aBcD", "a???" , T(1.0)),
2517  test_ab<T>("a ilike b", "aBcD", "ab??" , T(1.0)),
2518  test_ab<T>("a ilike b", "aBcD", "abc?" , T(1.0)),
2519  test_ab<T>("a ilike b", "aBcD", "???d" , T(1.0)),
2520  test_ab<T>("a ilike b", "aBcD", "??cd" , T(1.0)),
2521  test_ab<T>("a ilike b", "aBcD", "?bcd" , T(1.0)),
2522  test_ab<T>("a ilike b", "aBcD", "?b?d" , T(1.0)),
2523  test_ab<T>("a ilike b", "aBcD", "a?c?" , T(1.0)),
2524  test_ab<T>("a ilike b", "aBcD", "a??d" , T(1.0)),
2525  test_ab<T>("a ilike b", "aBcD", "?bc?" , T(1.0)),
2526  test_ab<T>("a ilike b", "aBcD", "ab**" , T(1.0)),
2527  test_ab<T>("a ilike b", "aBcD", "ab*?" , T(1.0)),
2528  test_ab<T>("a ilike b", "aBcD", "a***" , T(1.0)),
2529  test_ab<T>("a ilike b", "aBcD", "**cd" , T(1.0)),
2530  test_ab<T>("a ilike b", "aBcD", "*?cd" , T(1.0)),
2531  test_ab<T>("a ilike b", "aBcD", "***d" , T(1.0)),
2532  test_ab<T>("a ilike b", "aBcD", "*bc*" , T(1.0)),
2533  test_ab<T>("a ilike b", "aBcD", "*bc?" , T(1.0)),
2534  test_ab<T>("a ilike b", "aBcD", "*b??" , T(1.0)),
2535  test_ab<T>("a ilike b", "aBcD", "?bc*" , T(1.0)),
2536  test_ab<T>("a ilike b", "aBcD", "??c*" , T(1.0)),
2537  test_ab<T>("a ilike b", "aBcD", "*b?*" , T(1.0)),
2538  test_ab<T>("a ilike b", "aB" , "a*" , T(1.0)),
2539  test_ab<T>("a ilike b", "aB" , "a?" , T(1.0))
2540  };
2541 
2542  static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_ab<T>);
2543 
2544  {
2545  const std::size_t rounds = 50;
2546 
2547  for (std::size_t r = 0; r < rounds; ++r)
2548  {
2549  bool result = true;
2550 
2551  for (std::size_t i = 0; i < test_list_size; ++i)
2552  {
2553  test_ab<T>& test = const_cast<test_ab<T>&>(test_list[i]);
2554 
2555  std::string str_a;
2556  std::string str_b;
2557  std::string str_c;
2558 
2559  T r0 = T(2);
2560  T r1 = T(6);
2561  T r2 = T(7);
2562  T r3 = T(3);
2563 
2564  exprtk::symbol_table<T> symbol_table;
2565  symbol_table.add_stringvar("a", str_a);
2566  symbol_table.add_stringvar("b", str_b);
2567  symbol_table.add_stringvar("c", str_c);
2568  symbol_table.add_variable("r0", r0);
2569  symbol_table.add_variable("r1", r1);
2570  symbol_table.add_variable("r2", r2);
2571  symbol_table.add_variable("r3", r3);
2572 
2573  exprtk::expression<T> expression;
2574  expression.register_symbol_table(symbol_table);
2575 
2576  {
2578 
2579  if (!parser.compile(test.expr, expression))
2580  {
2581  printf("run_test02() - Error: %s Expression: %s\n",
2582  parser.error().c_str(),
2583  test.expr.c_str());
2584 
2585  result = false;
2586  continue;
2587  }
2588  }
2589 
2590  str_a = test.a;
2591  str_b = test.b;
2592  str_c = test.c;
2593 
2594  T expr_result = expression.value();
2595 
2596  if (not_equal(expr_result, test.result))
2597  {
2598  printf("run_test02() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\t"
2599  "a='%s'\tb='%s'\tc='%s'\n",
2600  test.expr.c_str(),
2601  (double)test.result,
2602  (double)expr_result,
2603  str_a.c_str(),
2604  str_b.c_str(),
2605  str_c.c_str());
2606 
2607  result = false;
2608  continue;
2609  }
2610  }
2611 
2612  if (!result)
2613  {
2614  return false;
2615  }
2616  }
2617  }
2618 
2619  {
2620  std::string s0;
2621  std::string s1;
2622 
2623  const std::string expression_str =
2624  " s0 := 'abc'; "
2625  " s0 := (s1 := '0123456789'[2:7]); "
2626  " s1 := 'xyz'; "
2627  " s0 < s1; ";
2628 
2629  exprtk::symbol_table<T> symbol_table;
2630  symbol_table.add_stringvar("s0" ,s0);
2631  symbol_table.add_stringvar("s1" ,s1);
2632 
2633  exprtk::expression<T> expression;
2634  expression.register_symbol_table(symbol_table);
2635 
2636  {
2638 
2639  if (!parser.compile(expression_str,expression))
2640  {
2641  printf("run_test02() - [2] Error: %s Expression: %s\n",
2642  parser.error().c_str(),
2643  expression_str.c_str());
2644 
2645  return false;
2646  }
2647  }
2648 
2649  if (T(0) == expression.value())
2650  {
2651  printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tExpected: True\n",
2652  expression_str.c_str());
2653 
2654  return false;
2655  }
2656  else if ("234567" != s0)
2657  {
2658  printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s0\n",
2659  expression_str.c_str());
2660 
2661  return false;
2662  }
2663  else if ("xyz" != s1)
2664  {
2665  printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s1\n",
2666  expression_str.c_str());
2667 
2668  return false;
2669  }
2670  }
2671 
2672  return true;
2673 }
2674 
2675 template <typename T>
2676 inline bool run_test03()
2677 {
2680  typedef exprtk::parser<T> parser_t;
2681 
2682  std::string expression_string = "A+A0+aA+Aa0+b+B1+Bb+bB1+A+A0+AA+AA0+B+B1+BB+BB1+a+a0+aa+aa0+b+b1+bb+bb1+"
2683  "c+C2+Cc+Cc2+D+D3+dD+dD3+C+C2+CC+CC2+D+D3+DD+DD3+c+c2+cc+cc2+d+d3+dd+dd3+"
2684  "E+E4+eE+Ee4+f+F5+Ff+fF5+E+E4+EE+EE4+F+F5+FF+FF5+e+e4+ee+ee4+f+f5+ff+ff5+"
2685  "g+G6+Gg+Gg6+H+H7+hH+hH7+G+G6+GG+GG6+H+H7+HH+HH7+g+g6+gg+gg6+h+h7+hh+hh7+"
2686  "I+I8+iI+Ii8+j+J9+Jj+jJ9+I+I8+II+II8+J+J9+JJ+JJ9+i+i8+ii+ii8+j+j9+jj+jj9+"
2687  "k+K0+Kk+Kk0+L+L1+lL+lL1+K+K0+KK+KK0+L+L1+LL+LL1+k+k0+kk+kk0+l+l1+ll+ll1+"
2688  "M+M2+mM+Mm2+n+N3+Nn+nN3+M+M2+MM+MM2+N+N3+NN+NN3+m+m2+mm+mm2+n+n3+nn+nn3+"
2689  "o+O4+Oo+Oo4+P+P5+pP+pP5+O+O4+OO+OO4+P+P5+PP+PP5+o+o4+oo+oo4+p+p5+pp+pp5+"
2690  "Q+Q6+qQ+Qq6+r+R7+Rr+rR7+Q+Q6+QQ+QQ6+R+R7+RR+RR7+q+q6+qq+qq6+r+r7+rr+rr7+"
2691  "s+S8+Ss+Ss8+T+T9+tT+tT9+S+S8+SS+SS8+T+T9+TT+TT9+s+s8+ss+ss8+t+t9+tt+tt9+"
2692  "U+U0+uU+Uu0+v+V1+Vv+vV1+U+U0+UU+UU0+V+V1+VV+VV1+u+u0+uu+uu0+v+v1+vv+vv1+"
2693  "w+W2+Ww+Ww2+X+X3+xX+xX3+W+W2+WW+WW2+X+X3+XX+XX3+w+w2+ww+ww2+x+x3+xx+xx3+"
2694  "Y+Y4+yY+Yy4+z+Z5+Zz+zZ5+Y+Y4+YY+YY4+Z+Z5+ZZ+ZZ5+y+y4+yy+yy4+z+z5+zz+zz5 ";
2695 
2696  static const std::string variable_list[] =
2697  {
2698  "A", "A0", "aA", "Aa0", "b", "B1", "Bb", "bB1",
2699  "c", "C2", "Cc", "Cc2", "D", "D3", "dD", "dD3",
2700  "E", "E4", "eE", "Ee4", "f", "F5", "Ff", "fF5",
2701  "g", "G6", "Gg", "Gg6", "H", "H7", "hH", "hH7",
2702  "I", "I8", "iI", "Ii8", "j", "J9", "Jj", "jJ9",
2703  "k", "K0", "Kk", "Kk0", "L", "L1", "lL", "lL1",
2704  "M", "M2", "mM", "Mm2", "n", "N3", "Nn", "nN3",
2705  "o", "O4", "Oo", "Oo4", "P", "P5", "pP", "pP5",
2706  "Q", "Q6", "qQ", "Qq6", "r", "R7", "Rr", "rR7",
2707  "s", "S8", "Ss", "Ss8", "T", "T9", "tT", "tT9",
2708  "U", "U0", "uU", "Uu0", "v", "V1", "Vv", "vV1",
2709  "w", "W2", "Ww", "Ww2", "X", "X3", "xX", "xX3",
2710  "Y", "Y4", "yY", "Yy4", "z", "Z5", "Zz", "zZ5"
2711  };
2712 
2713  static const std::size_t variable_list_size = sizeof(variable_list) / sizeof(std::string);
2714 
2715  static const std::size_t rounds = 300;
2716 
2717  for (std::size_t r = 0; r < rounds; ++r)
2718  {
2719  symbol_table_t symbol_table_0;
2720  symbol_table_t symbol_table_1;
2721  expression_t expression;
2722 
2723  std::vector<T> v;
2724  v.resize(variable_list_size);
2725 
2726  for (std::size_t i = 0; i < variable_list_size; ++i)
2727  {
2728  v[i] = T(i);
2729  if (i & 1)
2730  symbol_table_0.add_variable(variable_list[i],v[i]);
2731  else
2732  symbol_table_1.add_variable(variable_list[i],v[i]);
2733  }
2734 
2735  std::size_t total_symbol_count = symbol_table_0.variable_count() +
2736  symbol_table_1.variable_count();
2737 
2738  if (variable_list_size != total_symbol_count)
2739  {
2740  printf("run_test03() - Error - Invalid number of variables in symbol_table! Expected: %d got: %d\n",
2741  static_cast<unsigned int>(variable_list_size),
2742  static_cast<unsigned int>(total_symbol_count));
2743 
2744  return false;
2745  }
2746 
2747  symbol_table_0.add_constants();
2748 
2749  expression.register_symbol_table(symbol_table_0);
2750  expression.register_symbol_table(symbol_table_1);
2751 
2752  {
2754 
2755  if (!parser.compile(expression_string,expression))
2756  {
2757  printf("run_test03() - Error: %s Expression: %s\n",
2758  parser.error().c_str(),
2759  expression_string.c_str());
2760 
2761  return false;
2762  }
2763  }
2764 
2765  expression.value();
2766  }
2767 
2768  {
2769  static const std::string invalid_expr[] =
2770  {
2771  "x y",
2772  "x y z",
2773  "x y z w",
2774  "x 1",
2775  "x 1 2",
2776  "x 1 2 3",
2777  "x 'abc'",
2778  "x 1 'abc'",
2779  "x 'abc' 1",
2780  "1 2",
2781  "1 2 3",
2782  "1 2 3 4",
2783  "'abc' 'xyz'",
2784  "'abc' 1",
2785  "1 'abc'",
2786  "x sin(1)",
2787  "s 'abc'",
2788  "s x",
2789  "s y",
2790  "s 1",
2791  "s 1 x",
2792  "s 1 y",
2793  "s x 1",
2794  "s y 1",
2795  "x s ",
2796  "y s ",
2797  "1 s ",
2798  "1 s x",
2799  "1 s y",
2800  "x s 1",
2801  "y s 1",
2802  "v 'abc'",
2803  "v x ",
2804  "v y ",
2805  "v s ",
2806  "v 1 ",
2807  "v 1 x",
2808  "v 1 y",
2809  "v 1 s",
2810  "v x 1",
2811  "v y 1",
2812  "v s 1",
2813  "x v ",
2814  "y v ",
2815  "1 v ",
2816  "1 v x",
2817  "1 v y",
2818  "x v 1",
2819  "y v 1",
2820 
2821  "(x == 'a string' )",
2822  "(x == 'a string'[1:2] )",
2823  "(x == 'a string' + 'b string' )",
2824  "(x == ('a string' + 'b string')[3:5])",
2825  "('a string' == x )",
2826  "('a string'[1:2] == x )",
2827  "('a string' + 'b string' == x )",
2828  "(('a string' + 'b string')[3:5] == x)",
2829 
2830  "var a; var b; 3in(a)+sin(b) ",
2831  "var a; var b; sin(a)+3in(b) ",
2832  "var a; var b; sqrt(a)<3in(8) ",
2833  "var a; var b; (1.99-3in((b-b))) ",
2834  "var a; var b; ((3in(sin((b+b)))/1.06)-a) ",
2835  "var a; var b; ((sin(3in((b+b)))/1.06)-a) ",
2836  "var a; var b; (3in(x*(y+z))+cos(x*(y-z))) ",
2837  "var a; var b; (cos(x*(y+z))+3in(x*(y-z))) ",
2838 
2839  "1++++",
2840  "1+-+-+",
2841  "1===",
2842  "1====",
2843  "[*][*][*][*][*]",
2844 
2845  "var v[1] := {}; var s0appe0 := false; repeat s0appe0 false for(){(){}}",
2846  "var v[2] := {}; repeat var s0appe0 := false; s0appe0 false for(){(){}}",
2847  "var v[3] := {}; repeat var s0appe0 := false; for(){(){}} s0appe0 false",
2848  "var v[4] := {}; repeat var s0appe0 := false; s0appe0 for(){(){}} false",
2849  "var v[5] := {}; repeat for(){(){}} var s0appe0 := false; s0appe0 false",
2850  "var v{};v ;v 60;v 60;v o5"
2851  };
2852 
2853  const std::size_t invalid_expr_size = sizeof(invalid_expr) / sizeof(std::string);
2854 
2855  {
2856  for (std::size_t i = 0; i < invalid_expr_size; ++i)
2857  {
2858  symbol_table_t symbol_table;
2859  expression_t expression;
2860  parser_t parser;
2861 
2862  T x = T(0);
2863  std::string s;
2864  std::vector<T> v(10, T(1.234));
2865 
2866  symbol_table.add_variable ("x",x);
2867  symbol_table.add_stringvar("s",s);
2868  symbol_table.add_vector ("v",v);
2869 
2870  if (parser.compile(invalid_expr[i],expression))
2871  {
2872  printf("run_test03() - Error: [1] Invalid expression compiled successfuly. Expression: %s\n",
2873  invalid_expr[i].c_str());
2874 
2875  return false;
2876  }
2877  }
2878  }
2879 
2880  {
2881  T x = T(0);
2882  std::string s;
2883  std::vector<T> v(10, T(1.234));
2884 
2885  symbol_table_t symbol_table;
2886  parser_t parser;
2887 
2888  symbol_table.add_variable ("x",x);
2889  symbol_table.add_stringvar("s",s);
2890  symbol_table.add_vector ("v",v);
2891 
2892  for (std::size_t i = 0; i < invalid_expr_size; ++i)
2893  {
2894  exprtk::expression<T> expression;
2895 
2896  if (parser.compile(invalid_expr[i],expression))
2897  {
2898  printf("run_test03() - Error: [2] Invalid expression compiled successfuly. Expression: %s\n",
2899  invalid_expr[i].c_str());
2900 
2901  return false;
2902  }
2903  }
2904  }
2905 
2906  {
2907  const std::string base_expression =
2908  "1+(2+2(3+3(4+4cos(((((a+((x*(e-tan((cos((((((b/(tan(((1.60*a)-0.34))-0.76))-x)+y)-3.27)+a))/pi))))^a))+y)*b)-e))+e)/z)+w)+"
2909  "(((b+(a/((((tan((b*((((((a-(cos((cos(tan(((a+a)*3.33)))-b))/2.52))*x)/b)+3.07)^0.86)+b)))*3.95)/0.39)*y)+a)))*a)*z)";
2910 
2911  const std::string mod =
2912  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789^+-/*,;:<>=%?[]{}() #&'\"\\\t\r\n";
2913 
2914  symbol_table_t symbol_table;
2915  expression_t expression;
2916  parser_t parser;
2917 
2918  T a = T(1.1 );
2919  T b = T(2.2 );
2920  T c = T(3.3 );
2921  T d = T(4.5 );
2922  T e = T(4.5 );
2923  T x = T(2.123456);
2924  T y = T(3.123456);
2925  T z = T(4.123456);
2926  T w = T(5.123456);
2927 
2928  symbol_table.add_variable("a", a);
2929  symbol_table.add_variable("b", b);
2930  symbol_table.add_variable("c", c);
2931  symbol_table.add_variable("d", d);
2932  symbol_table.add_variable("e", e);
2933 
2934  symbol_table.add_variable("x", x);
2935  symbol_table.add_variable("y", y);
2936  symbol_table.add_variable("z", z);
2937  symbol_table.add_variable("w", w);
2938 
2939  expression.register_symbol_table(symbol_table);
2940 
2941  T total = T(0);
2942 
2943  for (std::size_t j = 0; j < base_expression.size(); ++j)
2944  {
2945  std::string expression_str = base_expression;
2946  const char old_c = base_expression[j];
2947 
2948  for (std::size_t i = 0; i < mod.size(); ++i)
2949  {
2950  expression_str[j] = mod[i];
2951 
2952  if (parser.compile(expression_str, expression))
2953  {
2954  total += expression.value();
2955  }
2956  }
2957 
2958  expression_str[j] = old_c;
2959  }
2960 
2961  if (total == T(12345.6789)) { printf(" "); }
2962  }
2963  }
2964 
2965  return true;
2966 }
2967 
2968 template <typename T>
2969 inline T clamp(const T& l, const T& v, const T& u)
2970 {
2971  return (v < l) ? l : ((v > u) ? u : v);
2972 }
2973 
2974 template <typename T>
2975 inline bool run_test04()
2976 {
2977  std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(y / 2 * pi),+1.0)";
2978 
2979  exprtk::symbol_table<T> symbol_table;
2980  exprtk::expression<T> expression;
2981 
2982  T x = T(-1000);
2983  T y = T(-1000);
2984 
2985  symbol_table.add_variable("x",x);
2986  symbol_table.add_variable("y",y);
2987  symbol_table.add_constants();
2988 
2989  expression.register_symbol_table(symbol_table);
2990 
2991  {
2993 
2994  if (!parser.compile(expression_string,expression))
2995  {
2996  printf("run_test04() - Error: %s Expression: %s\n",
2997  parser.error().c_str(),
2998  expression_string.c_str());
2999 
3000  return false;
3001  }
3002  }
3003 
3004  const T pi = T(3.141592653589793238462643383279502);
3005  const T increment = T(0.0001);
3006 
3007  while ((x <= T(+1000)) && (y <= T(+1000)))
3008  {
3009  T result1 = expression.value();
3010  T result2 = clamp<T>(-1.0,std::sin(2 * pi * x) + std::cos(y / 2 * pi),+1.0);
3011 
3012  if (not_equal(result1,result2))
3013  {
3014  printf("run_test04() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\n",
3015  expression_string.c_str(),
3016  (double)result1,
3017  (double)result2,
3018  (double)x,
3019  (double)y);
3020 
3021  return false;
3022  }
3023 
3024  x += increment;
3025  y += increment;
3026  }
3027 
3028  return true;
3029 }
3030 
3031 template <typename T>
3032 inline bool run_test05()
3033 {
3035  std::string expression_string = "clamp(-1.0,sin(2 * pi * x_var123) + cos(y_var123 / 2 * pi),+1.0)";
3036 
3037  exprtk::symbol_table<T> symbol_table;
3038  std::deque<expression_t> expression_list;
3039 
3040  T x = T(-1000);
3041  T y = T(-1000);
3042 
3043  symbol_table.add_variable("x_var123",x);
3044  symbol_table.add_variable("y_var123",y);
3045  symbol_table.add_constants();
3046 
3047  const std::size_t expression_count = 10;
3048  for (std::size_t i = 0; i < expression_count; ++i)
3049  {
3050  expression_t e;
3051  e.register_symbol_table(symbol_table);
3052 
3053  {
3055 
3056  if (!parser.compile(expression_string,e))
3057  {
3058  printf("run_test05() - Error: %s Expression: %s\n",
3059  parser.error().c_str(),
3060  expression_string.c_str());
3061 
3062  return false;
3063  }
3064  }
3065 
3066  expression_list.push_back(e);
3067  }
3068 
3069  const T pi = T(3.141592653589793238462643383279502);
3070  const T increment = T(0.001);
3071 
3072  while ((x <= T(+1000)) && (y <= T(+1000)))
3073  {
3074  T real_result = clamp<T>(-1.0,std::sin(2 * pi * x) + std::cos(y / 2 * pi),+1.0);
3075 
3076  for (std::size_t i = 0; i < expression_list.size(); ++i)
3077  {
3078  expression_t& expr = expression_list[i];
3079 
3080  T result = expr.value();
3081 
3082  if (not_equal(result,real_result))
3083  {
3084  printf("run_test05() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\tIndex:%d\n",
3085  expression_string.c_str(),
3086  (double)real_result,
3087  (double)result,
3088  (double)x,
3089  (double)y,
3090  static_cast<unsigned int>(i));
3091 
3092  return false;
3093  }
3094  }
3095 
3096  x += increment;
3097  y += increment;
3098  }
3099 
3100  return true;
3101 }
3102 
3103 template <typename T>
3104 inline bool run_test06()
3105 {
3107  std::string expression_string = "sqrt(1 - (x^2))";
3108 
3109  T x = T(0);
3110 
3111  exprtk::symbol_table<T> symbol_table;
3112  symbol_table.add_variable("x",x);
3113 
3114  expression_t expression;
3115  expression.register_symbol_table(symbol_table);
3116 
3117  {
3119 
3120  if (!parser.compile(expression_string,expression))
3121  {
3122  printf("run_test06() - Error: %s Expression: %s\n",
3123  parser.error().c_str(),
3124  expression_string.c_str());
3125 
3126  return false;
3127  }
3128  }
3129 
3130  T total_area1 = exprtk::integrate(expression,x,T(-1),T(1));
3131  T total_area2 = exprtk::integrate(expression,"x",T(-1),T(1));
3132  const T pi = T(3.141592653589793238462643383279502);
3133 
3134  if (not_equal(total_area1,total_area2,T(0.000001)))
3135  {
3136  printf("run_test06() - Integration Error: area1 != area2\n");
3137  return false;
3138  }
3139 
3140  if (not_equal(total_area1,T(pi) / T(2),T(0.000001)))
3141  {
3142  printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n",
3143  (double)(pi / T(2)),
3144  (double)total_area1);
3145 
3146  return false;
3147  }
3148 
3149  return true;
3150 }
3151 
3152 template <typename T>
3153 inline bool run_test07()
3154 {
3156  std::string expression_string = "sin(2x + 1 / 3)";
3157 
3158  T x = T(0);
3159 
3160  exprtk::symbol_table<T> symbol_table;
3161  symbol_table.add_variable("x",x);
3162 
3163  expression_t expression;
3164  expression.register_symbol_table(symbol_table);
3165 
3166  {
3168 
3169  if (!parser.compile(expression_string,expression))
3170  {
3171  printf("run_test07() - Error: %s Expression: %s\n",
3172  parser.error().c_str(),
3173  expression_string.c_str());
3174 
3175  return false;
3176  }
3177  }
3178 
3179  for (x = T(-200); x < T(200); x += T(0.0001))
3180  {
3181  {
3182  T deriv1_real_result = T(2) * std::cos(T(2) * x + T(1.0 / 3.0));
3183  T deriv1_result1 = exprtk::derivative(expression,x);
3184  T deriv1_result2 = exprtk::derivative(expression,"x");
3185 
3186  if (not_equal(deriv1_result1,deriv1_result2,T(0.00001)))
3187  {
3188  printf("run_test07() - 1st Derivative Error: result1 != result2\n");
3189  return false;
3190  }
3191 
3192  if (not_equal(deriv1_result1,deriv1_real_result,T(0.00001)))
3193  {
3194  printf("run_test07() - 1st Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3195  (double)x,
3196  (double)deriv1_real_result,
3197  (double)deriv1_result1);
3198 
3199  return false;
3200  }
3201  }
3202 
3203  {
3204  T deriv2_real_result = T(-4) * std::sin(T(2) * x + T(1.0 / 3.0));
3205  T deriv2_result1 = exprtk::second_derivative(expression,x);
3206  T deriv2_result2 = exprtk::second_derivative(expression,"x");
3207 
3208  if (not_equal(deriv2_result1,deriv2_result2,T(0.0000001)))
3209  {
3210  printf("run_test07() - 2nd Derivative Error: result1 != result2\n");
3211  return false;
3212  }
3213 
3214  if (not_equal(deriv2_result1,deriv2_real_result,T(0.01)))
3215  {
3216  printf("run_test07() - 2nd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3217  (double)x,
3218  (double)deriv2_real_result,
3219  (double)deriv2_result1);
3220 
3221  return false;
3222  }
3223  }
3224 
3225  {
3226  T deriv3_real_result = T(-8) * std::cos(T(2) * x + T(1.0 / 3.0));
3227  T deriv3_result1 = exprtk::third_derivative(expression,x);
3228  T deriv3_result2 = exprtk::third_derivative(expression,"x");
3229 
3230  if (not_equal(deriv3_result1,deriv3_result2,T(0.0000001)))
3231  {
3232  printf("run_test07() - 3rd Derivative Error: result1 != result2\n");
3233  return false;
3234  }
3235 
3236  if (not_equal(deriv3_result1,deriv3_real_result,T(0.01)))
3237  {
3238  printf("run_test07() - 3rd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3239  (double)x,
3240  (double)deriv3_real_result,
3241  (double)deriv3_result1);
3242 
3243  return false;
3244  }
3245  }
3246  }
3247 
3248  return true;
3249 }
3250 
3251 template <typename T>
3252 inline bool run_test08()
3253 {
3254 
3255  static const std::string expr_str[] =
3256  {
3257  "x", "y", "z", "w", "u",
3258  "x + y + z + w + u",
3259  "x + y / z * w ^ u",
3260  "x:=1.1", "y:=2.2", "z:=3.3", "w:=4.4", "u:=5.5",
3261  "x:=x+1.1", "y:=y+2.2", "z:=z+3.3", "w:=w+4.4", "u:=u+5.5",
3262  "x:=1.1+x", "y:=2.2+y", "z:=3.3+z", "w:=4.4+w", "u:=5.5+u",
3263  "x:=(x <= 1.1)",
3264  "y:=(2.2 >= y)",
3265  "z:=(3.3 and z)",
3266  "w:=(4.4 or w)",
3267  "u:=(u xor 5.5)",
3268  "min(x,y) + min(x,y,z) + min(x,y,z,w) + min(x,y,z,w,y)",
3269  "max(x,y) + max(x,y,z) + max(x,y,z,w) + max(x,y,z,w,y)",
3270  "avg(x,y)",
3271  "avg(x,y,z)",
3272  "avg(x,y,z,w)",
3273  "avg(x,y,z,w,u)",
3274  "(u := u := min(x:=1,y:=2,z:=3)) == 1",
3275  "(2x+3y+4z+5w)==(2*x+3*y+4*z+5*w)",
3276  "(3(x+y)/2+1)==(3*(x+y)/2+1)",
3277  "((x+y)3+1/4)==((x+y)*3+1/4)",
3278  "((x+y)z+1/2)==((x+y)*z+1/2)",
3279  "(x+y^3/z) == (x+(y*y*y)/z)",
3280  "(z-x^3+y^2*7) == (z-(x*x*x)+(y*y)*7)",
3281  "(3min(x,y))==(3*min(x,y))",
3282  "(sin(x)y)==(sin(x)*y)",
3283  "(sin(x)cos(y)+1)==(sin(x)*cos(y)+1)",
3284  "(sgn(sin(x))cos(sgn(y))+1)==(sgn(sin(x))*cos(sgn(y))+1)",
3285  "equal($f00(x,y,z),(x+y)/z)",
3286  "equal($f01(x,y,z),(x+y)*z)",
3287  "equal($f02(x,y,z),(x+y)-z)",
3288  "equal($f03(x,y,z),(x+y)+z)",
3289  "equal($f04(x,y,z),(x-y)+z)",
3290  "equal($f05(x,y,z),(x-y)/z)",
3291  "equal($f06(x,y,z),(x-y)*z)",
3292  "equal($f07(x,y,z),(x*y)+z)",
3293  "equal($f08(x,y,z),(x*y)-z)",
3294  "equal($f09(x,y,z),(x*y)/z)",
3295  "equal($f10(x,y,z),(x*y)*z)",
3296  "equal($f11(x,y,z),(x/y)+z)",
3297  "equal($f12(x,y,z),(x/y)-z)",
3298  "equal($f13(x,y,z),(x/y)/z)",
3299  "equal($f14(x,y,z),(x/y)*z)",
3300  "equal($f15(x,y,z),x/(y+z))",
3301  "equal($f16(x,y,z),x/(y-z))",
3302  "equal($f17(x,y,z),x/(y*z))",
3303  "equal($f18(x,y,z),x/(y/z))",
3304  "equal($f19(x,y,z),x*(y+z))",
3305  "equal($f20(x,y,z),x*(y-z))",
3306  "equal($f21(x,y,z),x*(y*z))",
3307  "equal($f22(x,y,z),x*(y/z))",
3308  "equal($f23(x,y,z),x-(y+z))",
3309  "equal($f24(x,y,z),x-(y-z))",
3310  "equal($f25(x,y,z),x-(y/z))",
3311  "equal($f26(x,y,z),x-(y*z))",
3312  "equal($f27(x,y,z),x+(y*z))",
3313  "equal($f28(x,y,z),x+(y/z))",
3314  "equal($f29(x,y,z),x+(y+z))",
3315  "equal($f30(x,y,z),x+(y-z))",
3316  "equal($f31(x,y,z),x*y^2+z)",
3317  "equal($f32(x,y,z),x*y^3+z)",
3318  "equal($f33(x,y,z),x*y^4+z)",
3319  "equal($f34(x,y,z),x*y^5+z)",
3320  "equal($f35(x,y,z),x*y^6+z)",
3321  "equal($f36(x,y,z),x*y^7+z)",
3322  "equal($f37(x,y,z),x*y^8+z)",
3323  "equal($f38(x,y,z),x*y^9+z)",
3324  "equal($f39(x,y,z),x*log(y)+z)",
3325  "equal($f40(x,y,z),x*log(y)-z)",
3326  "equal($f41(x,y,z),x*log10(y)+z)",
3327  "equal($f42(x,y,z),x*log10(y)-z)",
3328  "equal($f43(x,y,z),x*sin(y)+z)",
3329  "equal($f44(x,y,z),x*sin(y)-z)",
3330  "equal($f45(x,y,z),x*cos(y)+z)",
3331  "equal($f46(x,y,z),x*cos(y)-z)",
3332  "equal($f47(x,y,z),if(0!=x,y,z))",
3333  "equal($f48(x,y,z,w),x+((y+z)/w))",
3334  "equal($f49(x,y,z,w),x+((y+z)*w))",
3335  "equal($f50(x,y,z,w),x+((y-z)/w))",
3336  "equal($f51(x,y,z,w),x+((y-z)*w))",
3337  "equal($f52(x,y,z,w),x+((y*z)/w))",
3338  "equal($f53(x,y,z,w),x+((y*z)*w))",
3339  "equal($f54(x,y,z,w),x+((y/z)+w))",
3340  "equal($f55(x,y,z,w),x+((y/z)/w))",
3341  "equal($f56(x,y,z,w),x+((y/z)*w))",
3342  "equal($f57(x,y,z,w),x-((y+z)/w))",
3343  "equal($f58(x,y,z,w),x-((y+z)*w))",
3344  "equal($f59(x,y,z,w),x-((y-z)/w))",
3345  "equal($f60(x,y,z,w),x-((y-z)*w))",
3346  "equal($f61(x,y,z,w),x-((y*z)/w))",
3347  "equal($f62(x,y,z,w),x-((y*z)*w))",
3348  "equal($f63(x,y,z,w),x-((y/z)/w))",
3349  "equal($f64(x,y,z,w),x-((y/z)*w))",
3350  "equal($f65(x,y,z,w),((x+y)*z)-w)",
3351  "equal($f66(x,y,z,w),((x-y)*z)-w)",
3352  "equal($f67(x,y,z,w),((x*y)*z)-w)",
3353  "equal($f68(x,y,z,w),((x/y)*z)-w)",
3354  "equal($f69(x,y,z,w),((x+y)/z)-w)",
3355  "equal($f70(x,y,z,w),((x-y)/z)-w)",
3356  "equal($f71(x,y,z,w),((x*y)/z)-w)",
3357  "equal($f72(x,y,z,w),((x/y)/z)-w)",
3358  "equal($f73(x,y,z,w),(x*y)+(z*w))",
3359  "equal($f74(x,y,z,w),(x*y)-(z*w))",
3360  "equal($f75(x,y,z,w),(x*y)+(z/w))",
3361  "equal($f76(x,y,z,w),(x*y)-(z/w))",
3362  "equal($f77(x,y,z,w),(x/y)+(z/w))",
3363  "equal($f78(x,y,z,w),(x/y)-(z/w))",
3364  "equal($f79(x,y,z,w),(x/y)-(z*w))",
3365  "equal($f80(x,y,z,w),x/(y+(z*w)))",
3366  "equal($f81(x,y,z,w),x/(y-(z*w)))",
3367  "equal($f82(x,y,z,w),x*(y+(z*w)))",
3368  "equal($f83(x,y,z,w),x*(y-(z*w)))",
3369  "equal($f84(x,y,z,w),x*y^2+z*w^2)",
3370  "equal($f85(x,y,z,w),x*y^3+z*w^3)",
3371  "equal($f86(x,y,z,w),x*y^4+z*w^4)",
3372  "equal($f87(x,y,z,w),x*y^5+z*w^5)",
3373  "equal($f88(x,y,z,w),x*y^6+z*w^6)",
3374  "equal($f89(x,y,z,w),x*y^7+z*w^7)",
3375  "equal($f90(x,y,z,w),x*y^8+z*w^8)",
3376  "equal($f91(x,y,z,w),x*y^9+z*w^9)",
3377  "equal($f92(x,y,z,w),if(x and y,z,w))",
3378  "equal($f93(x,y,z,w),if(x or y,z,w))",
3379  "equal($f94(x,y,z,w),if(x < y,z,w))",
3380  "equal($f95(x,y,z,w),if(x <= y,z,w))",
3381  "equal($f96(x,y,z,w),if(x > y,z,w))",
3382  "equal($f97(x,y,z,w),if(x >= y,z,w))",
3383  "equal($f98(x,y,z,w),if(equal(x,y),z,w))",
3384  "equal($f92(x,y,z,w),x and y ? z : w)",
3385  "equal($f93(x,y,z,w),x or y ? z : w)",
3386  "equal($f94(x,y,z,w),x < y ? z : w)",
3387  "equal($f95(x,y,z,w),x <= y ? z : w)",
3388  "equal($f96(x,y,z,w),x > y ? z : w)",
3389  "equal($f97(x,y,z,w),x >= y ? z : w)",
3390  "equal($f98(x,y,z,w),equal(x,y) ? z : w)",
3391  "equal($f99(x,y,z,w),x*sin(y)+z*cos(w))"
3392  };
3393  static const std::size_t expr_str_size = sizeof(expr_str) / sizeof(std::string);
3394 
3395  static const std::size_t rounds = 25;
3396 
3397  for (std::size_t i = 0; i < rounds; ++i)
3398  {
3399  for (std::size_t j = 0; j < expr_str_size; ++j)
3400  {
3402 
3403  T x = T(1.12345);
3404  T y = T(2.12345);
3405  T z = T(3.12345);
3406  T w = T(4.12345);
3407  T u = T(5.12345);
3408 
3409  exprtk::symbol_table<T> symbol_table;
3410  symbol_table.add_variable("x",x);
3411  symbol_table.add_variable("y",y);
3412  symbol_table.add_variable("z",z);
3413  symbol_table.add_variable("w",w);
3414  symbol_table.add_variable("u",u);
3415 
3416  expression_t expression;
3417  expression.register_symbol_table(symbol_table);
3418 
3419  {
3421 
3422  if (!parser.compile(expr_str[j],expression))
3423  {
3424  printf("run_test08() - Error: %s Expression: %s\n",
3425  parser.error().c_str(),
3426  expr_str[j].c_str());
3427 
3428  return false;
3429  }
3430  }
3431 
3432  expression.value();
3433  }
3434  }
3435 
3436  return true;
3437 }
3438 
3439 template <typename T>
3440 struct myfunc : public exprtk::ifunction<T>
3441 {
3443 
3444  myfunc() : exprtk::ifunction<T>(2) {}
3445 
3446  inline T operator()(const T& v1, const T& v2)
3447  {
3448  return T(1) + (v1 * v2) / T(3);
3449  }
3450 };
3451 
3452 #define define_free_functions(N,Type) \
3453 Type N##1(Type v0) { return v0; } \
3454 Type N##2(Type v0, Type v1) { return v0 + v1; } \
3455 Type N##3(Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
3456 Type N##4(Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
3457 Type N##5(Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
3458 Type N##6(Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \
3459 
3461 #undef define_free_functions
3462 
3463 template <typename T>
3464 inline bool run_test09()
3465 {
3466  {
3467  static const std::size_t rounds = 1000;
3468  for (std::size_t i = 0; i < rounds; ++i)
3469  {
3471  std::string expression_string = "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3472  "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3473  "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3474  "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3475  "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3476  "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3477  "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3478  "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3479  "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3480  "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3481  "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3482  "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3483  "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3484  "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3485  "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3486  "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3487  "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3488  "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3489  "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3490  "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)";
3491 
3492  T x = T(1) + (i / T(10000));
3493  T y = T(2) + (i / T(10000));
3494  myfunc<T> mf;
3495 
3496  exprtk::symbol_table<T> symbol_table;
3497  symbol_table.add_variable("x",x);
3498  symbol_table.add_variable("y",y);
3499  symbol_table.add_function("myfunc0",mf);
3500  symbol_table.add_function("myfunc1",mf);
3501  symbol_table.add_function("myfunc2",mf);
3502  symbol_table.add_function("myfunc3",mf);
3503  symbol_table.add_function("myfunc4",mf);
3504  symbol_table.add_function("myfunc5",mf);
3505  symbol_table.add_function("myfunc6",mf);
3506  symbol_table.add_function("myfunc7",mf);
3507  symbol_table.add_function("myfunc8",mf);
3508  symbol_table.add_function("myfunc9",mf);
3509  symbol_table.add_constants();
3510 
3511  expression_t expression;
3512  expression.register_symbol_table(symbol_table);
3513 
3514  {
3516 
3517  if (!parser.compile(expression_string,expression))
3518  {
3519  printf("run_test09() - Error: %s Expression: %s\n",
3520  parser.error().c_str(),
3521  expression_string.c_str());
3522 
3523  return false;
3524  }
3525  }
3526 
3527  const T pi = T(3.141592653589793238462643383279502);
3528 
3529  T result = expression.value();
3530 
3531  T expected = T(4) *
3532  (
3533  mf(sin(x*pi),y / T(2)) +
3534  mf(sin(x*pi),y / T(2)) +
3535  mf(sin(x*pi),y / T(2)) +
3536  mf(sin(x*pi),y / T(2)) +
3537  mf(sin(x*pi),y / T(2)) +
3538  mf(sin(x*pi),y / T(2)) +
3539  mf(sin(x*pi),y / T(2)) +
3540  mf(sin(x*pi),y / T(2)) +
3541  mf(sin(x*pi),y / T(2)) +
3542  mf(sin(x*pi),y / T(2))
3543  );
3544 
3545  if (not_equal(result,expected,T(0.0000001)))
3546  {
3547  printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n",
3548  (double)expected,
3549  (double)result);
3550 
3551  return false;
3552  }
3553  }
3554  }
3555 
3556  {
3559 
3560  bool result = true;
3561 
3562  const std::string expression_list[] =
3563  {
3564  "foo1(1) == 1",
3565  "foo2(1,2) == (1 + 2)",
3566  "foo3(1,2,3) == (1 + 2 + 3)",
3567  "foo4(1,2,3,4) == (1 + 2 + 3 + 4)",
3568  "foo5(1,2,3,4,5) == (1 + 2 + 3 + 4 + 5)",
3569  "foo6(1,2,3,4,5,6) == (1 + 2 + 3 + 4 + 5 + 6)"
3570  };
3571 
3572  const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
3573 
3574  symbol_table_t symbol_table;
3575 
3576  symbol_table.add_function("foo1",foo1);
3577  symbol_table.add_function("foo2",foo2);
3578  symbol_table.add_function("foo3",foo3);
3579  symbol_table.add_function("foo4",foo4);
3580  symbol_table.add_function("foo5",foo5);
3581  symbol_table.add_function("foo6",foo6);
3582 
3583  for (std::size_t i = 0; i < expression_list_size; ++i)
3584  {
3585  expression_t expression;
3586  expression.register_symbol_table(symbol_table);
3587 
3589 
3590  if (!parser.compile(expression_list[i],expression))
3591  {
3592  printf("run_test09() - Error: %s Expression: %s\n",
3593  parser.error().c_str(),
3594  expression_list[i].c_str());
3595 
3596  result = false;
3597  }
3598  }
3599 
3600  if (!result)
3601  return false;
3602  }
3603 
3604  return true;
3605 }
3606 
3607 template <typename T>
3608 inline bool run_test10()
3609 {
3611 
3612  T x = T(1.1);
3613  T y = T(2.2);
3614  T xx = T(3.3);
3615  T yy = T(4.4);
3616 
3617  std::string i_s = "A String";
3618  std::string j_s = "Another String";
3619  std::string ii_s = "A String";
3620  std::string jj_s = "Another String";
3621 
3622  struct test
3623  {
3624  static inline bool variable(exprtk::symbol_table<T>& symbol_table, const std::string& variable_name, const T& value)
3625  {
3626  exprtk::details::variable_node<T>* var = symbol_table.get_variable(variable_name);
3627 
3628  if (var)
3629  return (!not_equal(var->ref(),value));
3630  else
3631  return false;
3632  }
3633 
3634  static inline bool string(exprtk::symbol_table<T>& symbol_table, const std::string& string_name, const std::string& str)
3635  {
3636  exprtk::details::stringvar_node<T>* str_node = symbol_table.get_stringvar(string_name);
3637 
3638  if (str_node)
3639  return (str_node->ref() == str);
3640  else
3641  return false;
3642  }
3643  };
3644 
3645  {
3646  static const std::size_t rounds = 10;
3647 
3648  exprtk::symbol_table<T> symbol_table;
3649 
3650  for (std::size_t r = 0; r < rounds; ++r)
3651  {
3652  symbol_table.add_variable("x", x);
3653  symbol_table.add_variable("y", y);
3654  symbol_table.add_variable("xx", xx);
3655  symbol_table.add_variable("yy", yy);
3656 
3657  if (!symbol_table.symbol_exists("x"))
3658  {
3659  printf("run_test10() - Symbol 'x' does not exist!\n");
3660  return false;
3661  }
3662  else if (!symbol_table.symbol_exists("y"))
3663  {
3664  printf("run_test10() - Symbol 'y' does not exist!\n");
3665  return false;
3666  }
3667  else if (!symbol_table.symbol_exists("xx"))
3668  {
3669  printf("run_test10() - Symbol 'xx' does not exist!\n");
3670  return false;
3671  }
3672  else if (!symbol_table.symbol_exists("yy"))
3673  {
3674  printf("run_test10() - Symbol 'yy' does not exist!\n");
3675  return false;
3676  }
3677  else if (!test::variable(symbol_table, "x", x))
3678  {
3679  printf("run_test10() - Symbol 'x' value failure!\n");
3680  return false;
3681  }
3682  else if (!test::variable(symbol_table, "y", y))
3683  {
3684  printf("run_test10() - Symbol 'y' value failure!\n");
3685  return false;
3686  }
3687  else if (!test::variable(symbol_table, "xx", xx))
3688  {
3689  printf("run_test10() - Symbol 'xx' value failure!\n");
3690  return false;
3691  }
3692  else if (!test::variable(symbol_table, "yy", yy))
3693  {
3694  printf("run_test10() - Symbol 'yy' value failure!\n");
3695  return false;
3696  }
3697 
3698  if (!symbol_table.remove_variable("x"))
3699  {
3700  printf("run_test10() - Failed to remove symbol 'x'!\n");
3701  return false;
3702  }
3703  else if (!symbol_table.remove_variable("y"))
3704  {
3705  printf("run_test10() - Failed to remove symbol 'y'!\n");
3706  return false;
3707  }
3708  else if (!symbol_table.remove_variable("xx"))
3709  {
3710  printf("run_test10() - Failed to remove symbol 'xx'!\n");
3711  return false;
3712  }
3713  else if (!symbol_table.remove_variable("yy"))
3714  {
3715  printf("run_test10() - Failed to remove symbol 'yy'!\n");
3716  return false;
3717  }
3718  }
3719 
3720  for (std::size_t r = 0; r < rounds; ++r)
3721  {
3722  myfunc<T> mf;
3723 
3724  symbol_table.add_function("f", mf);
3725  symbol_table.add_function("f1", mf);
3726 
3727  if (!symbol_table.symbol_exists("f"))
3728  {
3729  printf("run_test10() - function 'f' does not exist!\n");
3730  return false;
3731  }
3732  else if (!symbol_table.symbol_exists("f1"))
3733  {
3734  printf("run_test10() - function 'f1' does not exist!\n");
3735  return false;
3736  }
3737 
3738  if (!symbol_table.remove_function("f"))
3739  {
3740  printf("run_test10() - Failed to remove function 'f'!\n");
3741  return false;
3742  }
3743  else if (!symbol_table.remove_function("f1"))
3744  {
3745  printf("run_test10() - Failed to remove function 'f1'!\n");
3746  return false;
3747  }
3748  }
3749 
3750  for (std::size_t r = 0; r < rounds; ++r)
3751  {
3752  symbol_table.add_stringvar("i", i_s);
3753  symbol_table.add_stringvar("j", j_s);
3754 
3755  symbol_table.add_stringvar("ii", ii_s);
3756  symbol_table.add_stringvar("jj", jj_s);
3757 
3758  if (!symbol_table.symbol_exists("i"))
3759  {
3760  printf("run_test10() - String 'i' does not exist!\n");
3761  return false;
3762  }
3763  else if (!symbol_table.symbol_exists("j"))
3764  {
3765  printf("run_test10() - String 'j' does not exist!\n");
3766  return false;
3767  }
3768  else if (!symbol_table.symbol_exists("ii"))
3769  {
3770  printf("run_test10() - String 'ii' does not exist!\n");
3771  return false;
3772  }
3773  else if (!symbol_table.symbol_exists("jj"))
3774  {
3775  printf("run_test10() - String 'jj' does not exist!\n");
3776  return false;
3777  }
3778  else if (!test::string(symbol_table, "i", i_s))
3779  {
3780  printf("run_test10() - String 'i' value failure!\n");
3781  return false;
3782  }
3783  else if (!test::string(symbol_table, "j", j_s))
3784  {
3785  printf("run_test10() - String 'j' value failure!\n");
3786  return false;
3787  }
3788  else if (!test::string(symbol_table, "ii", ii_s))
3789  {
3790  printf("run_test10() - String 'ii' value failure!\n");
3791  return false;
3792  }
3793  else if (!test::string(symbol_table, "jj", jj_s))
3794  {
3795  printf("run_test10() - String 'jj' value failure!\n");
3796  return false;
3797  }
3798  else if (!symbol_table.remove_stringvar("i"))
3799  {
3800  printf("run_test10() - Failed to remove String 'i'!\n");
3801  return false;
3802  }
3803  else if (!symbol_table.remove_stringvar("j"))
3804  {
3805  printf("run_test10() - Failed to remove String 'j'!\n");
3806  return false;
3807  }
3808  else if (!symbol_table.remove_stringvar("ii"))
3809  {
3810  printf("run_test10() - Failed to remove String 'ii'!\n");
3811  return false;
3812  }
3813  else if (!symbol_table.remove_stringvar("jj"))
3814  {
3815  printf("run_test10() - Failed to remove String 'jj'!\n");
3816  return false;
3817  }
3818  }
3819 
3820  for (std::size_t r = 0; r < rounds; ++r)
3821  {
3822  symbol_table.add_variable("x", x);
3823  symbol_table.add_variable("y", y);
3824  symbol_table.add_variable("xx", xx);
3825  symbol_table.add_variable("yy", yy);
3826 
3827  std::vector<std::string> expected_var_list;
3828 
3829  expected_var_list.push_back("x");
3830  expected_var_list.push_back("y");
3831  expected_var_list.push_back("xx");
3832  expected_var_list.push_back("yy");
3833 
3834  std::deque<std::pair<std::string, T> > variable_list;
3835 
3836  symbol_table.get_variable_list(variable_list);
3837 
3838  if (variable_list.size() != expected_var_list.size())
3839  {
3840  printf("run_test10() - Failed to get variable list (1)\n");
3841  return false;
3842  }
3843 
3844  std::size_t found_count = 0;
3845 
3846  for (std::size_t i = 0; i < variable_list.size(); ++i)
3847  {
3848  for (std::size_t j = 0; j < expected_var_list.size(); ++j)
3849  {
3850  if (variable_list[i].first == expected_var_list[j])
3851  {
3852  ++found_count;
3853  break;
3854  }
3855  }
3856  }
3857 
3858  if (found_count != expected_var_list.size())
3859  {
3860  printf("run_test10() - Failed to get variable list (2)\n");
3861  return false;
3862  }
3863  }
3864 
3865  for (std::size_t r = 0; r < rounds; ++r)
3866  {
3867  symbol_table.add_variable("x", x);
3868  symbol_table.add_variable("y", y);
3869  symbol_table.add_variable("xx", xx);
3870  symbol_table.add_variable("yy", yy);
3871 
3872  std::vector<std::string> expected_var_list;
3873 
3874  expected_var_list.push_back("x");
3875  expected_var_list.push_back("y");
3876  expected_var_list.push_back("xx");
3877  expected_var_list.push_back("yy");
3878 
3879  std::deque<std::string> variable_list;
3880 
3881  symbol_table.get_variable_list(variable_list);
3882 
3883  if (variable_list.size() != expected_var_list.size())
3884  {
3885  printf("run_test10() - Failed to get variable list (3)\n");
3886  return false;
3887  }
3888 
3889  std::size_t found_count = 0;
3890 
3891  for (std::size_t i = 0; i < variable_list.size(); ++i)
3892  {
3893  for (std::size_t j = 0; j < expected_var_list.size(); ++j)
3894  {
3895  if (variable_list[i] == expected_var_list[j])
3896  {
3897  ++found_count;
3898  break;
3899  }
3900  }
3901  }
3902 
3903  if (found_count != expected_var_list.size())
3904  {
3905  printf("run_test10() - Failed to get variable list (4)\n");
3906  return false;
3907  }
3908  }
3909 
3910  for (std::size_t r = 0; r < rounds; ++r)
3911  {
3912  symbol_table.add_stringvar("i", i_s);
3913  symbol_table.add_stringvar("j", j_s);
3914  symbol_table.add_stringvar("ii", ii_s);
3915  symbol_table.add_stringvar("jj", jj_s);
3916 
3917  std::vector<std::string> expected_var_list;
3918 
3919  expected_var_list.push_back("i");
3920  expected_var_list.push_back("j");
3921  expected_var_list.push_back("ii");
3922  expected_var_list.push_back("jj");
3923 
3924  std::deque<std::pair<std::string, std::string> > stringvar_list;
3925 
3926  symbol_table.get_stringvar_list(stringvar_list);
3927 
3928  if (stringvar_list.size() != expected_var_list.size())
3929  {
3930  printf("run_test10() - Failed to get stringvar list (1)\n");
3931  return false;
3932  }
3933 
3934  std::size_t found_count = 0;
3935 
3936  for (std::size_t i = 0; i < stringvar_list.size(); ++i)
3937  {
3938  for (std::size_t j = 0; j < expected_var_list.size(); ++j)
3939  {
3940  if (stringvar_list[i].first == expected_var_list[j])
3941  {
3942  ++found_count;
3943  break;
3944  }
3945  }
3946  }
3947 
3948  if (found_count != expected_var_list.size())
3949  {
3950  printf("run_test10() - Failed to get stringvar list (2)\n");
3951  return false;
3952  }
3953  }
3954 
3955  for (std::size_t r = 0; r < rounds; ++r)
3956  {
3957  symbol_table.add_stringvar("i", i_s);
3958  symbol_table.add_stringvar("j", j_s);
3959  symbol_table.add_stringvar("ii", ii_s);
3960  symbol_table.add_stringvar("jj", jj_s);
3961 
3962  std::vector<std::string> expected_var_list;
3963 
3964  expected_var_list.push_back("i");
3965  expected_var_list.push_back("j");
3966  expected_var_list.push_back("ii");
3967  expected_var_list.push_back("jj");
3968 
3969  std::deque<std::string> stringvar_list;
3970 
3971  symbol_table.get_stringvar_list(stringvar_list);
3972 
3973  if (stringvar_list.size() != expected_var_list.size())
3974  {
3975  printf("run_test10() - Failed to get stringvar list (3.0)\n");
3976  return false;
3977  }
3978 
3979  if (symbol_table.stringvar_count() != expected_var_list.size())
3980  {
3981  printf("run_test10() - Failed to get stringvar list (3.1)\n");
3982  return false;
3983  }
3984 
3985  std::size_t found_count = 0;
3986 
3987  for (std::size_t i = 0; i < stringvar_list.size(); ++i)
3988  {
3989  for (std::size_t j = 0; j < expected_var_list.size(); ++j)
3990  {
3991  if (stringvar_list[i] == expected_var_list[j])
3992  {
3993  ++found_count;
3994  break;
3995  }
3996  }
3997  }
3998 
3999  if (found_count != expected_var_list.size())
4000  {
4001  printf("run_test10() - Failed to get stringvar list (4)\n");
4002  return false;
4003  }
4004  }
4005  }
4006 
4007  {
4008  T x0 = T(0);
4009  T y0 = T(0);
4010  T z0 = T(0);
4011 
4012  std::string expression_string = "(x0 + y0) / z0";
4013 
4014  static const std::size_t rounds = 100;
4015 
4016  for (std::size_t i = 0; i < rounds; ++i)
4017  {
4018  expression_t expression0;
4019 
4020  x0 = T(i + 1.11);
4021  y0 = T(i + 2.22);
4022  z0 = T(i + 3.33);
4023 
4025 
4026  st0.add_variable("x0",x0);
4027  st0.add_variable("y0",y0);
4028  st0.add_variable("z0",z0);
4029 
4030  expression0.register_symbol_table(st0);
4031 
4032  {
4034 
4035  if (!parser.compile(expression_string,expression0))
4036  {
4037  printf("run_test10() - Error: %s Expression: %s\n",
4038  parser.error().c_str(),
4039  expression_string.c_str());
4040 
4041  return false;
4042  }
4043  }
4044 
4045  {
4046  expression_t expression1;
4047  exprtk::symbol_table<T> st1 = st0;
4048  expression1.register_symbol_table(st1);
4049 
4050  {
4052 
4053  if (!parser.compile(expression_string,expression1))
4054  {
4055  printf("run_test10() - Error: %s Expression: %s\n",
4056  parser.error().c_str(),
4057  expression_string.c_str());
4058 
4059  return false;
4060  }
4061  }
4062 
4063  st1.remove_variable("x0");
4064  st1.remove_variable("y0");
4065  st1.remove_variable("z0");
4066  }
4067  }
4068  }
4069 
4070  {
4071  T a = T(1);
4072  T b = T(2);
4073  T c = T(3);
4074  T d = T(4);
4075 
4076  std::string e = "string";
4077 
4078  exprtk::symbol_table<T> symbol_table;
4079 
4080  symbol_table.add_variable ("a",a);
4081  symbol_table.add_variable ("b",b);
4082  symbol_table.add_variable ("c",c);
4083  symbol_table.add_variable ("d",d);
4084  symbol_table.add_stringvar("e",e);
4085 
4086  expression_t expression;
4087  expression.register_symbol_table(symbol_table);
4088 
4089  std::string expression_string = "(E == '1234') and (sin(a) + C) / b";
4090 
4091  typedef exprtk::parser<T> parser_t;
4092  typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
4093 
4094  std::deque<symbol_t> symbol_list;
4095 
4096  {
4097  parser_t parser;
4098 
4099  parser.dec().collect_variables() = true;
4100  parser.dec().collect_functions() = true;
4101 
4102  if (!parser.compile(expression_string,expression))
4103  {
4104  printf("run_test10() - Error: %s Expression: %s\n",
4105  parser.error().c_str(),
4106  expression_string.c_str());
4107 
4108  return false;
4109  }
4110 
4111  parser.dec().symbols(symbol_list);
4112  }
4113 
4114  std::deque<symbol_t> expected_symbol_list;
4115 
4116  expected_symbol_list.push_back(symbol_t("a" ,parser_t::e_st_variable));
4117  expected_symbol_list.push_back(symbol_t("b" ,parser_t::e_st_variable));
4118  expected_symbol_list.push_back(symbol_t("c" ,parser_t::e_st_variable));
4119  expected_symbol_list.push_back(symbol_t("e" ,parser_t::e_st_string ));
4120  expected_symbol_list.push_back(symbol_t("sin",parser_t::e_st_function));
4121 
4122  bool result = (symbol_list.size() == expected_symbol_list.size()) &&
4123  std::equal(symbol_list.begin(),
4124  symbol_list.end(),
4125  expected_symbol_list.begin());
4126  if (!result)
4127  {
4128  printf("run_test10() - Failed variable list comparison.(5)\n");
4129  return false;
4130  }
4131  }
4132 
4133  {
4134  T a = T(1);
4135  T b = T(2);
4136  T c = T(3);
4137  T d = T(4);
4138 
4139  std::string e = "string";
4140 
4141  exprtk::symbol_table<T> symbol_table;
4142 
4143  symbol_table.add_variable ("a",a);
4144  symbol_table.add_variable ("b",b);
4145  symbol_table.add_variable ("c",c);
4146  symbol_table.add_variable ("d",d);
4147  symbol_table.add_stringvar("e",e);
4148 
4149  expression_t expression;
4150  expression.register_symbol_table(symbol_table);
4151 
4152  std::string expression_string = "a := b + c; "
4153  "b := c + d; "
4154  "c := d + 1; "
4155  "e := e + 'abc'; ";
4156 
4157  typedef exprtk::parser<T> parser_t;
4158  typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
4159 
4160  std::deque<symbol_t> variable_list;
4161 
4162  {
4163  parser_t parser;
4164 
4165  parser.dec().collect_assignments() = true;
4166 
4167  if (!parser.compile(expression_string,expression))
4168  {
4169  printf("run_test10() - Error: %s Expression: %s\n",
4170  parser.error().c_str(),
4171  expression_string.c_str());
4172 
4173  return false;
4174  }
4175 
4176  parser.dec().assignment_symbols(variable_list);
4177  }
4178 
4179  std::deque<symbol_t> expected_assignment_list;
4180 
4181  expected_assignment_list.push_back(symbol_t("a",parser_t::e_st_variable));
4182  expected_assignment_list.push_back(symbol_t("b",parser_t::e_st_variable));
4183  expected_assignment_list.push_back(symbol_t("c",parser_t::e_st_variable));
4184  expected_assignment_list.push_back(symbol_t("e",parser_t::e_st_string ));
4185 
4186  bool result = (variable_list.size() == expected_assignment_list.size()) &&
4187  std::equal(variable_list.begin(),
4188  variable_list.end(),
4189  expected_assignment_list.begin());
4190  if (!result)
4191  {
4192  printf("run_test10() - Failed variable list comparison.(6)\n");
4193  return false;
4194  }
4195  }
4196 
4197  {
4198  exprtk::symbol_table<T> symbol_table0;
4199  exprtk::symbol_table<T> symbol_table1;
4200 
4201  if (symbol_table0 == symbol_table1)
4202  {
4203  printf("run_test10() - Error symbol_table0 and symbol_table1 are equal\n");
4204  return false;
4205  }
4206 
4207  symbol_table0 = symbol_table1;
4208  symbol_table1 = symbol_table0;
4209 
4210  if (!(symbol_table0 == symbol_table1))
4211  {
4212  printf("run_test10() - Error symbol_table0 and symbol_table1 are not equal\n");
4213  return false;
4214  }
4215  }
4216 
4217  {
4218  T a = T(1);
4219  T b = T(2);
4220  T c = T(3);
4221  T d = T(4);
4222 
4223  std::string e = "a string";
4224 
4225  exprtk::symbol_table<T> symbol_table0;
4226  exprtk::symbol_table<T> symbol_table1;
4227  expression_t expression;
4228 
4229  for (std::size_t i = 0; i < 10000; ++i)
4230  {
4231  symbol_table0.clear();
4232  symbol_table1.clear();
4233 
4234  symbol_table0.add_variable ("a",a);
4235  symbol_table0.add_variable ("b",b);
4236  symbol_table0.add_variable ("c",c);
4237  symbol_table0.add_variable ("d",d);
4238  symbol_table0.add_stringvar("e",e);
4239  symbol_table0.add_constants( );
4240 
4241  symbol_table1.add_variable ("a",a);
4242  symbol_table1.add_variable ("b",b);
4243  symbol_table1.add_variable ("c",c);
4244  symbol_table1.add_variable ("d",d);
4245  symbol_table1.add_stringvar("e",e);
4246  symbol_table1.add_constants( );
4247 
4248  expression.register_symbol_table(symbol_table0);
4249  expression.register_symbol_table(symbol_table1);
4250  }
4251  }
4252 
4253  {
4254  std::string expression_list[] =
4255  {
4256  "var x; 1",
4257  "var x := 1; x",
4258  "var x := 1; var y := 2; 1",
4259  "var x := 1; var y := 2; x",
4260  "var x:=6; var y:=4; x + -3 == 3",
4261  "var x:=6; var y:=4; x - -3 == 9",
4262  "var x:=6; var y:=4; x * -3 == -18",
4263  "var x:=6; var y:=4; x / -3 == -2",
4264  "var x:=6; var y:=4; -x + -3 == -9",
4265  "var x:=6; var y:=4; -x - -3 == -3",
4266  "var x:=6; var y:=4; -x * -3 == 18",
4267  "var x:=6; var y:=4; -x / -3 == 2",
4268  "var x:=6; var y:=4; -3 + -x == -9",
4269  "var x:=6; var y:=4; -3 - -x == 3",
4270  "var x:=6; var y:=4; -3 * -x == 18",
4271  "var x:=6; var y:=4; -3 / -x == 0.5",
4272  "var x:=6; var y:=4; 3 + -x == -3",
4273  "var x:=6; var y:=4; 3 - -x == 9",
4274  "var x:=6; var y:=4; 3 * -x == -18",
4275  "var x:=6; var y:=4; 3 / -x == -0.5",
4276  "var x := 3; var y := 6; x + -y == -3",
4277  "var x := 3; var y := 6; x - -y == 9",
4278  "var x := 3; var y := 6; -x + -y == -9",
4279  "var x := 3; var y := 6; -x - -y == 3",
4280  "var x := 3; var y := 6; -x * -y == 18",
4281  "var x := 6; var y := 3; -x / -y == 2",
4282  "var x := 3; var y := 6; -(-x * -y) == -18",
4283  "var x := 6; var y := 3; -(-x / -y) == -2",
4284  "var x:=1; 2+(3+abs(x)) == 6 ",
4285  "var x:=1; (3+abs(x))+2 == 6 ",
4286  "var x:=1; 2+(abs(x)+3) == 6 ",
4287  "var x:=1; (abs(x)+3)+2 == 6 ",
4288  "var x:=1; 2+(3-abs(x)) == 4 ",
4289  "var x:=1; (3-abs(x))+2 == 4 ",
4290  "var x:=1; 2+(abs(x)-3) == 0 ",
4291  "var x:=1; (abs(x)-3)+2 == 0 ",
4292  "var x:=1; 2-(3+abs(x)) == -2 ",
4293  "var x:=1; (3+abs(x))-2 == 2 ",
4294  "var x:=1; 2-(abs(x)+3) == -2 ",
4295  "var x:=1; (abs(x)+3)-2 == 2 ",
4296  "var x:=1; 2*(3*abs(x)) == 6 ",
4297  "var x:=1; (3*abs(x))*2 == 6 ",
4298  "var x:=1; 2*(abs(x)*3) == 6 ",
4299  "var x:=1; (abs(x)*3)*2 == 6 ",
4300  "var x:=1; 2*(3/abs(x)) == 6 ",
4301  "var x:=1; (3/abs(x))*2 == 6 ",
4302  "var x:=1; 2*(abs(x)/3) == (2/3)",
4303  "var x:=1; (abs(x)/3)*2 == (2/3)",
4304  "var x:=1; 2/(3*abs(x)) == (2/3)",
4305  "var x:=1; (3*abs(x))/2 == (3/2)",
4306  "var x:=1; 2/(abs(x)*3) == (2/3)",
4307  "var x:=1; (abs(x)*3)/2 == (3/2)",
4308  "var x:=1; 2/(3/abs(x)) == (2/3)",
4309  "var x:=1; (3/abs(x))/2 == (3/2)",
4310  "var x:=1; 2/(abs(x)/3) == 6 ",
4311  "var x:=1; (abs(x)/3)/2 == (1/6)",
4312  "var x:=3; var y:=6; -(-x)*-(-y) == 18",
4313  "var x:=3; var y:=6; -(-x)*-(-(-y)) == -18",
4314  "var x:=3; var y:=6; -(-(-x))*-(-y) == -18",
4315  "var x:=3; var y:=6; -(-(-x))*-(-(-y)) == 18",
4316  "var x:=3; var y:=6; -(-(x+y))*-(-(y+x)) == 81",
4317  "var x:=3; var y:=6; -(-(-(x+y)))*-(-(y+x)) == -81",
4318  "var x:=3; var y:=6; -(-(x+y))*-(-(-(y+x))) == -81",
4319  "var x:=3; var y:=6; -(-(-(x+y)))*-(-(-(y+x))) == 81",
4320  "var x:= 2; var y := 3; (-abs(x)+-abs(y)) == -5 ",
4321  "var x:= 2; var y := 3; (-abs(x)--abs(y)) == 1 ",
4322  "var x:= 2; var y := 3; (-abs(x)*-abs(y)) == 6 ",
4323  "var x:= 2; var y := 3; (-abs(x)/-abs(y)) == (2/3) ",
4324  "var x:= 2; var y := 3; (-abs(x)+abs(y)) == 1 ",
4325  "var x:= 2; var y := 3; (-abs(x)-abs(y)) == -5 ",
4326  "var x:= 2; var y := 3; (-abs(x)*abs(y)) == -6 ",
4327  "var x:= 2; var y := 3; (-abs(x)/abs(y)) == -(2/3) ",
4328  "var x:= 2; var y := 3; (abs(x)+-abs(y)) == -1 ",
4329  "var x:= 2; var y := 3; (abs(x)--abs(y)) == 5 ",
4330  "var x:= 2; var y := 3; (abs(x)*-abs(y)) == -6 ",
4331  "var x:= 2; var y := 3; (abs(x)/-abs(y)) == -(2/3) ",
4332  "var x:= 2; var y := 3; (-abs(x + 0)+-abs(y - 0)) == -5 ",
4333  "var x:= 2; var y := 3; (-abs(x + 0)--abs(y - 0)) == 1 ",
4334  "var x:= 2; var y := 3; (-abs(x + 0)*-abs(y - 0)) == 6 ",
4335  "var x:= 2; var y := 3; (-abs(x + 0)/-abs(y - 0)) == (2/3) ",
4336  "var x:= 2; var y := 3; (-abs(x + 0)+abs(y - 0)) == 1 ",
4337  "var x:= 2; var y := 3; (-abs(x + 0)-abs(y - 0)) == -5 ",
4338  "var x:= 2; var y := 3; (-abs(x + 0)*abs(y - 0)) == -6 ",
4339  "var x:= 2; var y := 3; (-abs(x + 0)/abs(y - 0)) == -(2/3) ",
4340  "var x:= 2; var y := 3; (abs(x + 0)+-abs(y - 0)) == -1 ",
4341  "var x:= 2; var y := 3; (abs(x + 0)--abs(y - 0)) == 5 ",
4342  "var x:= 2; var y := 3; (abs(x + 0)*-abs(y - 0)) == -6 ",
4343  "var x:= 2; var y := 3; (abs(x + 0)/-abs(y - 0)) == -(2/3) ",
4344  "var x := 1; var y := 2; swap(x,y); (x == 2) and (y == 1)",
4345  "var x := 1; var y := 2; x <=> y ; (x == 2) and (y == 1)",
4346  "var x := 'abc'; x == 'abc' ",
4347  "var x := 'abc'; var y := '123'; x != y ",
4348  "var x := 'abc'; var y := x + '123'; y == 'abc123' ",
4349  "var x := 'abc'; var y := '123' + x; y == '123abc' ",
4350  "~{var x := '123'; x[]} + ~{var x := '1234'; x[]} == 7",
4351  "~{var x := '123'; x[]} + ~{~{var x := '1234'; x[]}} == 7",
4352  "~{~{var x := '123'; x[]}} + ~{var x := '1234'; x[]} == 7",
4353  "~{var x := '123'; x[]} + ~{var x := 4} == 7",
4354  "~{var x := 3} + ~{var x := '1234'; x[]} == 7",
4355  "~{var x := '123'; x[]} + ~{~{var x := 4}} == 7",
4356  "~{~{var x := 3}} + ~{var x := '1234'; x[]} == 7",
4357  "var v[2] := {1,2}; swap(v[0],v[1]); (v[0] == 2) and (v[1] == 1)",
4358  "var v[2] := {1,2}; v[0] <=> v[1] ; (v[0] == 2) and (v[1] == 1)",
4359  "var x := 1; var y := 2; ~(swap(x,y),(x == 2) and (y == 1))",
4360  "var x := 1; var y := 2; ~(x <=> y , (x == 2) and (y == 1))",
4361  "var v[2] := {1,2}; ~(swap(v[0],v[1]), (v[0] == 2) and (v[1] == 1))",
4362  "var v[2] := {1,2}; ~(v[0] <=> v[1] , (v[0] == 2) and (v[1] == 1))",
4363  "var v[2] := {1,2}; swap(v[zero],v[one]); (v[zero] == 2) and (v[one] == 1)",
4364  "var v[2] := {1,2}; v[zero] <=> v[one] ; (v[zero] == 2) and (v[one] == 1)",
4365  "var v[2] := {1,2}; ~(swap(v[zero],v[one]), (v[zero] == 2) and (v[one] == 1))",
4366  "var v[2] := {1,2}; ~(v[zero] <=> v[one] , (v[zero] == 2) and (v[one] == 1))",
4367  "var v[2] := {1,2}; swap(v[2 * zero],v[(2 * one) / (1 + 1)]); (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1)",
4368  "var v[2] := {1,2}; v[2 * zero] <=> v[(2*one)/(1+1)] ; (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1)",
4369  "var v[2] := {1,2}; ~(swap(v[2 * zero],v[(2 * one) / (1 + 1)]), (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1))",
4370  "var v[2] := {1,2}; ~(v[2 * zero] <=> v[(2 * one) / (1 + 1)] , (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1))",
4371  "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[0]); swap(v[1],y); (x == 3) and (y == 4)",
4372  "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[0]; v[1] <=> y; (x == 3) and (y == 4)",
4373  "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[zero]); swap(v[one],y); (x == 3) and (y == 4)",
4374  "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[zero]; v[one] <=> y; (x == 3) and (y == 4)",
4375  "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[2 * zero]); swap(v[(2 * one) / (1 + 1)],y); (x == 3) and (y == 4)",
4376  "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[zero / 3]; v[(2 * one)/(1 + 1)] <=> y; (x == 3) and (y == 4)",
4377  "~{ var x := 1 } + ~{ var x := 2 } == 3",
4378  "(~{ var x := 1 } + ~{ var x := 2 }) == (~{ var x := 2 } + ~{ var x := 1 })",
4379  "(~{ var x := 1 } + ~{ var x := 2 } + ~{~{ var x := 1 } + ~{ var x := 2 }}) == 6",
4380  "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4381  "(~{ var x := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4382  "(~{ var x[1] := [1] } + ~{ var x := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4383  "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x := [1] } + ~{ var x[1] := [2] }}) == 6",
4384  "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x := [2] }}) == 6",
4385  "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4386  "(~{~{ var x := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4387  "(~{~{ var x[1] := [1] } + ~{ var x := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4388  "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x := [1] } + ~{ var x[1] := [2] }) == 6",
4389  "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x := [2] }) == 6",
4390  "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4391  "(~{~{ var x := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4392  "(~{~{ var x[1] := [1] }} + ~{ var x := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4393  "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x := [2] } + ~{{ var x[1] := [2] }}) == 6",
4394  "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x := [2] }}) == 6",
4395  "(~{~{~{var x[1] := [1]}}} + ~{~{var x[1] := [2]}} + ~{var x[1] := [3]}) == 6",
4396  "(~{var x[1] := [1]} + ~{~{var x[1] := [2]}} + ~{~{~{var x[1] := [3]}}}) == 6",
4397  "(~{ var x[3] := [1] } + ~{ var x[6] := {6,5,4,3,2,1}}) == 7",
4398  "(~{ var x[6] := {6,5,4,3,2,1} } + ~{ var x := 1 }) == 7",
4399  "(~{ var x := 1 } + ~{ var x[6] := {6,5,4,3,2,1} }) == 7",
4400  "var x[3] := {}; (x[0] == 0) and (x[1] == 0) and (x[2] == 0)",
4401  "var x[3] := {1,2}; (x[0] == 1) and (x[1] == 2) and (x[2] == 0)",
4402  "var x[3] := {1,2,3}; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4403  "var x[3] := [1]; (x[0] == 1) and (x[1] == 1) and (x[2] == 1)",
4404  "var v[3] := [1]; v += 1; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 2)",
4405  "var v[3] := [1]; v -= 1; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 0)",
4406  "var v[3] := [1]; v *= 2; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 2)",
4407  "var v[3] := [3]; v /= 3; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 1)",
4408  "var v[3] := {1,2, 3}; v += 1; (v[0] == 2) and (v[1] == 3) and (v[2] == 4)",
4409  "var v[3] := {1,2, 3}; v -= 1; (v[0] == 0) and (v[1] == 1) and (v[2] == 2)",
4410  "var v[3] := {1,2, 3}; v *= 2; (v[0] == 2) and (v[1] == 4) and (v[2] == 6)",
4411  "var v[3] := {3,9,15}; v /= 3; (v[0] == 1) and (v[1] == 3) and (v[2] == 5)",
4412  "var v0[3] := [1]; var v1[3] := [1]; v0 += v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 2)",
4413  "var v0[3] := [1]; var v1[3] := [1]; v0 -= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 0)",
4414  "var v0[3] := [1]; var v1[3] := [2]; v0 *= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 2)",
4415  "var v0[3] := [3]; var v1[3] := [3]; v0 /= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 1)",
4416  "var v0[3] := {1,2, 3}; var v1[3] := {1,1,1}; v0 += v1; (v0[0] == 2) and (v0[1] == 3) and (v0[2] == 4)",
4417  "var v0[3] := {1,2, 3}; var v1[3] := {1,1,1}; v0 -= v1; (v0[0] == 0) and (v0[1] == 1) and (v0[2] == 2)",
4418  "var v0[3] := {1,2, 3}; var v1[3] := {2,2,2}; v0 *= v1; (v0[0] == 2) and (v0[1] == 4) and (v0[2] == 6)",
4419  "var v0[3] := {3,9,15}; var v1[3] := {3,3,3}; v0 /= v1; (v0[0] == 1) and (v0[1] == 3) and (v0[2] == 5)",
4420  "var x[3] := {}; var y[4] := {1,2,3,4}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4421  "var x[3] := {}; var y[3] := {1,2,3}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4422  "var x[3] := {}; var y[2] := {1,2}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4423  "var x[3] := {}; var y[1] := {1}; x := y; (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4424  "var x[3] := {}; var y[4] := {1,2,3,4}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4425  "var x[3] := {}; var y[3] := {1,2,3}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4426  "var x[3] := {}; var y[2] := {1,2}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4427  "var x[3] := {}; var y[1] := {1}; x := (y+=1); (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4428  "var x[3] := {}; var y[4] := {1,2,3,4}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4429  "var x[3] := {}; var y[3] := {1,2,3}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == y[2])",
4430  "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4431  "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4432  "var x[3] := [9]; var y[4] := {1,2,3,4}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4433  "var x[3] := [9]; var y[3] := {1,2,3}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4434  "var x[3] := [9]; var y[2] := {1,2}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 9)",
4435  "var x[3] := [9]; var y[1] := {1}; x <=> y; (x[0] == 1) and (x[1] == 9) and (x[2] == 9)",
4436  "var x[3] := [9]; var y[4] := {1,2,3,4}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
4437  "var x[3] := [9]; var y[3] := {1,2,3}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
4438  "var x[3] := [9]; var y[2] := {1,2}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 9)",
4439  "var x[3] := [9]; var y[1] := {1}; x <=> (y += 1); (x[0] == 2) and (x[1] == 9) and (x[2] == 9)",
4440  "var x[3] := [8]; var y[4] := {1,2,3,4}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4441  "var x[3] := [8]; var y[3] := {1,2,3}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4442  "var x[3] := [8]; var y[2] := {1,2}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 9)",
4443  "var x[3] := [8]; var y[1] := {1}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 9) and (x[2] == 9)",
4444  "var x[3] := [8]; var y[4] := {1,2,3,4}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
4445  "var x[3] := [8]; var y[3] := {1,2,3}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
4446  "var x[3] := [8]; var y[2] := {1,2}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 9)",
4447  "var x[3] := [8]; var y[1] := {1}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 9) and (x[2] == 9)",
4448  "var x[3] := [0]; var y[4] := {1,2,3,4}; X < y",
4449  "var x[3] := [0]; var y[3] := {1,2,3}; x < Y",
4450  "var x[3] := [0]; var y[2] := {1,2}; X < y",
4451  "var x[3] := [0]; var y[1] := {1}; x < Y",
4452  "var x[3] := [0]; var y[4] := {1,2,3,4}; x <= y",
4453  "var x[3] := [0]; var y[3] := {1,2,3}; x <= y",
4454  "var x[3] := [0]; var y[2] := {1,2}; x <= y",
4455  "var x[3] := [0]; var y[1] := {1}; x <= y",
4456  "var x[3] := [5]; var y[4] := {1,2,3,4}; x > y",
4457  "var x[3] := [5]; var y[3] := {1,2,3}; x > y",
4458  "var x[3] := [5]; var y[2] := {1,2}; x > y",
4459  "var x[3] := [5]; var y[1] := {1}; x > y",
4460  "var x[3] := [5]; var y[4] := {1,2,3,4}; x >= y",
4461  "var x[3] := [5]; var y[3] := {1,2,3}; x >= y",
4462  "var x[3] := [5]; var y[2] := {1,2}; x >= y",
4463  "var x[3] := [5]; var y[1] := {1}; x >= y",
4464  "var x[3] := [1]; var y[4] := [1]; x == y",
4465  "var x[3] := [1]; var y[3] := [1]; x == y",
4466  "var x[3] := [1]; var y[2] := [1]; x == y",
4467  "var x[3] := [1]; var y[1] := [1]; x == y",
4468  "var x[3] := [1]; var y[4] := [2]; x != y",
4469  "var x[3] := [1]; var y[3] := [2]; x != y",
4470  "var x[3] := [1]; var y[2] := [2]; x != y",
4471  "var x[3] := [1]; var y[1] := [2]; x != y",
4472  "var x[3] := [0]; var y[4] := {5,6,7,8}; (x += 1) < y",
4473  "var x[3] := [0]; var y[3] := {5,6,7}; (x += 1) < y",
4474  "var x[3] := [0]; var y[2] := {5,6}; (x += 1) < y",
4475  "var x[3] := [0]; var y[1] := {5}; (x += 1) < y",
4476  "var x[3] := [0]; var y[4] := {1,2,3,4}; x < (y += 1)",
4477  "var x[3] := [0]; var y[3] := {1,2,3}; x < (y += 1)",
4478  "var x[3] := [0]; var y[2] := {1,2}; x < (y += 1)",
4479  "var x[3] := [0]; var y[1] := {1}; x < (y += 1)",
4480  "var x[3] := [0]; var y[4] := {5,6,7,8}; (x += 1) < (y += 1)",
4481  "var x[3] := [0]; var y[3] := {5,6,7}; (x += 1) < (y += 1)",
4482  "var x[3] := [0]; var y[2] := {5,6}; (x += 1) < (y += 1)",
4483  "var x[3] := [0]; var y[1] := {5}; (x += 1) < (y += 1)",
4484  "var x[3] := {1,2,3}; var y := 5; x < y ",
4485  "var x[3] := {1,2,3}; var y := 3; x < y + 1 ",
4486  "var x[3] := {1,2,3}; var y := 5; x <= y ",
4487  "var x[3] := {1,2,3}; var y := 3; x <= y + 1",
4488  "var x[3] := {1,1,1}; var y := 1; x == y ",
4489  "var x[3] := {1,1,1}; var y := 2; x == y - 1",
4490  "var x[3] := {1,2,3}; var y := 5; y > x ",
4491  "var x[3] := {1,2,3}; var y := 3; y >= x ",
4492  "var x[3] := {1,2,3}; var y := 5; y + 1 > x ",
4493  "var x[3] := {1,1,1}; var y := 1; y == x ",
4494  "var x[3] := {1,1,1}; var y := 2; y - 1 == x",
4495  "var x[3] := {1,2,3}; var y := 5; equal(true,(x += 1) < y) ",
4496  "var x[3] := {1,2,3}; var y := 3; equal(true,(x -= 1) < y + 1)",
4497  "var x[3] := {1,2,3}; var y := 5; equal(true,(x -= 1) <= y) ",
4498  "var x[3] := {2,2,2}; var y := 1; (x -= 1) == y ",
4499  "var x[3] := {1,2,3}; var y := 5; y > (x += 1) ",
4500  "var x[3] := {1,2,3}; var y := 5; y + 1 > (x += 1) ",
4501  "var x[3] := {2,2,2}; var y := 1; y == (x -= 1) ",
4502  "var x[3] := {2,2,2}; var y := 0; y + 1 == (x -= 1)",
4503  "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := (x + y); z == (x + y)",
4504  "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := (x - y); z == (x - y)",
4505  "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := (x / y); z == (x / y)",
4506  "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := (x * y); z == (x * y)",
4507  "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := 2(x + y); z == (x + y)2",
4508  "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := 2(x - y); z == (x - y)2",
4509  "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := 2(x / y); z == (x / y)2",
4510  "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := 2(x * y); z == (x * y)2",
4511  "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := 2(x + y)/3; z == 2(x + y)/3",
4512  "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := 2(x - y)/3; z == 2(x - y)/3",
4513  "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := 2(x / y)/3; z == 2(x / y)/3",
4514  "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := 2(x * y)/3; z == 2(x * y)/3",
4515  "var x[6] := {1,2,3,4,5,6}; equal(sqrt(sum([x - avg(x)]^2) / x[]),1.7078251277)",
4516  "var x[3] := {-1,-2,-3}; sum(abs(x) ) == 6",
4517  "var x[3] := {0.1,0.2,0.3}; sum(trunc(x)) == 0",
4518 
4519  "var x[10^6]:=[2];var y[10^6]:=[3]; var s:=0;equal(for(var i:=0; i<10;i+=1){s+= sum(5 *(2x-y/3)) + i;},150000045.0)",
4520 
4521  "var x := 2; (~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; "
4522  "j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } else "
4523  "break[i + j]; } } } + ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; "
4524  "j <= i; j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } "
4525  " else break[i + j]; } } }) == 18 ",
4526 
4527  "var x := 2; var v0[3] := {1,2,3}; ( ~{ for (var i := 0; i < 10; i += 1) { "
4528  "for (var j := 0; j <= i; j += 1) { var y := 3; var v2[3] := {1,2,3}; if ( "
4529  "(i + j + y + x + abs(v0[i % v0[]] - v2[j % v2[]])) < 6) { var v3[3] := "
4530  "{1,2,3}; y += x / v3[j % v3[]]; continue; } else break[i + j]; } } } "
4531  "+ ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; j += 1) "
4532  " { var y := 3; var v2[3] := {1,2,3}; if ((i + j + y + x + abs(v0[i % v0[]] - "
4533  "v2[j % v2[]])) < 6) { var v3[3] := {1,2,3}; y += x / v3[j % v3[]]; "
4534  "continue; } else break[i + j]; } } } ) == 18 ",
4535 
4536  "12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
4537  "12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
4538  "12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
4539  "12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
4540 
4541  "21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; i += 1;"
4542  "i += 2; i += 3; }; })",
4543 
4544  "21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; return "
4545  "[i * 8]; i += 1; i += 2; i += 3; }; })",
4546 
4547  "2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; i += 1; i += 2;"
4548  "i += 3; } else i; }",
4549 
4550  "2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; return [i * 8];"
4551  "i += 1; i += 2; i += 3; } else i; }",
4552 
4553  "var x[10] := [-1]; var y[10] := [-1]; for (var i := 0; i < 10; i += 1) { x[i] := i; "
4554  "y[i] := 2 * x[i]; }; (sum(x) == 45) and (sum(y) == (2 * sum(x)));"
4555 
4556  "7 == (for (var i := 0; i < 10; i += 1) { ~{break[7]; continue; i += i} })",
4557  "0 == (for (var i := 0; i < 10; i += 1) { ~{break[i]; continue; i += i} })",
4558  "0 == (for (var i := 0; i < 10; i += 1) { ~{continue; break[7]; i += i} })",
4559  "1 == (for (var i := 0; i < 10; i += 1) { ~{break[i += 1]; continue; i += i} })",
4560 
4561  "var s := 'abc'; s == ~{'abc' } ",
4562  "var s := 'abc'; s == ~{s } ",
4563  "var s := 'abc'; s == ~{'ab' + 'c'} ",
4564  "var s := 'abc'; ~{'abc' } == s ",
4565  "var s := 'abc'; ~{s } == s ",
4566  "var s := 'abc'; ~{'ab' + 'c'} == s ",
4567  "var s := 'abc'; ~{1 + 2; 'abc' + s; s} == s ",
4568  "var s := 'abc'; ~{1 + 2; var x := 'ab'; x + 'c'} == s ",
4569 
4570  "var x[10^6] := null; var y[10^7] := null; 0 * (min(x) + min(y)) + x[] + y[] == 10^7 + 10^6"
4571  };
4572 
4573  const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
4574 
4575  static const std::size_t rounds = 20;
4576 
4577  exprtk::symbol_table<T> symbol_table;
4578 
4579  T zero = T(0);
4580  T one = T(1);
4581 
4582  symbol_table.add_variable("zero",zero);
4583  symbol_table.add_variable("one" , one);
4584  symbol_table.add_pi();
4585 
4586  bool failed = false;
4587 
4588  for (std::size_t r = 0; r < rounds; ++r)
4589  {
4590  for (std::size_t i = 0; i < expression_list_size; ++i)
4591  {
4592  expression_t expression;
4593  expression.register_symbol_table(symbol_table);
4594 
4595  {
4597 
4598  if (!parser.compile(expression_list[i],expression))
4599  {
4600  printf("run_test10() - swaps[1] Error: %s Expression: %s\n",
4601  parser.error().c_str(),
4602  expression_list[i].c_str());
4603 
4604  failed = true;
4605  continue;
4606  }
4607  }
4608 
4609  T result = expression.value();
4610 
4611  if (T(1) != result)
4612  {
4613  printf("run_test10() - swaps[1] evaluation error Expression: %s\n",
4614  expression_list[i].c_str());
4615 
4616  failed = true;
4617  }
4618  }
4619 
4620  if (failed)
4621  {
4622  return false;
4623  }
4624  }
4625 
4626  // reuse parser
4627  for (std::size_t r = 0; r < rounds; ++r)
4628  {
4630 
4631  for (std::size_t i = 0; i < expression_list_size; ++i)
4632  {
4633  expression_t expression;
4634  expression.register_symbol_table(symbol_table);
4635 
4636  if (!parser.compile(expression_list[i],expression))
4637  {
4638  printf("run_test10() - swaps[2] Error: %s Expression: %s\n",
4639  parser.error().c_str(),
4640  expression_list[i].c_str());
4641 
4642  failed = true;
4643  continue;
4644  }
4645 
4646  T result = expression.value();
4647 
4648  if (T(1) != result)
4649  {
4650  printf("run_test10() - swaps[2] evaluation error Expression: %s\n",
4651  expression_list[i].c_str());
4652 
4653  failed = true;
4654  }
4655  }
4656 
4657  if (failed)
4658  {
4659  return false;
4660  }
4661  }
4662  }
4663 
4664  return true;
4665 }
4666 
4667 template <typename T>
4668 inline bool run_test11()
4669 {
4671  std::string expression_string = "(x + y) / 3";
4672 
4673  T x = T(1.0);
4674  T y = T(2.0);
4675 
4676  exprtk::symbol_table<T> symbol_table;
4677  symbol_table.add_variable("x",x);
4678  symbol_table.add_variable("y",y);
4679 
4680  expression_t expression;
4681  expression.register_symbol_table(symbol_table);
4682 
4683  static const std::size_t rounds = 500;
4684 
4685  for (std::size_t i = 0; i < rounds; ++i)
4686  {
4687  {
4689 
4690  if (!parser.compile(expression_string,expression))
4691  {
4692  printf("run_test11() - Error: %s Expression: %s\n",
4693  parser.error().c_str(),
4694  expression_string.c_str());
4695 
4696  return false;
4697  }
4698  }
4699 
4700  if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
4701  {
4702  printf("run_test11() - Error in evaluation!(1)\n");
4703  return false;
4704  }
4705 
4706  expression.release();
4707 
4708  if (false == (!expression))
4709  {
4710  printf("run_test11() - Error in evaluation!(2)\n");
4711  return false;
4712  }
4713 
4714  {
4716 
4717  if (!parser.compile(expression_string,expression))
4718  {
4719  printf("run_test11() - Error: %s Expression: %s\n",
4720  parser.error().c_str(),
4721  expression_string.c_str());
4722 
4723  return false;
4724  }
4725  }
4726 
4727  expression.value();
4728 
4729  if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
4730  {
4731  printf("run_test11() - Error in evaluation!(3)\n");
4732  return false;
4733  }
4734  }
4735 
4736  if (!exprtk::pgo_primer<T>())
4737  {
4738  printf("run_test11() - Failed PGO primer\n");
4739  return false;
4740  }
4741 
4742  return true;
4743 }
4744 
4745 template <typename T>
4746 inline bool run_test12()
4747 {
4749  static const std::string expression_string[] =
4750  {
4751  "equal(poly01(x,2.2,1.1),(2.2x^1+1.1))",
4752  "equal(poly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
4753  "equal(poly03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
4754  "equal(poly04(x,5.5,4.4,3.3,2.2,1.1),(5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4755  "equal(poly05(x,6.6,5.5,4.4,3.3,2.2,1.1),(6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4756  "equal(poly06(x,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4757  "equal(poly07(x,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4758  "equal(poly08(x,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4759  "equal(poly09(x,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4760  "equal(poly10(x,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4761  "equal(poly11(x,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4762  "equal(poly12(x,4.4,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(4.4x^12+3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4763  "EquaL(Poly01(x,2.2,1.1),(2.2x^1+1.1))",
4764  "eQuAl(pOly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
4765  "eqUal(poLy03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
4766  "eQuAl(polY04(x,5.5,4.4,3.3,2.2,1.1),(5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4767  "EquAl(pOLy05(x,6.6,5.5,4.4,3.3,2.2,1.1),(6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4768  "EqUaL(pOly06(x,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4769  "Equal(Poly07(x,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4770  "eQual(PoLy08(x,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4771  "eqUal(pOlY09(x,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4772  "equAl(POLY10(x,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4773  "equaL(PolY11(x,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))",
4774  "EQUAL(pOLy12(x,4.4,3.3,2.2,1.1,9.9,8.8,7.7,6.6,5.5,4.4,3.3,2.2,1.1),(4.4x^12+3.3x^11+2.2x^10+1.1x^9+9.9x^8+8.8x^7+7.7x^6+6.6x^5+5.5x^4+4.4x^3+3.3x^2+2.2x^1+1.1))"
4775  };
4776  static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
4777 
4778  T x = T(1.23456);
4779 
4780  exprtk::polynomial<T, 1> poly01;
4781  exprtk::polynomial<T, 2> poly02;
4782  exprtk::polynomial<T, 3> poly03;
4783  exprtk::polynomial<T, 4> poly04;
4784  exprtk::polynomial<T, 5> poly05;
4785  exprtk::polynomial<T, 6> poly06;
4786  exprtk::polynomial<T, 7> poly07;
4787  exprtk::polynomial<T, 8> poly08;
4788  exprtk::polynomial<T, 9> poly09;
4789  exprtk::polynomial<T,10> poly10;
4790  exprtk::polynomial<T,11> poly11;
4791  exprtk::polynomial<T,12> poly12;
4792 
4793  exprtk::symbol_table<T> symbol_table;
4794 
4795  symbol_table.add_variable("x",x);
4796  symbol_table.add_function("poly01", poly01);
4797  symbol_table.add_function("poly02", poly02);
4798  symbol_table.add_function("poly03", poly03);
4799  symbol_table.add_function("poly04", poly04);
4800  symbol_table.add_function("poly05", poly05);
4801  symbol_table.add_function("poly06", poly06);
4802  symbol_table.add_function("poly07", poly07);
4803  symbol_table.add_function("poly08", poly08);
4804  symbol_table.add_function("poly09", poly09);
4805  symbol_table.add_function("poly10", poly10);
4806  symbol_table.add_function("poly11", poly11);
4807  symbol_table.add_function("poly12", poly12);
4808 
4809  expression_t expression;
4810  expression.register_symbol_table(symbol_table);
4811 
4812  static const std::size_t rounds = 500;
4813 
4814  for (std::size_t i = 0; i < rounds; ++i)
4815  {
4816  for (std::size_t j = 0; j < expression_string_size; ++j)
4817  {
4818  const std::string& expr_str = expression_string[j];
4819 
4820  {
4822 
4823  if (!parser.compile(expr_str,expression))
4824  {
4825  printf("run_test12() - Error: %s Expression: %s\n",
4826  parser.error().c_str(),
4827  expr_str.c_str());
4828 
4829  return false;
4830  }
4831  }
4832 
4833  if (T(1) != expression.value())
4834  {
4835  printf("run_test12() - Error in evaluation! Expression: %s\n",expr_str.c_str());
4836  return false;
4837  }
4838  }
4839  }
4840 
4841  return true;
4842 }
4843 
4844 template <typename T>
4845 struct sine_deg : public exprtk::ifunction<T>
4846 {
4848 
4849  sine_deg() : exprtk::ifunction<T>(1) {}
4850 
4851  inline T operator()(const T& v)
4852  {
4853  return std::sin((v * T(exprtk::details::numeric::constant::pi)) / T(180));
4854  }
4855 };
4856 
4857 template <typename T>
4858 struct cosine_deg : public exprtk::ifunction<T>
4859 {
4861 
4863 
4864  inline T operator()(const T& v)
4865  {
4866  return std::cos((v * T(exprtk::details::numeric::constant::pi)) / T(180));
4867  }
4868 };
4869 
4870 template <typename T>
4871 inline bool run_test13()
4872 {
4875  typedef exprtk::parser<T> parser_t;
4876 
4877  static const std::string expression_string[] =
4878  {
4879  "equal(sin(30),0.5) ",
4880  "equal(cos(60),0.5) ",
4881  "equal(sin(60),sqrt(3)/2) ",
4882  "equal(cos(30),sqrt(3)/2) ",
4883  "equal(sin(x_deg),0.5) ",
4884  "equal(cos(y_deg),0.5) ",
4885  "equal(sin(y_deg),sqrt(3)/2) ",
4886  "equal(cos(x_deg),sqrt(3)/2) ",
4887  "equal(sin(30) + sin(30),1.0) ",
4888  "equal(cos(60) + cos(60),1.0) ",
4889  "equal(sin(60) + sin(60),sqrt(3)) ",
4890  "equal(cos(30) + cos(30),sqrt(3)) ",
4891  "equal(sin(x_deg) + sin(x_deg),1.0) ",
4892  "equal(cos(y_deg) + cos(y_deg),1.0) ",
4893  "equal(sin(y_deg) + sin(y_deg),sqrt(3))",
4894  "equal(cos(x_deg) + cos(x_deg),sqrt(3))"
4895  };
4896 
4897  static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
4898 
4899  {
4900  T x_deg = T(30);
4901  T y_deg = T(60);
4902 
4903  sine_deg <T> sine;
4904  cosine_deg<T> cosine;
4905 
4906  symbol_table_t symbol_table_0;
4907  symbol_table_t symbol_table_1;
4908 
4909  symbol_table_0.add_variable("x_deg",x_deg);
4910  symbol_table_1.add_variable("y_deg",y_deg);
4911 
4912  symbol_table_0.add_function( "sine_deg", sine);
4913  symbol_table_1.add_function("cosine_deg", cosine);
4914 
4915  expression_t expression;
4916 
4917  expression.register_symbol_table(symbol_table_0);
4918  expression.register_symbol_table(symbol_table_1);
4919 
4920  static const std::size_t rounds = 100;
4921 
4922  for (std::size_t i = 0; i < rounds; ++i)
4923  {
4924  for (std::size_t j = 0; j < expression_string_size; ++j)
4925  {
4926  const std::string& expr_str = expression_string[j];
4927 
4928  {
4929  parser_t parser;
4930 
4931  parser.replace_symbol("sin", "sine_deg");
4932  parser.replace_symbol("cos", "cosine_deg");
4933 
4934  if (!parser.compile(expr_str,expression))
4935  {
4936  printf("run_test13() - Error: %s Expression: %s [1]\n",
4937  parser.error().c_str(),
4938  expr_str.c_str());
4939 
4940  return false;
4941  }
4942  }
4943 
4944  if (T(1) != expression.value())
4945  {
4946  printf("run_test13() - Error in evaluation! Expression: %s [1]\n",expr_str.c_str());
4947  return false;
4948  }
4949  }
4950  }
4951  }
4952 
4953  {
4954  T x_deg = T(30);
4955  T y_deg = T(60);
4956 
4957  sine_deg <T> sine;
4958  cosine_deg<T> cosine;
4959 
4960  symbol_table_t symbol_table_0;
4961  symbol_table_t symbol_table_1;
4962 
4963  symbol_table_0.add_variable("x_deg",x_deg);
4964  symbol_table_1.add_variable("y_deg",y_deg);
4965 
4966  symbol_table_0.add_reserved_function("sin", sine);
4967  symbol_table_1.add_reserved_function("cos",cosine);
4968 
4969  expression_t expression;
4970 
4971  expression.register_symbol_table(symbol_table_0);
4972  expression.register_symbol_table(symbol_table_1);
4973 
4974  static const std::size_t rounds = 100;
4975 
4976  for (std::size_t i = 0; i < rounds; ++i)
4977  {
4978  for (std::size_t j = 0; j < expression_string_size; ++j)
4979  {
4980  const std::string& expr_str = expression_string[j];
4981 
4982  {
4983  typedef typename parser_t::settings_store settings_t;
4984 
4985  parser_t parser;
4986 
4987  parser.settings()
4988  .disable_base_function(settings_t::e_bf_sin)
4989  .disable_base_function(settings_t::e_bf_cos);
4990 
4991  if (!parser.compile(expr_str,expression))
4992  {
4993  printf("run_test13() - Error: %s Expression: %s [2]\n",
4994  parser.error().c_str(),
4995  expr_str.c_str());
4996 
4997  return false;
4998  }
4999  }
5000 
5001  if (T(1) != expression.value())
5002  {
5003  printf("run_test13() - Error in evaluation! Expression: %s [2]\n",expr_str.c_str());
5004  return false;
5005  }
5006  }
5007  }
5008  }
5009 
5010  return true;
5011 }
5012 
5013 template <typename Allocator,
5014  template <typename,typename> class Sequence>
5015 inline std::size_t load_expressions(const std::string& file_name,
5016  Sequence<std::string,Allocator>& sequence)
5017 {
5018  std::ifstream stream(file_name.c_str());
5019 
5020  if (!stream) return 0;
5021 
5023  buffer.reserve(1024);
5024 
5025  std::size_t line_count = 0;
5026 
5027  while (std::getline(stream,(buffer)))
5028  {
5029  if (buffer.empty())
5030  continue;
5031  else if ('#' == buffer[0])
5032  continue;
5033 
5034  ++line_count;
5035  sequence.push_back(buffer);
5036  }
5037 
5038  return line_count;
5039 }
5040 
5041 template <typename T>
5042 inline bool run_test14()
5043 {
5045 
5046  T x = T(0);
5047  T y = T(0);
5048  T z = T(0);
5049  T w = T(0);
5050 
5051  exprtk::polynomial<T, 1> poly01;
5052  exprtk::polynomial<T, 2> poly02;
5053  exprtk::polynomial<T, 3> poly03;
5054  exprtk::polynomial<T, 4> poly04;
5055  exprtk::polynomial<T, 5> poly05;
5056  exprtk::polynomial<T, 6> poly06;
5057  exprtk::polynomial<T, 7> poly07;
5058  exprtk::polynomial<T, 8> poly08;
5059  exprtk::polynomial<T, 9> poly09;
5060  exprtk::polynomial<T,10> poly10;
5061  exprtk::polynomial<T,11> poly11;
5062  exprtk::polynomial<T,12> poly12;
5063 
5064  exprtk::symbol_table<T> symbol_table;
5065  symbol_table.add_constants();
5066  symbol_table.add_variable("x",x);
5067  symbol_table.add_variable("y",y);
5068  symbol_table.add_variable("z",z);
5069  symbol_table.add_variable("w",w);
5070  symbol_table.add_function("poly01", poly01);
5071  symbol_table.add_function("poly02", poly02);
5072  symbol_table.add_function("poly03", poly03);
5073  symbol_table.add_function("poly04", poly04);
5074  symbol_table.add_function("poly05", poly05);
5075  symbol_table.add_function("poly06", poly06);
5076  symbol_table.add_function("poly07", poly07);
5077  symbol_table.add_function("poly08", poly08);
5078  symbol_table.add_function("poly09", poly09);
5079  symbol_table.add_function("poly10", poly10);
5080  symbol_table.add_function("poly11", poly11);
5081  symbol_table.add_function("poly12", poly12);
5082 
5083  expression_t expression;
5084  expression.register_symbol_table(symbol_table);
5085 
5087 
5088  std::deque<std::string> expr_str_list;
5089 
5090  load_expressions("exprtk_functional_test.txt" ,expr_str_list);
5091  load_expressions("exprtk_functional_ext_test.txt",expr_str_list);
5092 
5093  if (expr_str_list.empty())
5094  {
5095  return true;
5096  }
5097 
5098  std::deque<exprtk::expression<T> > expression_list;
5099  bool failure = false;
5100  static const std::size_t rounds = 5;
5101 
5102  for (std::size_t r = 0; r < rounds; ++r)
5103  {
5104  for (std::size_t i = 0; i < expr_str_list.size(); ++i)
5105  {
5106  exprtk::expression<T> current_expression;
5107 
5108  current_expression.register_symbol_table(symbol_table);
5109 
5110  if (!parser.compile(expr_str_list[i],current_expression))
5111  {
5112  printf("run_test14() - Error: %s Expression: %s\n",
5113  parser.error().c_str(),
5114  expr_str_list[i].c_str());
5115 
5116  failure = true;
5117  }
5118  else
5119  expression_list.push_back(current_expression);
5120  }
5121 
5122  if (failure)
5123  break;
5124 
5125  for (std::size_t i = 0; i < expression_list.size(); ++i)
5126  {
5127  T result = expression_list[i].value();
5128 
5129  if (result != T(1))
5130  {
5131  failure = true;
5132 
5133  printf("run_test14() - Error with evaluation of expression: %s\n",
5134  expr_str_list[i].c_str());
5135  }
5136  }
5137 
5138  expression_list.clear();
5139 
5140  if (failure)
5141  break;
5142  }
5143 
5144  return !failure;
5145 }
5146 
5147 template <typename T>
5148 inline bool run_test15()
5149 {
5151 
5152  T x = T(1.1);
5153  T y = T(2.2);
5154  T z = T(3.3);
5155 
5156  exprtk::symbol_table<T> symbol_table;
5157  symbol_table.add_constants();
5158  symbol_table.add_variable("x",x);
5159  symbol_table.add_variable("y",y);
5160  symbol_table.add_variable("z",z);
5161 
5162  static const std::string expr_str_list[] =
5163  {
5164  "2 - (x + y) / z//Comment 01 ",
5165  "2 - (x + y) / z#Comment 02 ",
5166  "2 - (x + y) / z //Comment 03 ",
5167  "2 - (x + y) / z #Comment 04 ",
5168  "2 - (x + y) / z//Comment 05 \n",
5169  "2 - (x + y) / z#Comment 06 \n",
5170  "2 - (x + y) / z //Comment 07\n",
5171  "2 - (x + y) / z #Comment 08 \n",
5172  "/* Comment 09*/2 - (x + y) / z",
5173  "/* Comment 10*/2 - (x + y) / z\n",
5174  "/* Comment 11*/2 - (x + y) / z/* Comment 12*/",
5175  "/* Comment 13*/2 - (x + y) / z/* Comment 14*/\n",
5176  "2 - /* Comment 15 */(x + y) / z",
5177  "2 - /* Comment 16 */(x + y) /* Comment 17 *// z \n",
5178  "2 - /* Comment 18 */(x + y) /* Comment 19 */ / z //Comment 20\n",
5179  "2 - /* Comment 21 */(x + y) /* Comment 22 */ / z #Comment 23\n",
5180  "2 - /* Comment 24 */(x + y) /* Comment 25 */ / z //Comment 26",
5181  "2 - /* Comment 27 */(x + y) /* Comment 28 */ / z #Comment 29"
5182  };
5183  static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5184 
5185  std::deque<expression_t> expression_list;
5186 
5187  for (std::size_t i = 0; i < expr_str_list_size; ++i)
5188  {
5189  expression_t expression;
5190  expression.register_symbol_table(symbol_table);
5191 
5193 
5194  if (!parser.compile(expr_str_list[i],expression))
5195  {
5196  printf("run_test15() - Error: %s Expression: %s\n",
5197  parser.error().c_str(),
5198  expr_str_list[i].c_str());
5199 
5200  return false;
5201  }
5202  else
5203  expression_list.push_back(expression);
5204  }
5205 
5206  expression_t base_expression;
5207  const std::string base_expr_str = "2 - (x + y) / z";
5208 
5209  {
5210  base_expression.register_symbol_table(symbol_table);
5211 
5213 
5214  if (!parser.compile(base_expr_str,base_expression))
5215  {
5216  printf("run_test15() - Error: %s Expression: %s\n",
5217  parser.error().c_str(),
5218  base_expr_str.c_str());
5219 
5220  return false;
5221  }
5222  }
5223 
5224  bool failure = false;
5225 
5226  for (std::size_t i = 0; i < expression_list.size(); ++i)
5227  {
5228  T base_result = base_expression.value();
5229  T result = expression_list[i].value();
5230 
5231  if (not_equal(base_result,result))
5232  {
5233  printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
5234  (double)base_result,
5235  (double)result,
5236  expr_str_list[i].c_str());
5237 
5238  failure = true;
5239  }
5240  }
5241 
5242  return !failure;
5243 }
5244 
5245 template <typename T>
5246 struct base_func : public exprtk::ifunction<T>
5247 {
5249 
5250  typedef const T& type;
5251  base_func(const std::size_t& n) : exprtk::ifunction<T>(n) {}
5252  inline T operator()(type v0, type v1, type v2, type v3, type v4) { return (v0 + v1 + v2 + v3 + v4); }
5253  inline T operator()(type v0, type v1, type v2, type v3) { return (v0 + v1 + v2 + v3); }
5254  inline T operator()(type v0, type v1, type v2) { return (v0 + v1 + v2); }
5255  inline T operator()(type v0, type v1) { return (v0 + v1); }
5256  inline T operator()(type v0) { return v0; }
5257  inline T operator()() { return T(1.1234); }
5258 };
5259 
5260 template <typename T> struct test_func5 : public base_func<T> { test_func5() : base_func<T>(5){} };
5261 template <typename T> struct test_func4 : public base_func<T> { test_func4() : base_func<T>(4){} };
5262 template <typename T> struct test_func3 : public base_func<T> { test_func3() : base_func<T>(3){} };
5263 template <typename T> struct test_func2 : public base_func<T> { test_func2() : base_func<T>(2){} };
5264 template <typename T> struct test_func1 : public base_func<T> { test_func1() : base_func<T>(1){} };
5265 template <typename T> struct test_func0 : public base_func<T> { test_func0() : base_func<T>(0){} };
5266 
5267 template <typename T>
5268 inline bool run_test16()
5269 {
5271 
5272  T x = T(1.1);
5273  T y = T(2.2);
5274  T z = T(3.3);
5275  T w = T(4.4);
5276  T u = T(5.5);
5277 
5278  test_func0<T> test_func00;
5279  test_func1<T> test_func01;
5280  test_func2<T> test_func02;
5281  test_func3<T> test_func03;
5282  test_func4<T> test_func04;
5283  test_func5<T> test_func05;
5284 
5285  exprtk::symbol_table<T> symbol_table;
5286  symbol_table.add_constants();
5287  symbol_table.add_variable("x",x);
5288  symbol_table.add_variable("y",y);
5289  symbol_table.add_variable("z",z);
5290  symbol_table.add_variable("w",w);
5291  symbol_table.add_variable("u",u);
5292 
5293  symbol_table.add_function("test_func0",test_func00);
5294  symbol_table.add_function("test_func1",test_func01);
5295  symbol_table.add_function("test_func2",test_func02);
5296  symbol_table.add_function("test_func3",test_func03);
5297  symbol_table.add_function("test_func4",test_func04);
5298  symbol_table.add_function("test_func5",test_func05);
5299 
5300  static const std::string expr_str_list[] =
5301  {
5302  "test_func0 = test_func0()",
5303  "test_func0 == test_func0()",
5304  "equal(1.1 + test_func0,test_func0() + 1.1)",
5305  "equal(test_func0 + 1.1,1.1 + test_func0())",
5306  "equal((1.1 + test_func0),(test_func0() + 1.1))",
5307  "equal((test_func0 + 1.1),(1.1 + test_func0()))",
5308  "equal(test_func0,test_func0())",
5309  "equal(test_func0,1.1234)",
5310  "equal(test_func0(),1.1234)",
5311  "equal(test_func0 + test_func0(),2 * 1.1234)",
5312  "equal((test_func0 + test_func0()),2 * 1.1234)",
5313  "equal((test_func0) + (test_func0()),2 * 1.1234)",
5314  "equal(test_func1(x),(x))",
5315  "equal(test_func2(x,y),(x + y))",
5316  "equal(test_func3(x,y,z),(x + y + z))",
5317  "equal(test_func4(x,y,z,w),(x + y + z + w))",
5318  "equal(test_func5(x,y,z,w,u),(x + y + z + w + u))",
5319  "equal(1.1 + test_func0,1.1234 + 1.1)",
5320  "equal(1.1 + test_func0(),1.1234 + 1.1)",
5321  "equal(1.1 + test_func1(x),(x + 1.1))",
5322  "equal(1.1 + test_func2(x,y),(x + y + 1.1))",
5323  "equal(1.1 + test_func3(x,y,z),(x + y + z + 1.1))",
5324  "equal(1.1 + test_func4(x,y,z,w),(x + y + z + w + 1.1))",
5325  "equal(1.1 + test_func5(x,y,z,w,u),(x + y + z + w + u + 1.1))",
5326  "equal(test_func0 + 2.2,1.1234 + 2.2)",
5327  "equal(test_func0() + 2.2,1.1234 + 2.2)",
5328  "equal(test_func1(x) + 2.2,(x + 2.2))",
5329  "equal(test_func2(x,y) + 2.2,(x + y + 2.2))",
5330  "equal(test_func3(x,y,z) + 2.2,(x + y + z + 2.2))",
5331  "equal(test_func4(x,y,z,w) + 2.2,(x + y + z + w + 2.2))",
5332  "equal(test_func5(x,y,z,w,u) + 2.2,(x + y + z + w + u + 2.2))",
5333  "equal({[test_func1(x)]},{[(x)]})",
5334  "equal({[test_func2(x,y)]},{[(x + y)]})",
5335  "equal({[test_func3(x,y,z)]},{[(x + y + z)]})",
5336  "equal({[test_func4(x,y,z,w)]},{[(x + y + z + w)]})",
5337  "equal({[test_func5(x,y,z,w,u)]},{[(x + y + z + w + u)]})",
5338  "equal(test_func1(2.12),(2.12))",
5339  "equal(test_func2(2.12,3.12),(2.12 + 3.12))",
5340  "equal(test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12))",
5341  "equal(test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12))",
5342  "equal(test_func5(2.12,3.12,4.12,5.12,6.12),(2.12 + 3.12 + 4.12 + 5.12 + 6.12))",
5343  "equal(1.1 + test_func1(2.12),(2.12 + 1.1))",
5344  "equal(1.1 + test_func2(2.12,3.12),(2.12 + 3.12 + 1.1))",
5345  "equal(1.1 + test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12 + 1.1))",
5346  "equal(1.1 + test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12 + 1.1))",
5347  "equal(1.1 + test_func5(2.12,3.12,4.12,5.12,6.12),(2.12 + 3.12 + 4.12 + 5.12 + 6.12 + 1.1))",
5348  "equal(test_func1(2.12) + 2.2,(2.12 + 2.2))",
5349  "equal(test_func2(2.12,3.12) + 2.2,(2.12 + 3.12 + 2.2))",
5350  "equal(test_func3(2.12,3.12,4.12) + 2.2,(2.12 + 3.12 + 4.12 + 2.2))",
5351  "equal(test_func4(2.12,3.12,4.12,5.12) + 2.2,(2.12 + 3.12 + 4.12 + 5.12 + 2.2))",
5352  "equal(test_func5(2.12,3.12,4.12,5.12,6.12) + 2.2,(2.12 + 3.12 + 4.12 + 5.12 + 6.12 + 2.2))",
5353  "equal({[test_func1(2.12)]},{[(2.12)]})",
5354  "equal({[test_func2(2.12,3.12)]},{[(2.12 + 3.12)]})",
5355  "equal({[test_func3(2.12,3.12,4.12)]},{[(2.12 + 3.12 + 4.12)]})",
5356  "equal({[test_func4(2.12,3.12,4.12,5.12)]},{[(2.12 + 3.12 + 4.12 + 5.12)]})",
5357  "equal({[test_func5(2.12,3.12,4.12,5.12,6.12)]},{[(2.12 + 3.12 + 4.12 + 5.12 + 6.12)]})",
5358  "TeSt_FuNc0 = tEsT_fUnC0()",
5359  "TEst_fuNC0 == tESt_fUNc0()",
5360  "EquaL(tEsT_FuNC1(x),(x))",
5361  "eQuAl(teSt_fUnc2(x,y),(x + y))",
5362  "EqUaL(tEsT_fUNc3(x,y,z),(x + y + z))",
5363  "EQUal(TEst_FunC4(x,y,z,w),(x + y + z + w))",
5364  "eqUAL(tEsT_FuNc5(x,y,z,w,u),(x + y + z + w + u))"
5365  };
5366  static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5367 
5368  std::deque<expression_t> expression_list;
5369 
5370  for (std::size_t i = 0; i < expr_str_list_size; ++i)
5371  {
5372  expression_t expression;
5373  expression.register_symbol_table(symbol_table);
5374 
5376 
5377  if (!parser.compile(expr_str_list[i],expression))
5378  {
5379  printf("run_test16() - Error: %s Expression: %s\n",
5380  parser.error().c_str(),
5381  expr_str_list[i].c_str());
5382 
5383  return false;
5384  }
5385  else
5386  expression_list.push_back(expression);
5387  }
5388 
5389  bool failure = false;
5390 
5391  for (std::size_t i = 0; i < expression_list.size(); ++i)
5392  {
5393  if (T(1) != expression_list[i].value())
5394  {
5395  printf("run_test16() - Error in evaluation! (1) Expression: %s\n",
5396  expr_str_list[i].c_str());
5397 
5398  failure = true;
5399  }
5400  }
5401 
5402  return !failure;
5403 }
5404 
5405 template <typename T>
5406 inline bool run_test17()
5407 {
5409 
5410  T x = T(1.1);
5411  T y = T(2.2);
5412  T z = T(3.3);
5413  T w = T(4.4);
5414  T u = T(5.5);
5415  T v = T(6.6);
5416  T t = T(7.7);
5417 
5418  T one = T(1);
5419  T zero = T(0);
5420 
5421  exprtk::symbol_table<T> symbol_table;
5422  symbol_table.add_constants();
5423  symbol_table.add_variable("x",x);
5424  symbol_table.add_variable("y",y);
5425  symbol_table.add_variable("z",z);
5426  symbol_table.add_variable("w",w);
5427  symbol_table.add_variable("u",u);
5428  symbol_table.add_variable("v",v);
5429  symbol_table.add_variable("t",t);
5430 
5431  symbol_table.add_variable("one",one);
5432  symbol_table.add_variable("zero",zero);
5433 
5434  static const std::string expr_str_list[] =
5435  {
5436  "equal(mand(one,one),1.0)",
5437  "equal(mand(one,zero),0.0)",
5438  "equal(mand(zero,one),0.0)",
5439  "equal(mand(zero,zero),0.0)",
5440  "equal(mand(one,one),1.0)",
5441  "equal(mand(one,one,one),1.0)",
5442  "equal(mand(one,one,one,one),1.0)",
5443  "equal(mand(one,one,one,one,one),1.0)",
5444  "equal(mand(one,one,zero),0.0)",
5445  "equal(mand(one,one,one,zero),0.0)",
5446  "equal(mand(one,one,one,one,zero),0.0)",
5447  "equal(mand(one,one,one,one,one,zero),0.0)",
5448  "equal(mor(one,one),1.0)",
5449  "equal(mor(one,zero),1.0)",
5450  "equal(mor(zero,one),1.0)",
5451  "equal(mor(zero,zero),0.0)",
5452  "equal(mor(one,one),1.0)",
5453  "equal(mor(one,one,zero),1.0)",
5454  "equal(mor(one,zero,one),1.0)",
5455  "equal(mor(one,zero,one,zero),1.0)",
5456  "equal(mor(zero,one),1.0)",
5457  "equal(mor(zero,zero,one),1.0)",
5458  "equal(mor(zero,zero,zero,zero,one),1.0)",
5459  "equal(mor(zero,zero,zero,zero,zero,one),1.0)",
5460  "equal(mor(zero,zero,zero,zero,zero,zero,zero,zero),0.0)",
5461  "equal((one nand one),not(mand(one,one)))",
5462  "equal((one nand zero),not(mand(one,zero)))",
5463  "equal((zero nand one),not(mand(zero,one)))",
5464  "equal((zero nand zero),not(mand(zero,zero)))",
5465  "equal((one nor one),not(mor(one,one)))",
5466  "equal((one nor zero),not(mor(one,zero)))",
5467  "equal((zero nor one),not(mor(zero,one)))",
5468  "equal((zero nor zero),not(mor(zero,zero)))",
5469  "equal(sum(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
5470  "equal(sum(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
5471  "equal(mul(x,y,z,w,u,v,t),(x*y*z*w*u*v*t))",
5472  "equal(mul(x*t,y*v,z*u,w*w,u*z,v*y,t*x),(x*y*z*w*u*v*t)^2)",
5473  "equal(sum(x,1.0,y,2.0,z,3.0,w,4.0,u,5.0,v,6.0,t),(x+y+z+w+u+v+t+21.0))",
5474  "equal(sum(x+1.0,y+2.0,z+3.0,w+4.0,u+5.0,v+6.0,t),(x+y+z+w+u+v+t+21.0))",
5475  "equal(mul(x,1.0,y,2.0,z,3.0,w,4.0,u,5.0,v,6.0,t),(x*y*z*w*u*v*t*720.0))",
5476  "equal(mul(x*1.0,y*2.0,z*3.0,w*4.0,u*5.0,v*6.0,t),(x*y*z*w*u*v*t*720.0))",
5477  "equal(min(x,y,z,w,u,v,t,zero),zero)",
5478  "equal(min(x+y,z+w,u+v,t,zero),zero)",
5479  "equal(max(one,x,y,z,w,u,v,t),t)",
5480  "equal(max(x+y,z+w,u+v,t,one),u+v)",
5481  "equal(avg(x,y,z,w,u,v,t),(x+y+z+w+u+v+t)/7.0)",
5482  "equal(avg(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2/7*(x+y+z+w+u+v+t))"
5483  };
5484  static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5485 
5486  std::deque<expression_t> expression_list;
5487 
5488  for (std::size_t i = 0; i < expr_str_list_size; ++i)
5489  {
5490  expression_t expression;
5491  expression.register_symbol_table(symbol_table);
5492 
5494 
5495  if (!parser.compile(expr_str_list[i],expression))
5496  {
5497  printf("run_test17() - Error: %s Expression: %s\n",
5498  parser.error().c_str(),
5499  expr_str_list[i].c_str());
5500 
5501  return false;
5502  }
5503  else
5504  expression_list.push_back(expression);
5505  }
5506 
5507  bool failure = false;
5508 
5509  for (std::size_t i = 0; i < expression_list.size(); ++i)
5510  {
5511  if (T(1) != expression_list[i].value())
5512  {
5513  printf("run_test17() - Error in evaluation! (1) Expression: %s\n",
5514  expr_str_list[i].c_str());
5515 
5516  failure = true;
5517  }
5518  }
5519 
5520  return !failure;
5521 }
5522 
5523 template <typename T>
5525 {
5527  {
5529  exprtk::set_min_num_args(*this, 0);
5530  exprtk::set_max_num_args(*this, 20);
5531  }
5532 
5533  inline T operator()(const std::vector<T>& arglist)
5534  {
5535  T result = T(0);
5536 
5537  for (std::size_t i = 0; i < arglist.size(); ++i)
5538  {
5539  result += arglist[i];
5540  }
5541 
5542  return result;
5543  }
5544 };
5545 
5546 template <typename T>
5548 {
5551 
5555 
5557 
5559  : scalar_count(0),
5560  vector_count(0),
5561  string_count(0)
5562  {}
5563 
5564  inline T operator()(parameter_list_t params)
5565  {
5566  for (std::size_t i = 0; i < params.size(); ++i)
5567  {
5568  generic_type& gt = params[i];
5569 
5570  switch (gt.type)
5571  {
5573  break;
5574 
5576  break;
5577 
5578  case generic_type::e_string : {
5579  if (
5580  ("CdEf" != exprtk::to_str(string_t(gt))) &&
5581  ("abc123" != exprtk::to_str(string_t(gt)))
5582  )
5583  {
5584  return std::numeric_limits<T>::quiet_NaN();
5585  }
5586  else
5587  string_count++;
5588  }
5589  break;
5590 
5591  default : return std::numeric_limits<T>::quiet_NaN();
5592  }
5593  }
5594 
5595  return T(0);
5596  }
5597 
5598  std::size_t scalar_count;
5599  std::size_t vector_count;
5600  std::size_t string_count;
5601 };
5602 
5603 template <typename T>
5605 {
5607 
5609 
5611  {}
5612 
5614  {
5615  return T(0);
5616  }
5617 
5618  inline T operator()(const std::size_t&, parameter_list_t params)
5619  {
5620  return this->operator()(params);
5621  }
5622 };
5623 
5624 template <typename T>
5626 {
5629 
5633 
5635 
5637  {}
5638 
5639  inline T operator()(parameter_list_t params)
5640  {
5641  for (std::size_t i = 0; i < params.size(); ++i)
5642  {
5643  generic_type& gt = params[i];
5644 
5645  switch (gt.type)
5646  {
5647  case generic_type::e_scalar : {
5648  scalar_t scalar(gt);
5649  scalar() += T(1);
5650  }
5651  break;
5652 
5653  case generic_type::e_vector : {
5654  vector_t vector(gt);
5655 
5656  for (std::size_t x = 0; x < vector.size(); ++x)
5657  {
5658  vector[x] += T(1);
5659  }
5660  }
5661  break;
5662 
5663  case generic_type::e_string : {
5664  string_t string(gt);
5665 
5666  for (std::size_t x = 0; x < string.size(); ++x)
5667  {
5668  string[x] += static_cast<typename string_t::value_t>(1);
5669  }
5670  }
5671  break;
5672 
5673  default : return std::numeric_limits<T>::quiet_NaN();
5674  }
5675  }
5676 
5677  return T(0);
5678  }
5679 
5680  inline T operator()(const std::size_t&, parameter_list_t params)
5681  {
5682  return this->operator()(params);
5683  }
5684 };
5685 
5686 template <typename T>
5688 {
5693 
5695 
5698  {}
5699 
5700  inline T operator()(std::string& result, parameter_list_t params)
5701  {
5702  string_t string(params[0]);
5703 
5704  result.reserve(string.size());
5705  result.clear();
5706 
5707  char c;
5708 
5709  for (std::size_t i = 0; i < string.size(); ++i)
5710  {
5711  if (' ' != (c = string[i]))
5712  result += static_cast<char>(std::toupper(c));
5713  }
5714 
5715  return T(0);
5716  }
5717 
5718  inline T operator()(const std::size_t& param_seq_index, std::string& result, parameter_list_t params)
5719  {
5720  if (1 == param_seq_index)
5721  return this->operator()(result,params);
5722  else
5723  return T(0);
5724  }
5725 };
5726 
5727 template <typename T>
5729 {
5732 
5735 
5738 
5740 
5742  : exprtk::igeneric_function<T>("Z|T*|V")
5743  {}
5744 
5745  inline T operator()(const std::size_t& ps_index, parameter_list_t /*arglist*/)
5746  {
5747  switch (ps_index)
5748  { // Overload resolution:
5749  case 0 : return T(0); // Z - Zero arguments
5750  case 1 : return T(1); // T* - One or more scalars
5751  case 2 : return T(2); // V - One vector
5752  default : return std::numeric_limits<T>::quiet_NaN();
5753  }
5754  }
5755 };
5756 
5757 template <typename T>
5759 {
5762 
5765 
5767 
5769 
5771  : exprtk::igeneric_function<T>("V")
5772  {}
5773 
5774  inline T operator()(parameter_list_t params)
5775  {
5776  vector_t v(params[0]);
5777  return std::accumulate(v.begin(), v.end(), T(0));
5778  }
5779 };
5780 
5781 template <typename T>
5783 {
5788 
5790 
5791  overload_func(const std::string& param_seq_list)
5792  : exprtk::igeneric_function<T>(param_seq_list, igfun_t::e_rtrn_overload),
5793  current_ps_index(std::numeric_limits<std::size_t>::max())
5794  {
5795  clear();
5796  }
5797 
5798  void clear()
5799  {
5801  current_param_seq = "";
5802  }
5803 
5804  inline T operator()(const std::size_t& ps_index,
5805  parameter_list_t parameters)
5806  {
5807  current_ps_index = ps_index;
5808  determine_param_seq(parameters);
5809  return T(1);
5810  }
5811 
5812  inline T operator()(const std::size_t& ps_index,
5813  std::string& result,
5814  parameter_list_t parameters)
5815  {
5816  current_ps_index = ps_index;
5817  determine_param_seq(parameters);
5818  result = "string result";
5819  return T(1);
5820  }
5821 
5823  {
5824  current_param_seq = "";
5825 
5826  for (std::size_t i = 0; i < parameters.size(); ++i)
5827  {
5828  generic_type& gt = parameters[i];
5829 
5830  switch (gt.type)
5831  {
5833  break;
5834 
5836  break;
5837 
5839  break;
5840 
5841  default : continue;
5842  }
5843  }
5844  }
5845 
5846  std::size_t current_ps_index;
5848 
5850  {
5851  test_result_t(const std::size_t psi, const std::string& ps)
5852  : ps_index(psi),
5853  param_seq(ps)
5854  {}
5855 
5856  std::size_t ps_index;
5858  };
5859 };
5860 
5861 template <typename T>
5862 inline bool run_test18()
5863 {
5864  {
5866 
5867  T x = T(1.1);
5868  T y = T(2.2);
5869  T z = T(3.3);
5870  T w = T(4.4);
5871  T u = T(5.5);
5872  T v = T(6.6);
5873  T t = T(7.7);
5874 
5875  va_func<T> vaf;
5876 
5877  exprtk::symbol_table<T> symbol_table;
5878  symbol_table.add_constants();
5879  symbol_table.add_variable("x",x);
5880  symbol_table.add_variable("y",y);
5881  symbol_table.add_variable("z",z);
5882  symbol_table.add_variable("w",w);
5883  symbol_table.add_variable("u",u);
5884  symbol_table.add_variable("v",v);
5885  symbol_table.add_variable("t",t);
5886  symbol_table.add_function("va_func",vaf);
5887 
5888  static const std::string expr_str_list[] =
5889  {
5890  "equal(va_func,(0))",
5891  "equal(va_func(),(0))",
5892  "equal(va_func(1,2,3,4,5,6,7,8,9),(1+2+3+4+5+6+7+8+9))",
5893  "equal(va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9))",
5894  "equal(va_func(x,2,y,4,z,6,w,8,u),(x+2+y+4+z+6+w+8+u))",
5895  "equal(va_func(x,y,z,w,u,v,t,1,2,3),(x+y+z+w+u+v+t+1+2+3))",
5896  "equal(va_func(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
5897  "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))",
5898  "equal(1+va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9)+1)",
5899  "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))",
5900  "equal(va_func(va_func(x),va_func(y),va_func(z)),va_func(x,y,z))",
5901  "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x)))))))),x)",
5902  "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(123.456)))))))),123.456)",
5903  "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+1)))))))),x+1)",
5904  "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+y)))))))),x+y)"
5905  };
5906  static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5907 
5908  std::deque<expression_t> expression_list;
5909 
5910  for (std::size_t i = 0; i < expr_str_list_size; ++i)
5911  {
5912  expression_t expression;
5913  expression.register_symbol_table(symbol_table);
5914 
5916 
5917  if (!parser.compile(expr_str_list[i],expression))
5918  {
5919  printf("run_test18() - VarArg Error: %s Expression: %s\n",
5920  parser.error().c_str(),
5921  expr_str_list[i].c_str());
5922 
5923  return false;
5924  }
5925  else
5926  expression_list.push_back(expression);
5927  }
5928 
5929  bool failure = false;
5930 
5931  for (std::size_t i = 0; i < expression_list.size(); ++i)
5932  {
5933  if (T(1) != expression_list[i].value())
5934  {
5935  printf("run_test18() - Error in evaluation! (1) Expression: %s\n",
5936  expr_str_list[i].c_str());
5937 
5938  failure = true;
5939  }
5940  }
5941 
5942  if (failure)
5943  return false;
5944  }
5945 
5946  {
5949  typedef exprtk::parser<T> parser_t;
5950 
5951  T x = T(33);
5952  T y = T(77);
5953 
5954  T v0[] = { T(1), T(1), T(1), T(1) };
5955  T v1[] = { T(1), T(2), T(3), T(4) };
5956 
5957  std::vector<T> v2;
5958 
5959  v2.push_back(T(5));
5960  v2.push_back(T(6));
5961  v2.push_back(T(7));
5962  v2.push_back(T(8));
5963 
5964  std::string s0 = "AbCdEfGhIj";
5965 
5966  gen_func<T> f;
5967 
5968  symbol_table_t symbol_table;
5969 
5970  symbol_table.add_constants();
5971 
5972  symbol_table.add_variable ("x" , x);
5973  symbol_table.add_variable ("y" , y);
5974  symbol_table.add_vector ("v0" ,v0);
5975  symbol_table.add_vector ("v1" ,v1);
5976  symbol_table.add_vector ("v2" ,v2);
5977  symbol_table.add_stringvar("s0", s0);
5978  symbol_table.add_function ("gen_func", f);
5979 
5980  std::string expression_list[] =
5981  {
5982  "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:5]);",
5983  "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:5]);",
5984  "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:5],v0);",
5985  "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:5],v0, v1 + v2);",
5986  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(x, 2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2]);",
5987  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x);",
5988  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x, 2x + y);",
5989  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z);",
5990  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func('abc123', s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3);",
5991  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');"
5992  };
5993 
5994  static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
5995 
5996  bool failure = false;
5997 
5998  for (std::size_t i = 0; i < expression_list_size; ++i)
5999  {
6000  expression_t expression;
6001 
6002  expression.register_symbol_table(symbol_table);
6003 
6004  parser_t parser;
6005 
6006  if (!parser.compile(expression_list[i],expression))
6007  {
6008  printf("run_test18() - GenFunc Error: %s Expression: %s [2]\n",
6009  parser.error().c_str(),
6010  expression_list[i].c_str());
6011 
6012  failure = true;
6013  continue;
6014  }
6015 
6016  f.scalar_count = 0;
6017  f.vector_count = 0;
6018  f.string_count = 0;
6019 
6020  expression.value();
6021 
6022  if (
6023  (4 != f.scalar_count) ||
6024  (3 != f.vector_count) ||
6025  (2 != f.string_count)
6026  )
6027  {
6028  printf("run_test18() - Error in evaluation! (2) Expression: %s "
6029  "sc_count = %d "
6030  "vr_count = %d "
6031  "st_count = %d\n",
6032  expression_list[i].c_str(),
6033  static_cast<int>(f.scalar_count),
6034  static_cast<int>(f.vector_count),
6035  static_cast<int>(f.string_count));
6036 
6037  failure = true;
6038  }
6039  }
6040 
6041  if (failure)
6042  return false;
6043  }
6044 
6045  {
6048  typedef exprtk::parser<T> parser_t;
6049 
6050  T x = T(33);
6051  T y = T(77);
6052 
6053  T v0[] = { T(1), T(1), T(1), T(1) };
6054  T v1[] = { T(1), T(2), T(3), T(4) };
6055  T v2[] = { T(5), T(6), T(7), T(8) };
6056 
6057  std::string s0 = "AbCdEfGhIj";
6058 
6059  gen_func2<T> f;
6060 
6061  symbol_table_t symbol_table;
6062 
6063  symbol_table.add_constants();
6064 
6065  symbol_table.add_variable ("x" , x);
6066  symbol_table.add_variable ("y" , y);
6067  symbol_table.add_vector ("v0" ,v0);
6068  symbol_table.add_vector ("v1" ,v1);
6069  symbol_table.add_vector ("v2" ,v2);
6070  symbol_table.add_stringvar("s0", s0);
6071  symbol_table.add_function ("foo", f);
6072 
6073  std::string expression_list[] =
6074  {
6075  "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]);",
6076  "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:5],v0);",
6077  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2);",
6078  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x, 2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2]);",
6079  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(2x + y, z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x);",
6080  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(z, 2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x, 2x + y);",
6081  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(2w / 3, 'abc123',s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z);",
6082  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo('abc123', s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3);",
6083  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0[2:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');",
6084  "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');",
6085  "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]);",
6086  "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]);",
6087  "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]);",
6088  "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]);",
6089  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6090  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6091  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6092  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6093  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6094  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6095  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6096  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6097  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6098  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6099  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6100  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6101  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6102  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6103  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6104  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6105  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6106  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6107  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6108  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6109  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6110  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6111  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6112  "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6113  "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]);",
6114  "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]);",
6115  "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]);",
6116  "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]);"
6117  };
6118 
6119  static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6120 
6121  std::string parameter_type_list[] =
6122  {
6123  "VVTTTTVSS",
6124  "VTTTTVSSV",
6125  "TTTTVSSVV",
6126  "TTTVSSVVT",
6127  "TTVSSVVT*",
6128  "TVSSVVT*" ,
6129  "VSSVVT*" ,
6130  "SSVVTTTTV",
6131  "SVVTTTTVS",
6132  "SVVTTTTVS",
6133  "V*T*VS*" ,
6134  "V*TTTTVSS",
6135  "VVT*VSS" ,
6136  "VVTTTTVS*",
6137  "T*",
6138  "T*",
6139  "T*",
6140  "T*",
6141  "S*",
6142  "S*",
6143  "S*",
6144  "S*",
6145  "V*",
6146  "V*",
6147  "V*",
6148  "V*",
6149  "T",
6150  "TT",
6151  "TTT",
6152  "TTTT",
6153  "S",
6154  "SS",
6155  "SSS",
6156  "SSSS",
6157  "V",
6158  "VV",
6159  "VVV",
6160  "VVVV",
6161  "TTTTTTT|STSTSTS|V*T*VS*" ,
6162  "TTTTTTT|STSTSTS|V*TTTTVSS",
6163  "TTTTTTT|STSTSTS|VVT*VSS" ,
6164  "TTTTTTT|STSTSTS|VVTTTTVS*",
6165  };
6166 
6167  bool failure = false;
6168 
6169  for (std::size_t i = 0; i < expression_list_size; ++i)
6170  {
6171  expression_t expression;
6172 
6173  expression.register_symbol_table(symbol_table);
6174 
6175  parser_t parser;
6176 
6177  f.parameter_sequence = parameter_type_list[i];
6178 
6179  if (!parser.compile(expression_list[i],expression))
6180  {
6181  printf("run_test18() - GenFunc2 Error: %s Expression: %s Parameter Sequence: %s [3]\n",
6182  parser.error().c_str(),
6183  expression_list[i].c_str(),
6184  parameter_type_list[i].c_str());
6185 
6186  failure = true;
6187  continue;
6188  }
6189 
6190  expression.value();
6191  }
6192 
6193  if (failure)
6194  return false;
6195  }
6196 
6197  {
6198  bool failure = false;
6199 
6200  std::string expression_list[] =
6201  {
6202  "foo(v0,v1,v2,x,y,s0);",
6203  "foo(v1,v2,x,y,s0,v0);",
6204  "foo(v2,x,y,s0,v0,v1);",
6205  "foo(x,y,s0,v0,v1,v2);",
6206  "foo(y,s0,v0,v1,v2,x);",
6207  "foo(s0,v0,v1,v2,x,y);"
6208  };
6209 
6210  static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6211 
6212  std::string parameter_type_list[] =
6213  {
6214  "VVVTTS",
6215  "VVTTSV",
6216  "VTTSVV",
6217  "TTSVVV",
6218  "TSVVVT",
6219  "SVVVTT"
6220  };
6221 
6222  for (std::size_t i = 0; i < expression_list_size; ++i)
6223  {
6226  typedef exprtk::parser<T> parser_t;
6227 
6228  T x = T(33);
6229  T y = T(77);
6230 
6231  T v0[] = { T(1), T(1), T(1), T(1) };
6232  T v1[] = { T(1), T(2), T(3), T(4) };
6233  T v2[] = { T(5), T(6), T(7), T(8) };
6234 
6235  std::string s0 = "AbCdEfGhIj";
6236 
6237  T x_inc = T(34);
6238  T y_inc = T(78);
6239 
6240  T v0_inc[] = { T(2), T(2), T(2), T(2) };
6241  T v1_inc[] = { T(2), T(3), T(4), T(5) };
6242  T v2_inc[] = { T(6), T(7), T(8), T(9) };
6243 
6244  std::size_t sizeof_vec = sizeof(v0) / sizeof(T);
6245 
6246  std::string s0_inc = "BcDeFgHiJk";
6247 
6248  inc_func<T> f;
6249 
6250  symbol_table_t symbol_table;
6251 
6252  symbol_table.add_constants();
6253 
6254  symbol_table.add_variable ("x" , x);
6255  symbol_table.add_variable ("y" , y);
6256  symbol_table.add_vector ("v0" ,v0);
6257  symbol_table.add_vector ("v1" ,v1);
6258  symbol_table.add_vector ("v2" ,v2);
6259  symbol_table.add_stringvar("s0", s0);
6260  symbol_table.add_function ("foo", f);
6261 
6262  expression_t expression;
6263 
6264  expression.register_symbol_table(symbol_table);
6265 
6266  parser_t parser;
6267 
6268  f.parameter_sequence = parameter_type_list[i];
6269 
6270  if (!parser.compile(expression_list[i],expression))
6271  {
6272  printf("run_test18() - IncFunc Error: %s Expression: %s Parameter Sequence: %s [4]\n",
6273  parser.error().c_str(),
6274  expression_list[i].c_str(),
6275  parameter_type_list[i].c_str());
6276 
6277  failure = true;
6278  continue;
6279  }
6280 
6281  expression.value();
6282 
6283  if (x != x_inc)
6284  {
6285  printf("run_test18() - Error in evaluation! (3) Expression: %s Check: x\n",
6286  expression_list[i].c_str());
6287  failure = true;
6288  }
6289 
6290  if (y != y_inc)
6291  {
6292  printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
6293  expression_list[i].c_str());
6294  failure = true;
6295  }
6296 
6297  if (s0 != s0_inc)
6298  {
6299  printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
6300  expression_list[i].c_str());
6301  failure = true;
6302  }
6303 
6304  if (!std::equal(v0,v0 + sizeof_vec,v0_inc))
6305  {
6306  printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v0\n",
6307  expression_list[i].c_str());
6308  failure = true;
6309  }
6310 
6311  if (!std::equal(v1,v1 + sizeof_vec,v1_inc))
6312  {
6313  printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v1\n",
6314  expression_list[i].c_str());
6315  failure = true;
6316  }
6317 
6318  if (!std::equal(v2,v2 + sizeof_vec,v2_inc))
6319  {
6320  printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v2\n",
6321  expression_list[i].c_str());
6322  failure = true;
6323  }
6324  }
6325 
6326  if (failure)
6327  return false;
6328  }
6329 
6330  {
6331  bool failure = false;
6332 
6334 
6335  std::string s0 = "XXXXXXXXXXXXXXX";
6336  std::string s1 = "XXXXXXXXXXXXXXX";
6337  std::string s2 = "XXXXXXXXXXXXXXX";
6338  std::string s3 = "XXXXXXXXXXXXXXX";
6339  std::string s4 = "XXXXXXXXXXXXXXX";
6340 
6343  typedef exprtk::parser<T> parser_t;
6344 
6345  symbol_table_t symbol_table;
6346 
6347  symbol_table.add_constants();
6348 
6349  symbol_table.add_stringvar("s0", s0);
6350  symbol_table.add_stringvar("s1", s1);
6351  symbol_table.add_stringvar("s2", s2);
6352  symbol_table.add_stringvar("s3", s3);
6353  symbol_table.add_stringvar("s4", s4);
6354 
6355  symbol_table.add_function("remspc_uc",rsauc);
6356 
6357  std::string program = " s0 := 'How now '; "
6358  " s1 := 'brown cow?'; "
6359  " s2 := remspc_uc(s0 + s1); "
6360  " s3 := remspc_uc(s0) + s1; "
6361  " s4 := s0 + remspc_uc(s1); "
6362  " remspc_uc(s0 + s1) == remspc_uc(s0) + remspc_uc(s1);";
6363 
6364  std::string parameter_type_list[] =
6365  {
6366  "VVVTTT|S",
6367  "VVTTTV|S",
6368  "VTTTVV|S",
6369  "TTTVVV|S",
6370  "TTVVVT|S",
6371  "TVVVTT|S"
6372  };
6373 
6374  std::size_t parameter_type_list_size = sizeof(parameter_type_list) / sizeof(std::string);
6375 
6376  for (std::size_t i = 0; i < parameter_type_list_size; ++i)
6377  {
6378  expression_t expression;
6379 
6380  expression.register_symbol_table(symbol_table);
6381 
6382  parser_t parser;
6383 
6384  rsauc.parameter_sequence = parameter_type_list[i];
6385 
6386  if (!parser.compile(program,expression))
6387  {
6388  printf("run_test18() - Error: %s\tExpression: %s\n",
6389  parser.error().c_str(),
6390  program.c_str());
6391 
6392  return false;
6393  }
6394 
6395  T result = expression.value();
6396 
6397  if (result != T(1))
6398  {
6399  printf("run_test18() - Error in evaluation! (4) Expression: %s Result <> 1\n",
6400  program.c_str());
6401  failure = true;
6402  }
6403 
6404  if (result != T(1))
6405  {
6406  printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
6407  program.c_str());
6408  failure = true;
6409  }
6410 
6411  if ("How now " != s0)
6412  {
6413  printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
6414  program.c_str());
6415  failure = true;
6416  }
6417 
6418  if ("brown cow?" != s1)
6419  {
6420  printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s1\n",
6421  program.c_str());
6422  failure = true;
6423  }
6424 
6425  if ("HOWNOWBROWNCOW?" != s2)
6426  {
6427  printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s2\n",
6428  program.c_str());
6429  failure = true;
6430  }
6431 
6432  if ("HOWNOWbrown cow?" != s3)
6433  {
6434  printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s3\n",
6435  program.c_str());
6436  failure = true;
6437  }
6438 
6439  if ("How now BROWNCOW?" != s4)
6440  {
6441  printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s4\n",
6442  program.c_str());
6443  failure = true;
6444  }
6445  }
6446 
6447  if (failure)
6448  return false;
6449  }
6450 
6451  {
6452  bool failure = false;
6453 
6456  typedef exprtk::parser<T> parser_t;
6457 
6458  symbol_table_t symbol_table;
6459 
6460  T v[4] = {T(5), T(6), T(7), T(8)};
6461 
6462  symbol_table.add_vector("v",v);
6463 
6464  vararg_func<T> vaf;
6465  symbol_table.add_function("vararg_func",vaf);
6466 
6467  expression_t expression;
6468  expression.register_symbol_table(symbol_table);
6469 
6470  parser_t parser;
6471 
6472  std::string programs[] =
6473  {
6474  "equal(0,vararg_func())",
6475  "equal(1,vararg_func() + 1)",
6476  "equal(1,1 + vararg_func())",
6477  "equal(1,vararg_func + 1)",
6478  "equal(1,1 + vararg_func)",
6479  "equal(0,vararg_func() + vararg_func)",
6480  "equal(0,vararg_func + vararg_func())",
6481  "equal(1,vararg_func + vararg_func(1))",
6482  "equal(1,vararg_func + vararg_func(1,2))",
6483  "equal(2,vararg_func + vararg_func(v))",
6484  "equal(1,vararg_func() + vararg_func(1))",
6485  "equal(1,vararg_func() + vararg_func(1,2))",
6486  "equal(2,vararg_func() + vararg_func(v))",
6487  "equal(2,vararg_func(v))",
6488  "equal(1,vararg_func(1))",
6489  "equal(1,vararg_func(1,2,3))",
6490  "equal(1,vararg_func(5,6,7,8))",
6491  "equal(5,vararg_func(v) + 3)",
6492  "equal(5,vararg_func(1) + 4)",
6493  "equal(6,vararg_func(1,2,3) + 5)",
6494  "equal(7,vararg_func(5,6,7,8) + 6)"
6495  };
6496 
6497  static const std::size_t programs_size = sizeof(programs) / sizeof(std::string);
6498 
6499  for (std::size_t i = 0; i < programs_size; ++i)
6500  {
6501  if (!parser.compile(programs[i],expression))
6502  {
6503  printf("run_test18() - Error: %s\tExpression: %s\n",
6504  parser.error().c_str(),
6505  programs[i].c_str());
6506 
6507  failure = true;
6508  }
6509  else if (T(1) != expression.value())
6510  {
6511  printf("run_test18() - Error in evaluation! (5) Expression: %s\n",
6512  programs[i].c_str());
6513 
6514  failure = true;
6515  }
6516  }
6517 
6518  if (failure)
6519  return false;
6520  }
6521 
6522  {
6523  bool failure = false;
6524 
6527  typedef exprtk::parser<T> parser_t;
6528 
6529  std::vector<T> v0;
6530  std::vector<T> v1;
6531  std::vector<T> v2;
6532  std::vector<T> v3;
6533 
6534  #define pb(v,N) \
6535  v.push_back(T(N)); \
6536 
6537  pb(v0,0) pb(v0,0) pb(v0,0) pb(v0,0) pb(v0,0) pb(v0, 0) pb(v0, 0)
6538  pb(v1,0) pb(v1,2) pb(v1,4) pb(v1,6) pb(v1,8) pb(v1,10) pb(v1,12)
6539  pb(v2,1) pb(v2,3) pb(v2,5) pb(v2,7) pb(v2,9) pb(v2,11) pb(v2,13)
6540  pb(v3,0) pb(v3,1) pb(v3,2) pb(v3,3) pb(v3,4) pb(v3, 5) pb(v3, 6)
6541  #undef pb
6542 
6543  const std::string expr_string = "sum(v + 1)";
6544 
6546 
6547  symbol_table_t symbol_table;
6548  symbol_table.add_vector("v",v);
6549 
6550  expression_t expression;
6551  expression.register_symbol_table(symbol_table);
6552 
6553  parser_t parser;
6554 
6555  if (!parser.compile(expr_string,expression))
6556  {
6557  printf("run_test18() - Error: %s\tExpression: %s\n",
6558  parser.error().c_str(),
6559  expr_string.c_str());
6560 
6561  failure = true;
6562  }
6563 
6564  T sum = { T(0) };
6565 
6566  sum = expression.value();
6567 
6568  if (not_equal(sum,T(7)))
6569  {
6570  printf("run_test18() - Error in evaluation! (6) Expression: %s\n",
6571  expr_string.c_str());
6572  failure = true;
6573  }
6574 
6575  v.rebase(v1.data());
6576  sum = expression.value();
6577 
6578  if (not_equal(sum,T(49)))
6579  {
6580  printf("run_test18() - Error in evaluation! (7) Expression: %s\n",
6581  expr_string.c_str());
6582  failure = true;
6583  }
6584 
6585  v.rebase(v2.data());
6586  sum = expression.value();
6587 
6588  if (not_equal(sum,T(56)))
6589  {
6590  printf("run_test18() - Error in evaluation! (8) Expression: %s\n",
6591  expr_string.c_str());
6592  failure = true;
6593  }
6594 
6595  v.rebase(v3.data());
6596  sum = expression.value();
6597 
6598  if (not_equal(sum,T(28)))
6599  {
6600  printf("run_test18() - Error in evaluation! (9) Expression: %s\n",
6601  expr_string.c_str());
6602  failure = true;
6603  }
6604 
6605  if (failure)
6606  return false;
6607  }
6608 
6609  {
6610  bool failure = false;
6611 
6614  typedef exprtk::parser<T> parser_t;
6615 
6616  std::vector<T> v0;
6617  std::vector<T> s;
6618 
6619  #define pb(v,N) \
6620  v.push_back(T(N)); \
6621 
6622  pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
6623  pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
6624 
6625  pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
6626  pb(s,15) pb(s,18) pb(s,21)
6627  #undef pb
6628 
6629  const std::string expr_string = "v[0] + v[1] + v[2]";
6630 
6632 
6633  symbol_table_t symbol_table;
6634  symbol_table.add_vector("v",v);
6635 
6636  expression_t expression;
6637  expression.register_symbol_table(symbol_table);
6638 
6639  parser_t parser;
6640 
6641  if (!parser.compile(expr_string,expression))
6642  {
6643  printf("run_test18() - Error: %s\tExpression: %s\n",
6644  parser.error().c_str(),
6645  expr_string.c_str());
6646 
6647  failure = true;
6648  }
6649 
6650  for (std::size_t i = 0; i < v0.size() - 4; ++i)
6651  {
6652  v.rebase(v0.data() + i);
6653 
6654  T sum = expression.value();
6655 
6656  if (not_equal(sum,s[i]))
6657  {
6658  printf("run_test18() - Error in evaluation! (7) Expression: %s Expected: %5.3f Computed: %5.3f\n",
6659  expr_string.c_str(),
6660  s[i],
6661  sum);
6662 
6663  failure = true;
6664  }
6665 
6666  }
6667 
6668  if (failure)
6669  return false;
6670  }
6671 
6672  {
6673  bool failure = false;
6674 
6677  typedef exprtk::parser<T> parser_t;
6678 
6679  std::vector<T> v0;
6680  std::vector<T> s;
6681 
6682  #define pb(v,N) \
6683  v.push_back(T(N)); \
6684 
6685  pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
6686  pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
6687 
6688  pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
6689  pb(s,15) pb(s,18) pb(s,21)
6690  #undef pb
6691 
6692  const std::string expr_string = "var i := 0; var j := 1; var k := 2; v[i] + v[j] + v[k]";
6693 
6695 
6696  symbol_table_t symbol_table;
6697  symbol_table.add_vector("v",v);
6698 
6699  expression_t expression;
6700  expression.register_symbol_table(symbol_table);
6701 
6702  parser_t parser;
6703 
6704  if (!parser.compile(expr_string,expression))
6705  {
6706  printf("run_test18() - Error: %s\tExpression: %s\n",
6707  parser.error().c_str(),
6708  expr_string.c_str());
6709 
6710  failure = true;
6711  }
6712 
6713  for (std::size_t i = 0; i < v0.size() - 4; ++i)
6714  {
6715  v.rebase(v0.data() + i);
6716 
6717  T sum = expression.value();
6718 
6719  if (not_equal(sum,s[i]))
6720  {
6721  printf("run_test18() - Error in evaluation! (8) Expression: %s Expected: %5.3f Computed: %5.3f\n",
6722  expr_string.c_str(),
6723  s[i],
6724  sum);
6725 
6726  failure = true;
6727  }
6728 
6729  }
6730 
6731  if (failure)
6732  return false;
6733  }
6734 
6735  {
6736  bool failure = false;
6737 
6740  typedef exprtk::parser<T> parser_t;
6741 
6742  std::vector<T> v0;
6743  std::vector<T> s;
6744 
6745  #define pb(v,N) \
6746  v.push_back(T(N)); \
6747 
6748  pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
6749  pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
6750 
6751  pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
6752  pb(s,15) pb(s,18) pb(s,21)
6753  #undef pb
6754 
6755  const std::string expr_string = "var i := 0; v[i + 0] + v[i + 1] + v[i + 2]";
6756 
6758 
6759  symbol_table_t symbol_table;
6760  symbol_table.add_vector("v",v);
6761 
6762  expression_t expression;
6763  expression.register_symbol_table(symbol_table);
6764 
6765  parser_t parser;
6766 
6767  if (!parser.compile(expr_string,expression))
6768  {
6769  printf("run_test18() - Error: %s\tExpression: %s\n",
6770  parser.error().c_str(),
6771  expr_string.c_str());
6772 
6773  failure = true;
6774  }
6775 
6776  for (std::size_t i = 0; i < v0.size() - 4; ++i)
6777  {
6778  v.rebase(v0.data() + i);
6779 
6780  T sum = expression.value();
6781 
6782  if (not_equal(sum,s[i]))
6783  {
6784  printf("run_test18() - Error in evaluation! (9) Expression: %s Expected: %5.3f Computed: %5.3f\n",
6785  expr_string.c_str(),
6786  s[i],
6787  sum);
6788 
6789  failure = true;
6790  }
6791 
6792  }
6793 
6794  if (failure)
6795  return false;
6796  }
6797 
6798  {
6801  typedef exprtk::parser<T> parser_t;
6802 
6803  T v0[] = { T(0), T(1), T(2), T(3), T(4) };
6804  T v1[] = { T(5), T(6), T(7), T(8), T(9) };
6805 
6806  const std::size_t v0_size = sizeof(v0) / sizeof (T);
6807  const std::size_t v1_size = sizeof(v1) / sizeof (T);
6808 
6810 
6811  vecrebase_func<T> vec_sum;
6812 
6813  symbol_table_t symbol_table;
6814  symbol_table.add_vector("v",v);
6815  symbol_table.add_function("vec_sum",vec_sum);
6816 
6817  expression_t expression;
6818  expression.register_symbol_table(symbol_table);
6819 
6820  parser_t parser;
6821 
6822  const std::string expr_string = "vec_sum(v)";
6823 
6824  if (!parser.compile(expr_string,expression))
6825  {
6826  printf("run_test18() - Error: %s\tExpression: %s\n",
6827  parser.error().c_str(),
6828  expr_string.c_str());
6829 
6830  return false;
6831  }
6832 
6833  const T expected_result0 = std::accumulate(v0, v0 + v0_size,T(0));
6834 
6835  if (expression.value() != expected_result0)
6836  {
6837  printf("run_test18() - Error in evaluation! (10.1) Expression: %s Expected: %5.3f Computed: %5.3f\n",
6838  expr_string.c_str(),
6839  expected_result0,
6840  expression.value());
6841 
6842  return false;
6843  }
6844 
6845  v.rebase(v1);
6846 
6847  const T expected_result1 = std::accumulate(v1, v1 + v1_size,T(0));
6848 
6849  if (expression.value() != expected_result1)
6850  {
6851  printf("run_test18() - Error in evaluation! (10.2) Expression: %s Expected: %5.3f Computed: %5.3f\n",
6852  expr_string.c_str(),
6853  expected_result1,
6854  expression.value());
6855 
6856  return false;
6857  }
6858  }
6859 
6860  {
6861  bool failure = false;
6862 
6865  typedef exprtk::parser<T> parser_t;
6866 
6868 
6869  symbol_table_t symbol_table;
6870  symbol_table.add_package(vecops_pkg);
6871 
6872  std::string expr_str_list[] =
6873  {
6874  "var v[9] := {1,2,3,4,5,6,7,8,9}; all_true(v) == true" ,
6875  "var v[6] := {-1,-2,-3,-4,-5,-6}; all_true(v) == true" ,
6876  "var v[8] := {1,2,3,0,0,0,0,0}; all_true(v) == false",
6877  "var v[8] := {-1,-2,-3,0,0,0,0,0}; all_true(v) == false",
6878  "var v[9] := {0,0,0,0,0,0,0,0,0}; all_true(v + 1) == true",
6879 
6880  "var v[9] := {0,0,0,0,0,0,0,0,0}; all_false(v) == true" ,
6881  "var v[9] := {0,0,0,0,0,1,2,3,4}; all_false(v) == false" ,
6882  "var v[8] := {0,0,0,0,0,-1,-2,-3}; all_false(v) == false" ,
6883  "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
6884 
6885  "var v[9] := {0,0,0,0,0,0,0,0,1}; any_true(v) == true" ,
6886  "var v[9] := {0,0,0,0,1,0,0,0,0}; any_true(v) == true" ,
6887  "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v) == false" ,
6888  "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v + 1) == true",
6889 
6890  "var v[9] := {1,1,1,1,1,1,1,1,0}; any_false(v) == true" ,
6891  "var v[9] := {1,1,1,1,0,1,1,1,1}; any_false(v) == true" ,
6892  "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v) == false" ,
6893  "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
6894 
6895  "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v) == 0" ,
6896  "var v[9] := {0,0,0,0,0,0,0,0,1}; count(v) == 1" ,
6897  "var v[9] := {0,0,0,0,0,0,0,2,1}; count(v) == 2" ,
6898  "var v[9] := {0,0,0,0,0,0,3,2,1}; count(v) == 3" ,
6899  "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v + 1) == v[]",
6900  "var v[9] := {1,1,1,1,1,1,1,1,1}; count(v - 1) == 0",
6901 
6902  "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,r); sum(v == r) == v[]",
6903  "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",
6904  "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",
6905  "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",
6906 
6907  "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; rol(v,3); sum(v == r) == v[]",
6908  "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; ror(v,3); sum(v == r) == v[]",
6909 
6910  "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; rol(v,2); sum(v == r) == v[]",
6911  "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; ror(v,2); sum(v == r) == v[]",
6912 
6913  "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[]",
6914  "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[]",
6915 
6916  "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,0,0}; shftl(v,2); sum(v == r) == v[]",
6917  "var v[5] := {1,2,3,4,5}; var r[5] := {5,0,0,0,0}; shftl(v,4); sum(v == r) == v[]",
6918  "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftl(v,5); sum(v == r) == v[]",
6919 
6920  "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,1,2,3}; shftr(v,2); sum(v == r) == v[]",
6921  "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,1}; shftr(v,4); sum(v == r) == v[]",
6922  "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftr(v,5); sum(v == r) == v[]",
6923 
6924  "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[]",
6925  "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[]",
6926 
6927  "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
6928  "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
6929  "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,1,3); sum(v == r) == v[]",
6930  "var v[5] := {5,4,2,3,1}; var r[5] := {5,2,3,4,1}; sort(v,1,3); sum(v == r) == v[]",
6931  "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,0,2); sum(v == r) == v[]",
6932  "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,2,4); sum(v == r) == v[]",
6933 
6934  "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
6935  "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'aScEnDiNg'); sum(v == r) == v[]",
6936  "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
6937  "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[]",
6938  "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[]",
6939  "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[]",
6940 
6941  "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
6942  "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'DeScEnDiNg'); sum(v == r) == v[]",
6943  "var v[5] := {5,4,3,2,1}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
6944  "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[]",
6945  "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[]",
6946  "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[]",
6947 
6948  "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); v[v[] / 2] == 5",
6949  "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); v[v[] / 3] == 4",
6950 
6951  "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)",
6952  "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)",
6953 
6954  "var v[5]; iota(v,2); var r[5] := {0,2,4,6,8}; sum(v == r) == v[]",
6955  "var v[5]; iota(v,2,1); var r[5] := {1,3,5,7,9}; sum(v == r) == v[]",
6956  "var v[5]; iota(v,1,1,3); var r[5] := {0,0,1,2,0}; sum(v == r) == v[]",
6957  "var v[5]; iota(v,2,2,1,3);var r[5] := {0,2,4,6,0}; sum(v == r) == v[]",
6958  "var v[5]; iota(v,2,1,1,3);var r[5] := {0,1,3,5,0}; sum(v == r) == v[]",
6959 
6960  " 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[]",
6961  " 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[]",
6962 
6963  " 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[]",
6964  " 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[]",
6965  " 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[]",
6966  };
6967 
6968  const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6969 
6970  parser_t parser;
6971 
6972  for (std::size_t i = 0; i < expr_str_list_size; ++i)
6973  {
6974  expression_t expression;
6975  expression.register_symbol_table(symbol_table);
6976 
6977  if (!parser.compile(expr_str_list[i], expression))
6978  {
6979  printf("run_test18() - Error: %s Expression: %s\n",
6980  parser.error().c_str(),
6981  expr_str_list[i].c_str());
6982 
6983  failure = true;
6984 
6985  continue;
6986  }
6987 
6988  T result = expression.value();
6989 
6990  if (result != T(1))
6991  {
6992  printf("run_test18() - Error in evaluation! (11) Expression: %s\n",
6993  expr_str_list[i].c_str());
6994 
6995  failure = true;
6996  }
6997  }
6998 
6999  if (failure)
7000  return false;
7001  }
7002 
7003  {
7005 
7006  std::string a = "a";
7007  std::string b = "b";
7008  std::string c = "c";
7009  std::string d = "d";
7010 
7011  T x = T(1.1);
7012  T y = T(2.2);
7013  T z = T(3.3);
7014  T w = T(4.4);
7015 
7016  overload_func<T> ovrld_func
7017  (
7018  "T:T|T:TT|T:TTT|T:TTTT|"
7019  "T:S|T:SS|T:SSS|T:SSSS|"
7020  "T:ST|T:STS|T:STST|"
7021  "T:TS|T:TST|T:TSTS|"
7022  "T:TTSS|T:SSTT|T:STTS|T:TSST"
7023  );
7024 
7025  exprtk::symbol_table<T> symbol_table;
7026 
7027  symbol_table.add_constants();
7028  symbol_table.add_variable ("x",x);
7029  symbol_table.add_variable ("y",y);
7030  symbol_table.add_variable ("z",z);
7031  symbol_table.add_variable ("w",w);
7032 
7033  symbol_table.add_stringvar("a",a);
7034  symbol_table.add_stringvar("b",b);
7035  symbol_table.add_stringvar("c",c);
7036  symbol_table.add_stringvar("d",d);
7037 
7038  symbol_table.add_function("foo",ovrld_func);
7039 
7040  typedef typename overload_func<T>::test_result_t test_result_t;
7041  typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
7042 
7043  static const test_pack_t test_pack_list[] =
7044  {
7045  test_pack_t("foo(x)" , test_result_t( 0, "T" )),
7046  test_pack_t("foo(x, y)" , test_result_t( 1, "TT" )),
7047  test_pack_t("foo(x, y, z)" , test_result_t( 2, "TTT" )),
7048  test_pack_t("foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
7049  test_pack_t("foo(x + y)" , test_result_t( 0, "T" )),
7050  test_pack_t("foo(x + y, y + z)" , test_result_t( 1, "TT" )),
7051  test_pack_t("foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
7052  test_pack_t("foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
7053  test_pack_t("foo(a)" , test_result_t( 4, "S" )),
7054  test_pack_t("foo(a, b)" , test_result_t( 5, "SS" )),
7055  test_pack_t("foo(a, b, c)" , test_result_t( 6, "SSS" )),
7056  test_pack_t("foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
7057  test_pack_t("foo(a + b)" , test_result_t( 4, "S" )),
7058  test_pack_t("foo(a + b, b + c)" , test_result_t( 5, "SS" )),
7059  test_pack_t("foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
7060  test_pack_t("foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
7061  test_pack_t("foo(a, x)" , test_result_t( 8, "ST" )),
7062  test_pack_t("foo(a, x, b)" , test_result_t( 9, "STS" )),
7063  test_pack_t("foo(a, x, b, y)" , test_result_t(10, "STST")),
7064  test_pack_t("foo(a + b, x + y)" , test_result_t( 8, "ST" )),
7065  test_pack_t("foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
7066  test_pack_t("foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
7067  test_pack_t("foo(x, a)" , test_result_t(11, "TS" )),
7068  test_pack_t("foo(x, a, y)" , test_result_t(12, "TST" )),
7069  test_pack_t("foo(x, a, y, b)" , test_result_t(13, "TSTS")),
7070  test_pack_t("foo(x + y, a + b)" , test_result_t(11, "TS" )),
7071  test_pack_t("foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
7072  test_pack_t("foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
7073  test_pack_t("foo(x, y, a, b)" , test_result_t(14, "TTSS")),
7074  test_pack_t("foo(a, b, x, y)" , test_result_t(15, "SSTT")),
7075  test_pack_t("foo(a, x, y, b)" , test_result_t(16, "STTS")),
7076  test_pack_t("foo(x, a, b, y)" , test_result_t(17, "TSST")),
7077  test_pack_t("foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
7078  test_pack_t("foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
7079  test_pack_t("foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
7080  test_pack_t("foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
7081  };
7082 
7083  static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
7084 
7085  std::deque<expression_t> expression_list;
7086 
7087  for (std::size_t i = 0; i < test_pack_list_size; ++i)
7088  {
7089  expression_t expression;
7090  expression.register_symbol_table(symbol_table);
7091 
7093 
7094  if (!parser.compile(test_pack_list[i].first, expression))
7095  {
7096  printf("run_test18() - (12) Overload VarArg Error: %s Expression: %s\n",
7097  parser.error().c_str(),
7098  test_pack_list[i].first.c_str());
7099 
7100  return false;
7101  }
7102  else
7103  expression_list.push_back(expression);
7104  }
7105 
7106  bool failure = false;
7107 
7108  for (std::size_t i = 0; i < expression_list.size(); ++i)
7109  {
7110  ovrld_func.clear();
7111 
7112  if (T(1) != expression_list[i].value())
7113  {
7114  printf("run_test18() - Error in evaluation! (12) Expression: %s\n",
7115  test_pack_list[i].first.c_str());
7116 
7117  failure = true;
7118  }
7119 
7120  if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
7121  {
7122  printf("run_test18() - Error with ps_index (12) Expression: %s Expected: %d Got: %d\n",
7123  test_pack_list[i].first.c_str(),
7124  static_cast<int>(test_pack_list[i].second.ps_index),
7125  static_cast<int>(ovrld_func.current_ps_index));
7126 
7127  failure = true;
7128  }
7129 
7130  if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
7131  {
7132  printf("run_test18() - Error with parameter seq (12) Expression: %s Expected: %s Got: %s\n",
7133  test_pack_list[i].first.c_str(),
7134  test_pack_list[i].second.param_seq.c_str(),
7135  ovrld_func.current_param_seq.c_str());
7136 
7137  failure = true;
7138  }
7139  ::fflush(stdout);
7140  }
7141 
7142  if (failure)
7143  return false;
7144  }
7145 
7146  {
7148 
7149  std::string a = "a";
7150  std::string b = "b";
7151  std::string c = "c";
7152  std::string d = "d";
7153  std::string result = "";
7154 
7155  T x = T(1.1);
7156  T y = T(2.2);
7157  T z = T(3.3);
7158  T w = T(4.4);
7159 
7160  overload_func<T> ovrld_func
7161  (
7162  "S:T|S:TT|S:TTT|S:TTTT|"
7163  "S:S|S:SS|S:SSS|S:SSSS|"
7164  "S:ST|S:STS|S:STST|"
7165  "S:TS|S:TST|S:TSTS|"
7166  "S:TTSS|S:SSTT|S:STTS|S:TSST"
7167  );
7168 
7169  exprtk::symbol_table<T> symbol_table;
7170 
7171  symbol_table.add_constants();
7172  symbol_table.add_variable ("x",x);
7173  symbol_table.add_variable ("y",y);
7174  symbol_table.add_variable ("z",z);
7175  symbol_table.add_variable ("w",w);
7176 
7177  symbol_table.add_stringvar("a",a);
7178  symbol_table.add_stringvar("b",b);
7179  symbol_table.add_stringvar("c",c);
7180  symbol_table.add_stringvar("d",d);
7181  symbol_table.add_stringvar("result",result);
7182 
7183  symbol_table.add_function("foo",ovrld_func);
7184 
7185  typedef typename overload_func<T>::test_result_t test_result_t;
7186  typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
7187 
7188  static const test_pack_t test_pack_list[] =
7189  {
7190  test_pack_t("result := foo(x)" , test_result_t( 0, "T" )),
7191  test_pack_t("result := foo(x, y)" , test_result_t( 1, "TT" )),
7192  test_pack_t("result := foo(x, y, z)" , test_result_t( 2, "TTT" )),
7193  test_pack_t("result := foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
7194  test_pack_t("result := foo(x + y)" , test_result_t( 0, "T" )),
7195  test_pack_t("result := foo(x + y, y + z)" , test_result_t( 1, "TT" )),
7196  test_pack_t("result := foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
7197  test_pack_t("result := foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
7198  test_pack_t("result := foo(a)" , test_result_t( 4, "S" )),
7199  test_pack_t("result := foo(a, b)" , test_result_t( 5, "SS" )),
7200  test_pack_t("result := foo(a, b, c)" , test_result_t( 6, "SSS" )),
7201  test_pack_t("result := foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
7202  test_pack_t("result := foo(a + b)" , test_result_t( 4, "S" )),
7203  test_pack_t("result := foo(a + b, b + c)" , test_result_t( 5, "SS" )),
7204  test_pack_t("result := foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
7205  test_pack_t("result := foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
7206  test_pack_t("result := foo(a, x)" , test_result_t( 8, "ST" )),
7207  test_pack_t("result := foo(a, x, b)" , test_result_t( 9, "STS" )),
7208  test_pack_t("result := foo(a, x, b, y)" , test_result_t(10, "STST")),
7209  test_pack_t("result := foo(a + b, x + y)" , test_result_t( 8, "ST" )),
7210  test_pack_t("result := foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
7211  test_pack_t("result := foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
7212  test_pack_t("result := foo(x, a)" , test_result_t(11, "TS" )),
7213  test_pack_t("result := foo(x, a, y)" , test_result_t(12, "TST" )),
7214  test_pack_t("result := foo(x, a, y, b)" , test_result_t(13, "TSTS")),
7215  test_pack_t("result := foo(x + y, a + b)" , test_result_t(11, "TS" )),
7216  test_pack_t("result := foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
7217  test_pack_t("result := foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
7218  test_pack_t("result := foo(x, y, a, b)" , test_result_t(14, "TTSS")),
7219  test_pack_t("result := foo(a, b, x, y)" , test_result_t(15, "SSTT")),
7220  test_pack_t("result := foo(a, x, y, b)" , test_result_t(16, "STTS")),
7221  test_pack_t("result := foo(x, a, b, y)" , test_result_t(17, "TSST")),
7222  test_pack_t("result := foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
7223  test_pack_t("result := foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
7224  test_pack_t("result := foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
7225  test_pack_t("result := foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
7226  };
7227 
7228  static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
7229 
7230  std::deque<expression_t> expression_list;
7231 
7232  for (std::size_t i = 0; i < test_pack_list_size; ++i)
7233  {
7234  expression_t expression;
7235  expression.register_symbol_table(symbol_table);
7236 
7238 
7239  if (!parser.compile(test_pack_list[i].first, expression))
7240  {
7241  printf("run_test18() - (13) Overload VarArg Error: %s Expression: %s\n",
7242  parser.error().c_str(),
7243  test_pack_list[i].first.c_str());
7244 
7245  return false;
7246  }
7247  else
7248  expression_list.push_back(expression);
7249  }
7250 
7251  bool failure = false;
7252 
7253  for (std::size_t i = 0; i < expression_list.size(); ++i)
7254  {
7255  ovrld_func.clear();
7256  result = "";
7257  expression_list[i].value();
7258 
7259  if (result != "string result")
7260  {
7261  printf("run_test18() - Error in evaluation! (13) Expression: %s\n",
7262  test_pack_list[i].first.c_str());
7263 
7264  failure = true;
7265  }
7266 
7267  if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
7268  {
7269  printf("run_test18() - Error with ps_index (13) Expression: %s Expected: %d Got: %d\n",
7270  test_pack_list[i].first.c_str(),
7271  static_cast<int>(test_pack_list[i].second.ps_index),
7272  static_cast<int>(ovrld_func.current_ps_index));
7273 
7274  failure = true;
7275  }
7276 
7277  if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
7278  {
7279  printf("run_test18() - Error with parameter seq (13) Expression: %s Expected: %s Got: %s\n",
7280  test_pack_list[i].first.c_str(),
7281  test_pack_list[i].second.param_seq.c_str(),
7282  ovrld_func.current_param_seq.c_str());
7283 
7284  failure = true;
7285  }
7286  }
7287 
7288  if (failure)
7289  return false;
7290  }
7291 
7292  return true;
7293 }
7294 
7295 template <typename T>
7296 inline bool run_test19()
7297 {
7300  typedef exprtk::parser<T> parser_t;
7301  typedef exprtk::function_compositor<T> compositor_t;
7302  typedef typename compositor_t::function function_t;
7303 
7304  {
7305  T x = T(123.123);
7306 
7307  compositor_t compositor;
7308 
7309  // f(x) = x + 2
7310  compositor.add(function_t("f","x + 2","x"));
7311 
7312  // g(x) = x^2-3
7313  compositor.add(function_t("g","x^2 - 3","x"));
7314 
7315  // fof(x) = f(f(x))
7316  compositor.add(function_t("fof","f(f(x))","x"));
7317 
7318  // gog(x) = g(g(x))
7319  compositor.add(function_t("gog","g(g(x))","x"));
7320 
7321  // fog(x) = f(g(x))
7322  compositor.add(function_t("fog","f(g(x))","x"));
7323 
7324  // gof(x) = g(f(x))
7325  compositor.add(function_t("gof","g(f(x))","x"));
7326 
7327  // fogof(x) = f(g(f(x)))
7328  compositor.add(function_t("fogof","f(g(f(x)))","x"));
7329 
7330  // gofog(x) = g(f(g(x)))
7331  compositor.add(function_t("gofog","g(f(g(x)))","x"));
7332 
7333  symbol_table_t& symbol_table = compositor.symbol_table();
7334  symbol_table.add_constants();
7335  symbol_table.add_variable("x",x);
7336 
7337  static const std::string expr_str_list[] =
7338  {
7339  "equal(f(x),(x + 2))",
7340  "equal(g(x),(x^2 - 3))",
7341  "equal(fof(x),(x + 4))",
7342  "equal(gog(x),(x^4 - 6x^2 + 6))",
7343  "equal(fog(x),(x^2 - 1))",
7344  "equal(gof(x),(x^2 + 4x + 1))",
7345  "equal(fogof(x),(x^2 + 4x + 3))",
7346  "equal(gofog(x),(x^4 - 2x^2 - 2))"
7347  };
7348  static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
7349 
7350  std::deque<expression_t> expression_list;
7351 
7352  for (std::size_t i = 0; i < expr_str_list_size; ++i)
7353  {
7354  expression_t expression;
7355  expression.register_symbol_table(symbol_table);
7356 
7357  parser_t parser;
7358 
7359  if (!parser.compile(expr_str_list[i],expression))
7360  {
7361  printf("run_test19() - Error: %s Expression: %s\n",
7362  parser.error().c_str(),
7363  expr_str_list[i].c_str());
7364 
7365  return false;
7366  }
7367  else
7368  expression_list.push_back(expression);
7369  }
7370 
7371  bool failure = false;
7372 
7373  for (std::size_t i = 0; i < expression_list.size(); ++i)
7374  {
7375  if (T(1) != expression_list[i].value())
7376  {
7377  printf("run_test19() - Error in evaluation! (1) Expression: %s\n",
7378  expr_str_list[i].c_str());
7379 
7380  failure = true;
7381  }
7382  }
7383 
7384  if (failure)
7385  return false;
7386  }
7387 
7388  const std::size_t rounds = 100;
7389 
7390  for (std::size_t r = 0; r < rounds; ++r)
7391  {
7392  T x = T(1);
7393  T y = T(2);
7394  T z = T(3);
7395  T w = T(4);
7396  T u = T(5);
7397  T v = T(6);
7398 
7399  compositor_t compositor;
7400 
7401  // f0() = 6
7402  compositor
7403  .add(
7404  function_t("f0")
7405  .expression("3 * 2"));
7406 
7407  // f1(x) = 5 * (f0 + x)
7408  compositor
7409  .add(
7410  function_t("f1")
7411  .var("x")
7412  .expression("5 * (f0 + x)"));
7413 
7414  // f2(x,y) = 7 * (f1(x) + f1(y))
7415  compositor
7416  .add(
7417  function_t("f2")
7418  .var("x").var("y")
7419  .expression("7 * (f1(x) + f1(y))"));
7420 
7421  // f3(x,y,z) = 9 * (f2(x,y) + f2(y,z) + f2(x,z))
7422  compositor
7423  .add(
7424  function_t("f3")
7425  .var("x").var("y").var("z")
7426  .expression("9 * (f2(x,y) + f2(y,z) + f2(x,z))"));
7427 
7428  // f4(x,y,z,w) = 11 * (f3(x,y,z) + f3(y,z,w) + f3(z,w,z))
7429  compositor
7430  .add(
7431  function_t("f4")
7432  .var("x").var("y").var("z").var("w")
7433  .expression("11 * (f3(x,y,z) + f3(y,z,w) + f3(z,w,x))"));
7434 
7435  // f5(x,y,z,w,u) = 13 * (f4(x,y,z,w) + f4(y,z,w,u) + f4(z,w,u,x) + f4(w,u,x,y))
7436  compositor
7437  .add(
7438  function_t("f5")
7439  .var("x").var("y").var("z").var("w").var("u")
7440  .expression("13 * (f4(x,y,z,w) + f4(y,z,w,u) + f4(z,w,u,x) + f4(w,u,x,y))"));
7441 
7442  // f6(x,y,z,w,u,v) = 17 * (f5(x,y,z,w,u) + f5(y,z,w,u,v) + f5(z,w,u,v,x) + f5(w,u,v,x,y))
7443  compositor
7444  .add(
7445  function_t("f6")
7446  .var("x").var("y").var("z")
7447  .var("w").var("u").var("v")
7448  .expression("17 * (f5(x,y,z,w,u) + f5(y,z,w,u,v) + f5(z,w,u,v,x) + f5(w,u,v,x,y))"));
7449 
7450  symbol_table_t& symbol_table = compositor.symbol_table();
7451  symbol_table.add_constants();
7452  symbol_table.add_variable("x",x);
7453  symbol_table.add_variable("y",y);
7454  symbol_table.add_variable("z",z);
7455  symbol_table.add_variable("w",w);
7456  symbol_table.add_variable("u",u);
7457  symbol_table.add_variable("v",v);
7458 
7459  parser_t parser;
7460 
7461  const std::string expr_str_list[] =
7462  {
7463  "f0()",
7464  "f1(x)",
7465  "f2(x,x)",
7466  "f3(x,x,x)",
7467  "f4(x,x,x,x)",
7468  "f5(x,x,x,x,x)",
7469  "f6(x,x,x,x,x,x)",
7470  "f2(x,y)",
7471  "f3(x,y,z)",
7472  "f4(x,y,z,w)",
7473  "f5(x,y,z,w,u)",
7474  "f6(x,y,z,w,u,v)"
7475  };
7476  const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
7477 
7478  const T result_list[] =
7479  {
7480  T(6 ),
7481  T(35 ),
7482  T(490 ),
7483  T(13230 ),
7484  T(436590 ),
7485  T(22702680 ),
7486  T(1543782240),
7487  T(525 ),
7488  T(15120 ),
7489  T(533610 ),
7490  T(29459430 ),
7491  T(2122700580)
7492  };
7493 
7494  bool failure = false;
7495 
7496  for (std::size_t i = 0; i < expr_str_list_size; ++i)
7497  {
7498  expression_t expression;
7499  expression.register_symbol_table(symbol_table);
7500 
7501  if (!parser.compile(expr_str_list[i],expression))
7502  {
7503  printf("run_test19() - Error: %s Expression: %s\n",
7504  parser.error().c_str(),
7505  expr_str_list[i].c_str());
7506 
7507  failure = true;
7508  continue;
7509  }
7510 
7511  T result = expression.value();
7512 
7513  if (result_list[i] != result)
7514  {
7515  printf("run_test19() - Error in evaluation! (2) Expression: %s Expected: %10.1f\tResult: %10.1f\n",
7516  expr_str_list[i].c_str(),
7517  result_list[i],
7518  result);
7519 
7520  failure = true;
7521  continue;
7522  }
7523  }
7524 
7525  if (failure)
7526  return false;
7527  }
7528 
7529  {
7530  T x = T(0);
7531 
7532  compositor_t compositor;
7533 
7534  compositor
7535  .add(
7536  function_t(
7537  "is_prime_impl1",
7538  "if (y == 1,true, "
7539  " if (0 == (x % y),false, "
7540  " is_prime_impl1(x,y - 1))) ",
7541  "x","y"));
7542 
7543  compositor
7544  .add(
7545  function_t(
7546  "is_prime1",
7547  "if (frac(x) != 0, false, "
7548  " if (x <= 0, false, "
7549  " is_prime_impl1(x,min(x - 1,trunc(sqrt(x)) + 1)))) ",
7550  "x"));
7551 
7552  compositor
7553  .add(
7554  function_t(
7555  "is_prime_impl2",
7556  "switch "
7557  "{ "
7558  " case y == 1 : true; "
7559  " case (x % y) == 0 : false; "
7560  " default : is_prime_impl2(x,y - 1);"
7561  "} ",
7562  "x","y"));
7563 
7564  compositor
7565  .add(
7566  function_t(
7567  "is_prime2",
7568  "switch "
7569  "{ "
7570  " case x <= 0 : false; "
7571  " case frac(x) != 0 : false; "
7572  " default : is_prime_impl2(x,min(x - 1,trunc(sqrt(x)) + 1));"
7573  "} ",
7574  "x"));
7575 
7576  compositor
7577  .add(
7578  function_t(
7579  "is_prime_impl3",
7580  "while (y > 0) "
7581  "{ "
7582  " switch "
7583  " { "
7584  " case y == 1 : ~(y := 0, true);"
7585  " case (x % y) == 0 : ~(y := 0,false);"
7586  " default : y := y - 1; "
7587  " } "
7588  "} ",
7589  "x","y"));
7590 
7591  compositor
7592  .add(
7593  function_t(
7594  "is_prime3",
7595  "switch "
7596  "{ "
7597  " case x <= 0 : false; "
7598  " case frac(x) != 0 : false; "
7599  " default : is_prime_impl3(x,min(x - 1,trunc(sqrt(x)) + 1));"
7600  "} ",
7601  "x"));
7602 
7603  compositor
7604  .add(
7605  function_t(
7606  "is_prime_impl4",
7607  "switch "
7608  "{ "
7609  " case 1 == x : false; "
7610  " case 2 == x : true; "
7611  " case 3 == x : true; "
7612  " case 5 == x : true; "
7613  " case 7 == x : true; "
7614  " case 0 == x % 2 : false; "
7615  " default : "
7616  " { "
7617  " for (var i := 3; i < y; i += 2) "
7618  " { "
7619  " if ((x % i) == 0) "
7620  " break[false]; "
7621  " else "
7622  " true; "
7623  " } "
7624  " }; "
7625  "} ",
7626  "x","y"));
7627 
7628  compositor
7629  .add(
7630  function_t(
7631  "is_prime4",
7632  "switch "
7633  "{ "
7634  " case x <= 0 : false; "
7635  " case frac(x) != 0 : false; "
7636  " default : is_prime_impl4(x,min(x - 1,trunc(sqrt(x)) + 1));"
7637  "} ",
7638  "x"));
7639 
7640  symbol_table_t& symbol_table = compositor.symbol_table();
7641  symbol_table.add_constants();
7642  symbol_table.add_variable("x",x);
7643 
7644  const std::string expression_str[] = {
7645  "is_prime1(x)",
7646  "is_prime2(x)",
7647  "is_prime3(x)",
7648  "is_prime4(x)"
7649  };
7650 
7651  const std::size_t expression_count = sizeof(expression_str) / sizeof(std::string);
7652 
7653  std::vector<expression_t> expression_list;
7654 
7655  for (std::size_t i = 0; i < expression_count; ++i)
7656  {
7657  parser_t parser;
7658 
7659  expression_t expression;
7660  expression.register_symbol_table(symbol_table);
7661 
7662  if (!parser.compile(expression_str[i],expression))
7663  {
7664  printf("run_test19() - Error: %s Expression%d: %s\n",
7665  parser.error().c_str(),
7666  static_cast<unsigned int>(i),
7667  expression_str[i].c_str());
7668 
7669  return false;
7670  }
7671  else
7672  expression_list.push_back(expression);
7673  }
7674 
7675  bool failure = false;
7676 
7677  const std::size_t prime_list[] =
7678  {
7679  2, 3, 5, 7, 11, 13, 17, 19,
7680  877, 947, 1087, 1153, 1229, 1297, 1381, 1453,
7681  1523, 1597, 1663, 1741, 1823, 1901, 1993, 2063,
7682  2131, 2221, 2293, 2371, 2437, 2539, 2621, 2689,
7683  2749, 2833, 2909, 3001, 3083, 3187, 3259, 3343,
7684  3433, 3517, 3581, 3659, 3733, 3823, 3911, 4001,
7685  4073, 4153, 4241, 4327, 4421, 4507, 4591, 4663,
7686  4759, 4861, 4943, 5009, 5099, 5189, 5281, 5393,
7687  5449, 5527, 5641, 5701, 5801, 5861, 5953, 6067,
7688  6143, 6229, 6311, 6373, 6481, 6577, 6679, 6763,
7689  6841, 6947, 7001, 7109, 7211, 7307, 7417, 7507,
7690  104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383,
7691  104393, 104399, 104417, 104459, 104471, 104473, 104479, 104491,
7692  104513, 104527, 104537, 104543, 104549, 104551, 104561, 104579,
7693  104593, 104597, 104623, 104639, 104651, 104659, 104677, 104681,
7694  104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729,
7695  1000621, 1000639, 1000651, 1000667, 1000669, 1001023, 1001027, 1001041
7696  };
7697 
7698  const std::size_t prime_list_size = sizeof(prime_list) / sizeof(std::size_t);
7699 
7700  for (std::size_t i = 0; (i < prime_list_size) && (!failure); ++i)
7701  {
7702  x = static_cast<T>(prime_list[i]);
7703 
7704  std::vector<T> result(expression_count,T(0));
7705 
7706  for (std::size_t j = 0; j < expression_list.size(); ++j)
7707  {
7708  result[j] = expression_list[j].value();
7709  }
7710 
7711  for (std::size_t j = 1; j < expression_list.size(); ++j)
7712  {
7713  if (result[j] != result[0])
7714  {
7715  failure = true;
7716  break;
7717  }
7718  }
7719 
7720  if (failure)
7721  {
7722  printf("run_test19() - Error in evaluation! (3) Results don't match! Prime: %d\n",
7723  static_cast<unsigned int>(prime_list[i]));
7724 
7725  for (std::size_t j = 0; j < expression_list.size(); ++j)
7726  {
7727  printf("Expression[%02d]: %s = %d\n",
7728  static_cast<unsigned int>(j),
7729  expression_str[j].c_str(),
7730  static_cast<unsigned int>(result[j]));
7731  }
7732  }
7733  else if (T(1) != expression_list[0].value())
7734  {
7735  printf("run_test19() - Error in evaluation! (4) Results don't match! Prime: %d\n",
7736  static_cast<unsigned int>(prime_list[i]));
7737 
7738  for (std::size_t j = 0; j < expression_list.size(); ++j)
7739  {
7740  printf("Expression[%02d]: %s = %d\n",
7741  static_cast<unsigned int>(j),
7742  expression_str[j].c_str(),
7743  static_cast<unsigned int>(result[j]));
7744  }
7745  }
7746  }
7747 
7748  if (failure)
7749  return false;
7750  }
7751 
7752  {
7753  T x = T(0);
7754 
7755  compositor_t compositor;
7756 
7757  compositor
7758  .add(
7759  function_t(
7760  "fibonacci1",
7761  "if (x == 0,0, "
7762  " if (x == 1,1, "
7763  " fibonacci1(x - 1) + fibonacci1(x - 2)))",
7764  "x"));
7765 
7766  compositor
7767  .add(
7768  function_t(
7769  "fibonacci2",
7770  "switch "
7771  "{ "
7772  " case x == 0 : 0; "
7773  " case x == 1 : 1; "
7774  " default : fibonacci2(x - 1) + fibonacci2(x - 2);"
7775  "} ",
7776  "x"));
7777 
7778  compositor
7779  .add(
7780  function_t(
7781  "fibonacci_impl3",
7782  "switch "
7783  "{ "
7784  " case x == 0 : 0; "
7785  " case x == 1 : 1; "
7786  " default : "
7787  " while ((x := (x - 1)) > 0) "
7788  " { "
7789  " w := z; "
7790  " z := z + y; "
7791  " y := w; "
7792  " z "
7793  " }; "
7794  "} ",
7795  "x","y","z","w"));
7796 
7797  compositor
7798  .add(
7799  function_t(
7800  "fibonacci3",
7801  "fibonacci_impl3(x,0,1,0)",
7802  "x"));
7803 
7804  compositor
7805  .add(
7806  function_t(
7807  "fibonacci_impl4",
7808  "switch "
7809  "{ "
7810  " case x == 0 : 0; "
7811  " case x == 1 : 1; "
7812  " default : "
7813  " repeat "
7814  " w := z; "
7815  " z := z + y; "
7816  " y := w; "
7817  " x := x - 1; "
7818  " z "
7819  " until (x <= 1); "
7820  "} ",
7821  "x","y","z","w"));
7822 
7823  compositor
7824  .add(
7825  function_t(
7826  "fibonacci4",
7827  "fibonacci_impl4(x,0,1,0)",
7828  "x"));
7829 
7830  compositor
7831  .add(
7832  function_t(
7833  "fibonacci5",
7834  "if ((x == 0) or (x == 1)) "
7835  " x; "
7836  "else "
7837  " fibonacci5(x - 1) + fibonacci5(x - 2); ",
7838  "x"));
7839 
7840  symbol_table_t& symbol_table = compositor.symbol_table();
7841 
7842  symbol_table.add_constants();
7843  symbol_table.add_variable("x",x);
7844 
7845  const std::string expression_str[] = {
7846  "fibonacci1(x)",
7847  "fibonacci2(x)",
7848  "fibonacci3(x)",
7849  "fibonacci4(x)",
7850  "fibonacci5(x)"
7851  };
7852 
7853  const std::size_t expression_count = sizeof(expression_str) / sizeof(std::string);
7854 
7855  std::vector<expression_t> expression_list;
7856 
7857  for (std::size_t i = 0; i < expression_count; ++i)
7858  {
7859  parser_t parser;
7860 
7861  expression_t expression;
7862  expression.register_symbol_table(symbol_table);
7863 
7864  if (!parser.compile(expression_str[i],expression))
7865  {
7866  printf("run_test19() - Error: %s Expression[%02d]: %s\n",
7867  parser.error().c_str(),
7868  static_cast<unsigned int>(i),
7869  expression_str[i].c_str());
7870 
7871  return false;
7872  }
7873  else
7874  expression_list.push_back(expression);
7875  }
7876 
7877  bool failure = false;
7878 
7879  const std::size_t fibonacci_list[] =
7880  {
7881  0, 1, 1, 2,
7882  3, 5, 8, 13,
7883  21, 34, 55, 89,
7884  144, 233, 377, 610,
7885  987, 1597, 2584, 4181,
7886  6765, 10946, 17711, 28657,
7887  46368, 75025, 121393, 196418,
7888  317811, 514229, 832040, 1346269
7889  };
7890 
7891  const std::size_t fibonacci_list_size = sizeof(fibonacci_list) / sizeof(std::size_t);
7892 
7893  for (std::size_t i = 0; (i < fibonacci_list_size) && (!failure); ++i)
7894  {
7895  x = static_cast<T>(i);
7896 
7897  std::vector<T> result(expression_count,T(0));
7898 
7899  for (std::size_t j = 0; j < expression_list.size(); ++j)
7900  {
7901  result[j] = expression_list[j].value();
7902  }
7903 
7904  for (std::size_t j = 1; j < expression_list.size(); ++j)
7905  {
7906  if (result[j] != result[0])
7907  {
7908  failure = true;
7909  break;
7910  }
7911  }
7912 
7913  if (failure)
7914  {
7915  printf("run_test19() - Error in evaluation! (5) Results don't match! fibonacci(%d) = %d\n",
7916  static_cast<unsigned int>(i),
7917  static_cast<unsigned int>(fibonacci_list[i]));
7918 
7919  for (std::size_t j = 0; j < expression_list.size(); ++j)
7920  {
7921  printf("Expression[%02d]: %s = %d\n",
7922  static_cast<unsigned int>(j),
7923  expression_str[j].c_str(),
7924  static_cast<unsigned int>(result[j]));
7925  }
7926  }
7927  else if (fibonacci_list[i] != expression_list[0].value())
7928  {
7929  printf("run_test19() - Error in evaluation! (6) Results don't match! fibonacci(%d) = %d\n",
7930  static_cast<unsigned int>(i),
7931  static_cast<unsigned int>(fibonacci_list[i]));
7932 
7933  for (std::size_t j = 0; j < expression_list.size(); ++j)
7934  {
7935  printf("Expression[%02d]: %s = %d\n",
7936  static_cast<unsigned int>(j),
7937  expression_str[j].c_str(),
7938  static_cast<unsigned int>(result[j]));
7939  }
7940  }
7941  }
7942 
7943  if (failure)
7944  return false;
7945  }
7946 
7947  {
7948  T x = T(0);
7949 
7950  symbol_table_t symbol_table;
7951 
7952  symbol_table.add_constants();
7953  symbol_table.add_variable("x",x);
7954 
7955  compositor_t compositor(symbol_table);
7956 
7957  compositor
7958  .add(
7959  function_t(
7960  "newton_sqrt_impl",
7961  "switch "
7962  "{ "
7963  " case x < 0 : -inf; "
7964  " case x == 0 : 0; "
7965  " case x == 1 : 1; "
7966  " default: "
7967  " ~{ "
7968  " z := 100; "
7969  " y := x / 2; "
7970  " repeat "
7971  " y := (1 / 2) * (y + (x / y)); "
7972  " if (equal(y * y,x)) "
7973  " break[y]; "
7974  " until ((z -= 1) <= 0); "
7975  " }; "
7976  "} ",
7977  "x","y","z"));
7978 
7979  compositor
7980  .add(
7981  function_t(
7982  "newton_sqrt",
7983  "newton_sqrt_impl(x,0,0)","x"));
7984 
7985  std::string expression_str = "newton_sqrt(x)";
7986 
7987  expression_t expression;
7988 
7989  expression.register_symbol_table(symbol_table);
7990 
7991  parser_t parser;
7992 
7993  if (!parser.compile(expression_str,expression))
7994  {
7995  printf("run_test19() - Error: %s Expression: %s\n",
7996  parser.error().c_str(),
7997  expression_str.c_str());
7998 
7999  return false;
8000  }
8001 
8002  bool failure = false;
8003 
8004  for (std::size_t i = 0; i < 100; ++i)
8005  {
8006  x = static_cast<T>(i);
8007 
8008  T result = expression.value();
8009 
8010  if (not_equal(result,std::sqrt(x),T(0.0000001)))
8011  {
8012  printf("run_test19() - Computation Error "
8013  "Expression: [%s]\tExpected: %12.8f\tResult: %12.8f\n",
8014  expression_str.c_str(),
8015  (double)std::sqrt(x),
8016  (double)result);
8017 
8018  failure = true;
8019  }
8020  }
8021 
8022  if (failure)
8023  return false;
8024  }
8025 
8026  {
8027  symbol_table_t symbol_table;
8028 
8029  symbol_table.add_constants();
8030 
8031  compositor_t compositor(symbol_table);
8032 
8033  compositor
8034  .add(
8035  function_t(
8036  "mandelbrot",
8037  " var width := 118; "
8038  " var height := 41; "
8039  " var imag_max := +1; "
8040  " var imag_min := -1; "
8041  " var real_max := +1; "
8042  " var real_min := -2.5; "
8043  " var x_step := (real_max - real_min) / width; "
8044  " var y_step := (imag_max - imag_min) / height; "
8045  " for (var y := 0; y < height; y += 1) "
8046  " { "
8047  " var imag := imag_min + (y_step * y); "
8048  " for (var x := 0; x < width; x += 1) "
8049  " { "
8050  " var real := real_min + x_step * x; "
8051  " var z_real := real; "
8052  " var z_imag := imag; "
8053  " var plot_value; "
8054  " for (var n := 0; n < 30; n += 1) "
8055  " { "
8056  " var a := z_real^2; "
8057  " var b := z_imag^2; "
8058  " plot_value := n; "
8059  " if ((a + b) < 4) "
8060  " { "
8061  " z_imag := 2 * z_real * z_imag + imag; "
8062  " z_real := a - b + real; "
8063  " } "
8064  " else "
8065  " break; "
8066  " }; "
8067  " }; "
8068  " } "));
8069 
8070  std::string expression_str = "mandelbrot()";
8071 
8072  expression_t expression;
8073 
8074  expression.register_symbol_table(symbol_table);
8075 
8076  parser_t parser;
8077 
8078  if (!parser.compile(expression_str,expression))
8079  {
8080  printf("run_test19() - Error: %s Expression: %s\n",
8081  parser.error().c_str(),
8082  expression_str.c_str());
8083 
8084  return false;
8085  }
8086 
8087  for (std::size_t i = 0; i < 100; ++i)
8088  {
8089  expression.value();
8090  }
8091  }
8092 
8093  {
8094  T x = T(0);
8095 
8096  symbol_table_t symbol_table;
8097 
8098  symbol_table.add_variable("x",x);
8099 
8100  compositor_t compositor(symbol_table);
8101 
8102  compositor
8103  .add(
8104  function_t(
8105  "fooboo",
8106  " var x := input; "
8107  " if (x > 0) "
8108  " fooboo(x - 1) + x; "
8109  " else "
8110  " 0; ",
8111  "input"));
8112 
8113  std::string expression_str = "fOoBoO(x)";
8114 
8115  expression_t expression;
8116 
8117  expression.register_symbol_table(symbol_table);
8118 
8119  parser_t parser;
8120 
8121  if (!parser.compile(expression_str,expression))
8122  {
8123  printf("run_test19() - Error: %s Expression: %s\n",
8124  parser.error().c_str(),
8125  expression_str.c_str());
8126 
8127  return false;
8128  }
8129 
8130  T sum = T(0);
8131 
8132  for (std::size_t i = 0; i < 100; ++i)
8133  {
8134  x = T(i);
8135 
8136  sum += x;
8137 
8138  T result = expression.value();
8139 
8140  if (result != sum)
8141  {
8142  printf("run_test19() - FooBoo(%5.2f) Expected: %5.2f\tResult: %5.2f\n",
8143  x,
8144  sum,
8145  result);
8146 
8147  return false;
8148  }
8149  }
8150 
8151  }
8152 
8153  {
8154  symbol_table_t symbol_table;
8155 
8156  symbol_table.add_constants();
8157 
8158  std::string expression_str =
8159  " var sieve[10^7] := [false]; "
8160  " var m := trunc(sqrt(sieve[])); "
8161  " "
8162  " sieve[0] := true; "
8163  " sieve[1] := true; "
8164  " "
8165  " for (var i := 0; i <= m; i += 1) "
8166  " { "
8167  " if (false == sieve[i]) "
8168  " { "
8169  " for (var j := (i * i); j < sieve[]; j += i) "
8170  " { "
8171  " sieve[j] := true; "
8172  " } "
8173  " } "
8174  " }; "
8175  " "
8176  " var prime_count := 0; "
8177  " for (var i := 0; i < sieve[]; i += 1) "
8178  " { "
8179  " if (false == sieve[i]) "
8180  " { "
8181  " prime_count += 1; "
8182  " }; "
8183  " }; "
8184  " "
8185  " prime_count == 664579; ";
8186 
8187  expression_t expression;
8188 
8189  expression.register_symbol_table(symbol_table);
8190 
8191  parser_t parser;
8192 
8193  if (!parser.compile(expression_str,expression))
8194  {
8195  printf("run_test19() - Error: %s Expression: %s\n",
8196  parser.error().c_str(),
8197  expression_str.c_str());
8198 
8199  return false;
8200  }
8201 
8202  if (T(1) != expression.value())
8203  {
8204  printf("run_test19() - Prime Sieve Computation Error");
8205 
8206  return false;
8207  }
8208  }
8209 
8210  {
8211  symbol_table_t symbol_table;
8212 
8213  symbol_table.add_constants();
8214 
8215  std::string expression_str[] =
8216  {
8217  "var delta := 10^-7; var total := 0; for (var i := 0; i <= 3; i += delta) { total += "
8218  "erf(i) }; abs((delta * total) - (3 * erf(3) + (1 / exp(9) - 1) / sqrt(pi))) < 0.000001",
8219 
8220  "var delta := 10^-7; var total := 0; for (var i := 0; i <= 3; i += delta) { total += "
8221  "erfc(i) }; abs((delta * total) - (3 * erfc(3) + ((1 - 1 / exp(9)) / sqrt(pi)))) < 0.000001"
8222  };
8223 
8224  expression_t e[2];
8225 
8226  parser_t parser;
8227 
8228  for (std::size_t i = 0; i < 2; ++i)
8229  {
8230  e[i].register_symbol_table(symbol_table);
8231 
8232  if (!parser.compile(expression_str[i],e[i]))
8233  {
8234  printf("run_test19() - Error: %s Expression: %s\n",
8235  parser.error().c_str(),
8236  expression_str[i].c_str());
8237 
8238  return false;
8239  }
8240 
8241  if (T(1) != e[i].value())
8242  {
8243  printf("run_test19() - erf/erfc computation error %d",
8244  static_cast<unsigned int>(i));
8245 
8246  return false;
8247  }
8248  }
8249  }
8250 
8251  return true;
8252 }
8253 
8254 template <typename T>
8256 {
8258 
8259  bool process(const std::string& unknown_symbol,
8260  typename usr_t::usr_symbol_type& st,
8261  T& default_value,
8262  std::string& error_message)
8263  {
8264  if (unknown_symbol[0] == 'v')
8265  {
8267  default_value = next_value();
8268  error_message.clear();
8269 
8270  return true;
8271  }
8272  else if (unknown_symbol[0] == 'c')
8273  {
8275  default_value = next_value();
8276  error_message.clear();
8277 
8278  return true;
8279  }
8280  else
8281  {
8282  error_message = "Unknown symbol...";
8283  return false;
8284  }
8285  }
8286 
8287  T next_value(const bool reset = false)
8288  {
8289  static T value = 0;
8290 
8291  if (reset)
8292  return (value = 0);
8293  else
8294  return ++value;
8295  }
8296 };
8297 
8298 template <typename T>
8300 {
8303 
8306  {}
8307 
8308  virtual bool process(const std::string& unknown_symbol,
8309  symbol_table_t& symbol_table,
8310  std::string& error_message)
8311  {
8312  bool result = false;
8313 
8314  if (unknown_symbol[0] == 'v')
8315  {
8316  static T var_default_value = 1.0;
8317 
8318  if ((result = symbol_table.create_variable(unknown_symbol, var_default_value++)) == false)
8319  {
8320  error_message = "Failed to create variable(" + unknown_symbol + ") in primary symbol table";
8321  }
8322  }
8323  else if (unknown_symbol[0] == 'c')
8324  {
8325  static T cvar_default_value = 1.0;
8326 
8327  if ((result = symbol_table.add_constant(unknown_symbol, cvar_default_value++)) == false)
8328  {
8329  error_message = "Failed to create const variable(" + unknown_symbol + ") in primary symbol table";
8330  }
8331  }
8332  else if (0 == unknown_symbol.find("foo"))
8333  {
8334  //functions of form: fooXX
8335  if (4 >= unknown_symbol.size())
8336  {
8337  switch(unknown_symbol[3])
8338  {
8339  case '1' : result = symbol_table.add_function(unknown_symbol,foo1);
8340  break;
8341 
8342  case '2' : result = symbol_table.add_function(unknown_symbol,foo2);
8343  break;
8344 
8345  case '3' : result = symbol_table.add_function(unknown_symbol,foo3);
8346  break;
8347 
8348  case '4' : result = symbol_table.add_function(unknown_symbol,foo4);
8349  break;
8350 
8351  case '5' : result = symbol_table.add_function(unknown_symbol,foo5);
8352  break;
8353 
8354  case '6' : result = symbol_table.add_function(unknown_symbol,foo6);
8355  break;
8356  }
8357  }
8358 
8359  if (!result)
8360  {
8361  error_message = "Failed to add function(" + unknown_symbol + ") in primary symbol table";
8362  }
8363  }
8364  else
8365  error_message = "Indeterminable symbol type.";
8366 
8367  return result;
8368  }
8369 };
8370 
8371 template <typename T>
8372 inline bool run_test20()
8373 {
8375 
8376  {
8377  for (std::size_t i = 0; i < 100; ++i)
8378  {
8379  exprtk::symbol_table<T> symbol_table0; // primary symbol_table
8380  exprtk::symbol_table<T> symbol_table1;
8381  exprtk::symbol_table<T> symbol_table2;
8382  exprtk::symbol_table<T> symbol_table3;
8383 
8384  symbol_table0.add_constants();
8385 
8386  expression_t expression;
8387  expression.register_symbol_table(symbol_table0);
8388  expression.register_symbol_table(symbol_table1);
8389  expression.register_symbol_table(symbol_table2);
8390  expression.register_symbol_table(symbol_table3);
8391 
8393 
8394  my_usr<T> musr;
8395  musr.next_value(true);
8396  parser.enable_unknown_symbol_resolver(&musr);
8397 
8398  std::string expr_str = "v01+c02+v03+c04+v05+c06+v07+c08+v09+c10+"
8399  "v11+c12+v13+c14+v15+c16+v17+c18+v19+c20+"
8400  "v21+c22+v23+c24+v25+c26+v27+c28+v29+c30 ";
8401 
8402  if (!parser.compile(expr_str,expression))
8403  {
8404  printf("run_test20() - [1] Error: %s Expression: %s\n",
8405  parser.error().c_str(),
8406  expr_str.c_str());
8407 
8408  return false;
8409  }
8410 
8411  T sum_1_30 = T((1 + 30) * 15);
8412  T result = expression.value();
8413 
8414  if (sum_1_30 != result)
8415  {
8416  printf("run_test20() - [1] Error in evaluation! (1) Expression: %s\n",
8417  expr_str.c_str());
8418 
8419  return false;
8420  }
8421  }
8422  }
8423 
8424  {
8425  for (std::size_t i = 0; i < 100; ++i)
8426  {
8427  exprtk::symbol_table<T> symbol_table0; // primary symbol_table
8428  exprtk::symbol_table<T> symbol_table1;
8429  exprtk::symbol_table<T> symbol_table2;
8430  exprtk::symbol_table<T> symbol_table3;
8431 
8432  symbol_table0.add_constants();
8433 
8434  expression_t expression;
8435  expression.register_symbol_table(symbol_table0);
8436  expression.register_symbol_table(symbol_table1);
8437  expression.register_symbol_table(symbol_table2);
8438  expression.register_symbol_table(symbol_table3);
8439 
8441 
8442  my_usr_ext<T> musr;
8443  parser.enable_unknown_symbol_resolver(&musr);
8444 
8445  std::string expr_str = "foo6(foo1(v0),foo2(c1,foo4(v2,c3,v4,c5)),foo3"
8446  "(v6,c7,foo5(v8,c9,v10,c11,v12)),c13,v14,c15) ";
8447 
8448  if (!parser.compile(expr_str,expression))
8449  {
8450  printf("run_test20() - [2] Error: %s Expression: %s\n",
8451  parser.error().c_str(),
8452  expr_str.c_str());
8453 
8454  return false;
8455  }
8456  }
8457  }
8458 
8459  {
8460  T var;
8461  std::string str;
8462  std::vector<T> vec(10,0.0);
8463 
8465 
8466  bool result = true;
8467 
8468  {
8469  symbol_table_t symbol_table;
8470 
8471  symbol_table.add_variable ("val",var);
8472  symbol_table.add_stringvar("str",str);
8473  symbol_table.add_vector ("vec",vec);
8474 
8475  if (symbol_table.get_variable("val") == 0 || !symbol_table.symbol_exists("val"))
8476  {
8477  printf("run_test20() - [3] Failed to get 'val' from symbol_table\n");
8478  result = false;
8479  }
8480 
8481  if (symbol_table.get_stringvar("str") == 0 || !symbol_table.symbol_exists("str"))
8482  {
8483  printf("run_test20() - [3] Failed to get 'str' from symbol_table\n");
8484  result = false;
8485  }
8486 
8487  if (symbol_table.get_vector("vec") == 0 || !symbol_table.symbol_exists("vec"))
8488  {
8489  printf("run_test20() - [3] Failed to get 'vec' from symbol_table\n");
8490  result = false;
8491  }
8492  }
8493 
8494  if (!result)
8495  return result;
8496 
8497  {
8498  symbol_table_t symbol_table;
8499 
8500  symbol_table.add_variable("val",var);
8501 
8502  if (symbol_table.get_variable("val") == 0 || !symbol_table.symbol_exists("val"))
8503  {
8504  printf("run_test20() - [4] Failed to get 'val' from symbol_table\n");
8505  result = false;
8506  }
8507 
8508  if (symbol_table.get_stringvar("str") != 0 || symbol_table.symbol_exists("str"))
8509  {
8510  printf("run_test20() - [4] Failed to get 'str' from symbol_table\n");
8511  result = false;
8512  }
8513 
8514  if (symbol_table.get_vector("vec") != 0 || symbol_table.symbol_exists("vec"))
8515  {
8516  printf("run_test20() - [4] Failed to get 'vec' from symbol_table\n");
8517  result = false;
8518  }
8519  }
8520 
8521  if (!result)
8522  return result;
8523 
8524  {
8525  symbol_table_t symbol_table;
8526 
8527  symbol_table.add_stringvar("str",str);
8528 
8529  if (symbol_table.get_stringvar("str") == 0 || !symbol_table.symbol_exists("str"))
8530  {
8531  printf("run_test20() - [5] Failed to get 'str' from symbol_table\n");
8532  result = false;
8533  }
8534 
8535  if (symbol_table.get_variable("val") != 0 || symbol_table.symbol_exists("val"))
8536  {
8537  printf("run_test20() - [5] Failed to get 'val' from symbol_table\n");
8538  result = false;
8539  }
8540 
8541  if (symbol_table.get_vector("vec") != 0 || symbol_table.symbol_exists("vec"))
8542  {
8543  printf("run_test20() - [5] Failed to get 'vec' from symbol_table\n");
8544  result = false;
8545  }
8546  }
8547 
8548  if (!result)
8549  return result;
8550 
8551  {
8552  symbol_table_t symbol_table;
8553 
8554  symbol_table.add_vector("vec",vec);
8555 
8556  if (symbol_table.get_vector("vec") == 0 || !symbol_table.symbol_exists("vec"))
8557  {
8558  printf("run_test20() - [6] Failed to get 'vec' from symbol_table\n");
8559  result = false;
8560  }
8561 
8562  if (symbol_table.get_variable("val") != 0 || symbol_table.symbol_exists("val"))
8563  {
8564  printf("run_test20() - [6] Failed to get 'val' from symbol_table\n");
8565  result = false;
8566  }
8567 
8568  if (symbol_table.get_stringvar("str") != 0 || symbol_table.symbol_exists("str"))
8569  {
8570  printf("run_test20() - [6] Failed to get 'str' from symbol_table\n");
8571  result = false;
8572  }
8573  }
8574 
8575  if (!result)
8576  return result;
8577  }
8578 
8579  return true;
8580 }
8581 
8582 template <typename T>
8584 {
8585  typedef exprtk::results_context<T> results_context_t;
8586  typedef typename results_context_t::type_store_t type_t;
8587 
8588  std::string res_str;
8589 
8590  for (std::size_t i = 0; i < results.count(); ++i)
8591  {
8592  type_t t = results[i];
8593 
8594  switch (t.type)
8595  {
8596  case type_t::e_scalar : res_str += 'T';
8597  break;
8598 
8599  case type_t::e_vector : res_str += 'V';
8600  break;
8601 
8602  case type_t::e_string : res_str += 'S';
8603  break;
8604 
8605  default : continue;
8606  }
8607  }
8608 
8609  return res_str;
8610 }
8611 
8612 template <typename T>
8613 inline bool result_equal(const exprtk::results_context<T>& results, const T& value)
8614 {
8615  typedef exprtk::results_context<T> results_context_t;
8616  typedef typename results_context_t::type_store_t type_t;
8617  typedef typename type_t::scalar_view scalar_t;
8618 
8619  if (1 != results.count())
8620  return false;
8621  else if (type_t::e_scalar != results[0].type)
8622  return false;
8623  else
8624  return (value == scalar_t(results[0])());
8625 }
8626 
8627 template <typename T>
8628 inline bool run_test21()
8629 {
8632  typedef exprtk::parser<T> parser_t;
8633 
8634  T x = T(1.1);
8635  T y = T(2.2);
8636  T z = T(3.3);
8637 
8638  symbol_table_t symbol_table;
8639  symbol_table.add_constants();
8640  symbol_table.add_variable("x",x);
8641  symbol_table.add_variable("y",y);
8642  symbol_table.add_variable("z",z);
8643 
8644  {
8645  static const std::string expression_list[] =
8646  {
8647  "return[]; x;",
8648  "return[x]; x;",
8649  "return[x,y]; x;",
8650  "return[x + y,y - x]; x;",
8651  "return[x + y,y - x,'abc']; x;",
8652  "if (x < y) return [1,'abc1']; else return [2,'abc2',x];" ,
8653  "if (x > y) return [1,'abc1']; else return [2,'abc2',x];" ,
8654  "if (x < y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
8655  "if (x > y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
8656  "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1]; } ",
8657  "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc']; } ",
8658  "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x]; }",
8659  "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y]; }",
8660  "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y,z]; }",
8661  "for(var i := 0; i < 10; i += 1) { if (i == 5) return [2,'abc2',x]; else x += 1; }",
8662  "for(var i := 0; i < 10; i += 1) { if (i == 5) { return [1,'abc1'];} else x += 1; }"
8663  };
8664 
8665  static const std::string result_list[] =
8666  {
8667  "" ,
8668  "T" ,
8669  "TT" ,
8670  "TT" ,
8671  "TTS" ,
8672  "TS" ,
8673  "TST" ,
8674  "TS" ,
8675  "TST" ,
8676  "T" ,
8677  "TS" ,
8678  "TST" ,
8679  "TSTT" ,
8680  "TSTTT",
8681  "TST" ,
8682  "TS"
8683  };
8684 
8685  static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
8686 
8687  bool failure = false;
8688 
8689  for (std::size_t i = 0; i < expression_list_size; ++i)
8690  {
8691  expression_t expression;
8692  expression.register_symbol_table(symbol_table);
8693 
8694  parser_t parser;
8695 
8696  if (!parser.compile(expression_list[i],expression))
8697  {
8698  printf("run_test21() - Error: %s Expression: %s [1]\n",
8699  parser.error().c_str(),
8700  expression_list[i].c_str());
8701 
8702  failure = true;
8703  continue;
8704  }
8705  else if (!parser.dec().return_present())
8706  {
8707  printf("run_test21() - Expected a return statement Expression: %s [1]\n",
8708  expression_list[i].c_str());
8709 
8710  failure = true;
8711  continue;
8712  }
8713 
8714  expression.value();
8715 
8716  std::string pattern = results_to_string<T>(expression.results());
8717 
8718  if (!expression.return_invoked())
8719  {
8720  printf("run_test21() - Invalid return invoke state [1] Expression: %s\n",
8721  expression_list[i].c_str());
8722 
8723  failure = true;
8724  continue;
8725  }
8726  else if (result_list[i] != pattern)
8727  {
8728  printf("run_test21() - Invalid return results [1] Expected %s Got: %s Expression: %s\n",
8729  result_list[i].c_str(),
8730  pattern.c_str(),
8731  expression_list[i].c_str());
8732 
8733  failure = true;
8734  continue;
8735  }
8736  }
8737 
8738  if (failure)
8739  return false;
8740  }
8741 
8742  {
8743  static const std::string expression_list[] =
8744  {
8745  "x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]; ",
8746  "x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7; ",
8747  "x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7; ",
8748  "x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7; ",
8749  "x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7; ",
8750  "x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7; ",
8751  "return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7; ",
8752  "~{x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]}",
8753  "~{x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7}",
8754  "~{x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7}",
8755  "~{x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7}",
8756  "~{x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7}",
8757  "~{x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7}",
8758  "~{return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7}"
8759  };
8760 
8761  static const std::string result_list[] =
8762  {
8763  "T", "T", "T", "T", "T", "T", "T",
8764  "T", "T", "T", "T", "T", "T", "T",
8765  };
8766 
8767  static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
8768 
8769  bool failure = false;
8770 
8771  for (std::size_t i = 0; i < expression_list_size; ++i)
8772  {
8773  expression_t expression;
8774  expression.register_symbol_table(symbol_table);
8775 
8776  parser_t parser;
8777 
8778  if (!parser.compile(expression_list[i],expression))
8779  {
8780  printf("run_test21() - Error: %s Expression: %s [2]\n",
8781  parser.error().c_str(),
8782  expression_list[i].c_str());
8783 
8784  failure = true;
8785  continue;
8786  }
8787  else if (!parser.dec().return_present())
8788  {
8789  printf("run_test21() - Expected a return statement Expression: %s [2]\n",
8790  expression_list[i].c_str());
8791 
8792  failure = true;
8793  continue;
8794  }
8795 
8796  expression.value();
8797 
8798  std::string pattern = results_to_string<T>(expression.results());
8799 
8800  if (!expression.return_invoked())
8801  {
8802  printf("run_test21() - Invalid return invoke state [2] Expression: %s\n",
8803  expression_list[i].c_str());
8804 
8805  failure = true;
8806  continue;
8807  }
8808  else if (result_list[i] != pattern)
8809  {
8810  printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
8811  result_list[i].c_str(),
8812  pattern.c_str(),
8813  expression_list[i].c_str());
8814 
8815  failure = true;
8816  continue;
8817  }
8818  else if (!result_equal(expression.results(), x + T(1)))
8819  {
8820  printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
8821  result_list[i].c_str(),
8822  pattern.c_str(),
8823  expression_list[i].c_str());
8824 
8825  failure = true;
8826  continue;
8827  }
8828  }
8829 
8830  if (failure)
8831  return false;
8832  }
8833 
8834  return true;
8835 }
8836 
8837 template <typename T>
8838 struct type_name { static inline std::string value() { return "unknown"; } };
8839 template <> struct type_name<float> { static inline std::string value() { return "float"; } };
8840 template <> struct type_name<double> { static inline std::string value() { return "double"; } };
8841 template <> struct type_name<long double> { static inline std::string value() { return "long double"; } };
8842 
8843 int main()
8844 {
8845  #define perform_test(Type,Number) \
8846  { \
8847  exprtk::timer timer; \
8848  timer.start(); \
8849  if (!run_test##Number<Type>()) \
8850  { \
8851  printf("run_test"#Number" (%s) *** FAILED! ***\n", \
8852  type_name<Type>::value().c_str()); \
8853  result = EXIT_FAILURE; \
8854  } \
8855  else \
8856  { \
8857  timer.stop(); \
8858  printf("run_test"#Number" (%s) - Result: SUCCESS Time: %8.4fsec\n", \
8859  type_name<Type>::value().c_str(), \
8860  timer.time()); \
8861  } \
8862  } \
8863 
8864  int result = 0;
8865 
8888 
8889  #undef perform_test
8890 
8891  return result;
8892 }