C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
exprtk_mpfr_test.cpp
Go to the documentation of this file.
1/*
2 **************************************************************
3 * C++ Mathematical Expression Toolkit Library *
4 * *
5 * Examples and Unit-Tests using MPFR type *
6 * Author: Arash Partow (1999-2024) *
7 * URL: https://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 * https://www.opensource.org/licenses/MIT *
14 * SPDX-License-Identifier: MIT *
15 * *
16 **************************************************************
17*/
18
19
20#include <cmath>
21#include <cstddef>
22#include <cstdio>
23#include <cstdlib>
24#include <deque>
25#include <fstream>
26#include <iostream>
27#include <numeric>
28#include <string>
29#include <vector>
30
31
32#include <mpreal.h>
34#include "exprtk.hpp"
35
36
37typedef mpfr::mpreal numeric_type;
38
39#if __cplusplus >= 201103L
40 #define exprtk_test_override override
41 #define exprtk_test_final final
42 #define exprtk_test_delete = delete
43#else
44 #define exprtk_test_override
45 #define exprtk_test_final
46 #define exprtk_test_delete
47#endif
48
49typedef std::pair<std::string,numeric_type> test_t;
50
51static const test_t global_test_list[] =
52{
53 // Note: Each of following tests must compile down
54 // to a single literal node.
55 test_t("0",0.0),
56 test_t("1",1.0),
57 test_t("2",2.0),
58 test_t("3",3.0),
59 test_t("4",4.0),
60 test_t("5",5.0),
61 test_t("6",6.0),
62 test_t("7",7.0),
63 test_t("8",8.0),
64 test_t("9",9.0),
65 test_t("12.12",12.12),
66 test_t("123.123",123.123),
67 test_t("1234.1234",1234.1234),
68 test_t("12345.12345",12345.12345),
69 test_t("123456.123456",123456.123456),
70 test_t("0.0",0.0),
71 test_t("1.0",1.0),
72 test_t("2.0",2.0),
73 test_t("3.0",3.0),
74 test_t("4.0",4.0),
75 test_t("5.0",5.0),
76 test_t("6.0",6.0),
77 test_t("7.0",7.0),
78 test_t("8.0",8.0),
79 test_t("9.0",9.0),
80 test_t("0.0",0.0),
81 test_t("1.1",1.1),
82 test_t("2.2",2.2),
83 test_t("3.3",3.3),
84 test_t("4.4",4.4),
85 test_t("5.5",5.5),
86 test_t("6.6",6.6),
87 test_t("7.7",7.7),
88 test_t("8.8",8.8),
89 test_t("9.9",9.9),
90 test_t("+0",0.0),
91 test_t("+1",1.0),
92 test_t("+2",2.0),
93 test_t("+3",3.0),
94 test_t("+4",4.0),
95 test_t("+5",5.0),
96 test_t("+6",6.0),
97 test_t("+7",7.0),
98 test_t("+8",8.0),
99 test_t("+9",9.0),
100 test_t("+0.0",0.0),
101 test_t("+1.0",1.0),
102 test_t("+2.0",2.0),
103 test_t("+3.0",3.0),
104 test_t("+4.0",4.0),
105 test_t("+5.0",5.0),
106 test_t("+6.0",6.0),
107 test_t("+7.0",7.0),
108 test_t("+8.0",8.0),
109 test_t("+9.0",9.0),
110 test_t("+0.0",0.0),
111 test_t("+1.1",1.1),
112 test_t("+2.2",2.2),
113 test_t("+3.3",3.3),
114 test_t("+4.4",4.4),
115 test_t("+5.5",5.5),
116 test_t("+6.6",6.6),
117 test_t("+7.7",7.7),
118 test_t("+8.8",8.8),
119 test_t("+9.9",9.9),
120 test_t("-0",-0.0),
121 test_t("-1",-1.0),
122 test_t("-2",-2.0),
123 test_t("-3",-3.0),
124 test_t("-4",-4.0),
125 test_t("-5",-5.0),
126 test_t("-6",-6.0),
127 test_t("-7",-7.0),
128 test_t("-8",-8.0),
129 test_t("-9",-9.0),
130 test_t("-0.0",-0.0),
131 test_t("-1.0",-1.0),
132 test_t("-2.0",-2.0),
133 test_t("-3.0",-3.0),
134 test_t("-4.0",-4.0),
135 test_t("-5.0",-5.0),
136 test_t("-6.0",-6.0),
137 test_t("-7.0",-7.0),
138 test_t("-8.0",-8.0),
139 test_t("-9.0",-9.0),
140 test_t("-0.0",-0.0),
141 test_t("-1.1",-1.1),
142 test_t("-2.2",-2.2),
143 test_t("-3.3",-3.3),
144 test_t("-4.4",-4.4),
145 test_t("-5.5",-5.5),
146 test_t("-6.6",-6.6),
147 test_t("-7.7",-7.7),
148 test_t("-8.8",-8.8),
149 test_t("-9.9",-9.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.0E+0",-0.0E+0),
181 test_t("-1.1E+1",-1.1E+1),
182 test_t("-2.2E+2",-2.2E+2),
183 test_t("-3.3E+3",-3.3E+3),
184 test_t("-4.4E+4",-4.4E+4),
185 test_t("-5.5E+5",-5.5E+5),
186 test_t("-6.6E+6",-6.6E+6),
187 test_t("-7.7E+7",-7.7E+7),
188 test_t("-8.8E+8",-8.8E+8),
189 test_t("-9.9E+9",-9.9E+9),
190 test_t("(0)",0.0),
191 test_t("(1)",1.0),
192 test_t("(2)",2.0),
193 test_t("(3)",3.0),
194 test_t("(4)",4.0),
195 test_t("(5)",5.0),
196 test_t("(6)",6.0),
197 test_t("(7)",7.0),
198 test_t("(8)",8.0),
199 test_t("(9)",9.0),
200 test_t("(0.0)",0.0),
201 test_t("(1.0)",1.0),
202 test_t("(2.0)",2.0),
203 test_t("(3.0)",3.0),
204 test_t("(4.0)",4.0),
205 test_t("(5.0)",5.0),
206 test_t("(6.0)",6.0),
207 test_t("(7.0)",7.0),
208 test_t("(8.0)",8.0),
209 test_t("(9.0)",9.0),
210 test_t("(0.0)",0.0),
211 test_t("(1.1)",1.1),
212 test_t("(2.2)",2.2),
213 test_t("(3.3)",3.3),
214 test_t("(4.4)",4.4),
215 test_t("(5.5)",5.5),
216 test_t("(6.6)",6.6),
217 test_t("(7.7)",7.7),
218 test_t("(8.8)",8.8),
219 test_t("(9.9)",9.9),
220 test_t("(+0)" ,0.0),
221 test_t("(+1)" ,1.0),
222 test_t("(+2)" ,2.0),
223 test_t("(+3)" ,3.0),
224 test_t("(+4)" ,4.0),
225 test_t("(+5)" ,5.0),
226 test_t("(+6)" ,6.0),
227 test_t("(+7)" ,7.0),
228 test_t("(+8)" ,8.0),
229 test_t("(+9)" ,9.0),
230 test_t("(+0.0)",0.0),
231 test_t("(+1.0)",1.0),
232 test_t("(+2.0)",2.0),
233 test_t("(+3.0)",3.0),
234 test_t("(+4.0)",4.0),
235 test_t("(+5.0)",5.0),
236 test_t("(+6.0)",6.0),
237 test_t("(+7.0)",7.0),
238 test_t("(+8.0)",8.0),
239 test_t("(+9.0)",9.0),
240 test_t("(+0.0)",0.0),
241 test_t("(+1.1)",1.1),
242 test_t("(+2.2)",2.2),
243 test_t("(+3.3)",3.3),
244 test_t("(+4.4)",4.4),
245 test_t("(+5.5)",5.5),
246 test_t("(+6.6)",6.6),
247 test_t("(+7.7)",7.7),
248 test_t("(+8.8)",8.8),
249 test_t("(+9.9)",9.9),
250 test_t("(-0)" ,-0.0),
251 test_t("(-1)" ,-1.0),
252 test_t("(-2)" ,-2.0),
253 test_t("(-3)" ,-3.0),
254 test_t("(-4)" ,-4.0),
255 test_t("(-5)" ,-5.0),
256 test_t("(-6)" ,-6.0),
257 test_t("(-7)" ,-7.0),
258 test_t("(-8)" ,-8.0),
259 test_t("(-9)" ,-9.0),
260 test_t("(-0.0)",-0.0),
261 test_t("(-1.0)",-1.0),
262 test_t("(-2.0)",-2.0),
263 test_t("(-3.0)",-3.0),
264 test_t("(-4.0)",-4.0),
265 test_t("(-5.0)",-5.0),
266 test_t("(-6.0)",-6.0),
267 test_t("(-7.0)",-7.0),
268 test_t("(-8.0)",-8.0),
269 test_t("(-9.0)",-9.0),
270 test_t("(-0.0)",-0.0),
271 test_t("(-1.1)",-1.1),
272 test_t("(-2.2)",-2.2),
273 test_t("(-3.3)",-3.3),
274 test_t("(-4.4)",-4.4),
275 test_t("(-5.5)",-5.5),
276 test_t("(-6.6)",-6.6),
277 test_t("(-7.7)",-7.7),
278 test_t("(-8.8)",-8.8),
279 test_t("(-9.9)",-9.9),
280 test_t("-(1.1)",-1.1),
281 test_t("-(1.1+2.2)",-3.3),
282 test_t("1234567890",1234567890),
283 test_t("123456789.0",123456789.0),
284 test_t("+1234567890",1234567890),
285 test_t("+123456789.0",123456789.0),
286 test_t("-1234567890",-1234567890),
287 test_t("-123456789.0",-123456789.0),
288 test_t("1234.567890",1234.567890),
289 test_t("-1234.567890",-1234.567890),
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("( 0 + 9 )",9.0),
311 test_t("( 1 + 8 )",9.0),
312 test_t("( 2 + 7 )",9.0),
313 test_t("( 3 + 6 )",9.0),
314 test_t("( 4 + 5 )",9.0),
315 test_t("( 5 + 4 )",9.0),
316 test_t("( 6 + 3 )",9.0),
317 test_t("( 7 + 2 )",9.0),
318 test_t("( 8 + 1 )",9.0),
319 test_t("( 9 + 0 )",9.0),
320 test_t("1E1+1",11.0),
321 test_t("1e1+1",11.0),
322 test_t("1E1-1", 9.0),
323 test_t("1e1-1", 9.0),
324 test_t("1E01+1",11.0),
325 test_t("1e01+1",11.0),
326 test_t("1E01-1", 9.0),
327 test_t("1e01-1", 9.0),
328 test_t("1+2",+3.0),
329 test_t("1-2",-1.0),
330 test_t("1*2",+2.0),
331 test_t("1/2",+0.5),
332 test_t("1.1+2.2", +3.3),
333 test_t("1.1-2.2", -1.1),
334 test_t("1.1*2.2",+2.42),
335 test_t("1.1/2.2", +0.5),
336 test_t("0-9",-9.0),
337 test_t("1-8",-7.0),
338 test_t("2-7",-5.0),
339 test_t("3-6",-3.0),
340 test_t("4-5",-1.0),
341 test_t("5-4",+1.0),
342 test_t("6-3",+3.0),
343 test_t("7-2",+5.0),
344 test_t("8-1",+7.0),
345 test_t("9-0",+9.0),
346 test_t("2.*3",+6.0),
347 test_t("2.*3.",+6.0),
348 test_t("2.+3",+5.0),
349 test_t("2.+3.",+5.0),
350 test_t("123.*456.",+56088.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("( 0 - 9 )",-9.0),
362 test_t("( 1 - 8 )",-7.0),
363 test_t("( 2 - 7 )",-5.0),
364 test_t("( 3 - 6 )",-3.0),
365 test_t("( 4 - 5 )",-1.0),
366 test_t("( 5 - 4 )",+1.0),
367 test_t("( 6 - 3 )",+3.0),
368 test_t("( 7 - 2 )",+5.0),
369 test_t("( 8 - 1 )",+7.0),
370 test_t("( 9 - 0 )",+9.0),
371 test_t("1 - -1" , 2.0),
372 test_t("1 --1" , 2.0),
373 test_t("1-- 1" , 2.0),
374 test_t("1--1" , 2.0),
375 test_t("1 -- -1", 0.0),
376 test_t("1 + -1" , 0.0),
377 test_t("1 +-1" , 0.0),
378 test_t("1+- 1" , 0.0),
379 test_t("1+-1" , 0.0),
380 test_t("1 +- -1", 2.0),
381 test_t("1 + +1" , 2.0),
382 test_t("1 ++1" , 2.0),
383 test_t("1 - -1 + 1" , 3.0),
384 test_t("1 --1 + 1" , 3.0),
385 test_t("1-- 1 + 1" , 3.0),
386 test_t("1--1 + 1" , 3.0),
387 test_t("1 -- -1 + 1", 1.0),
388 test_t("1 + -1 + 1" , 1.0),
389 test_t("1 +-1 + 1" , 1.0),
390 test_t("1+- 1 + 1" , 1.0),
391 test_t("1+-1 + 1" , 1.0),
392 test_t("1 +- -1 + 1", 3.0),
393 test_t("1 + +1 + 1" , 3.0),
394 test_t("1 ++1 + 1" , 3.0),
395 test_t("1 - -1 - 1" , 1.0),
396 test_t("1 --1 - 1" , 1.0),
397 test_t("1-- 1 - 1" , 1.0),
398 test_t("1--1 - 1" , 1.0),
399 test_t("1 -- -1 - 1", -1.0),
400 test_t("1 + -1 - 1" , -1.0),
401 test_t("1 +-1 - 1" , -1.0),
402 test_t("1+- 1 - 1" , -1.0),
403 test_t("1+-1 - 1" , -1.0),
404 test_t("1 +- -1 - 1", 1.0),
405 test_t("1 + +1 - 1" , 1.0),
406 test_t("1 ++1 - 1" , 1.0),
407 test_t("-(1+2)",-3.0),
408 test_t("+(1+2)",+3.0),
409 test_t("+(1-2)",-1.0),
410 test_t("-(1-2)",+1.0),
411 test_t("(-3*-6)",+18.0),
412 test_t("(-6*-3)",+18.0),
413 test_t("-(-3*-6)",-18.0),
414 test_t("-(-6*-3)",-18.0),
415 test_t("1.1+2.2+3.3",+6.6),
416 test_t("+1.1+2.2+3.3",+6.6),
417 test_t("-1.1-2.2-3.3",-6.6),
418 test_t("1.1*2.2*3.3",+7.986),
419 test_t("+1.1*2.2*3.3",+7.986),
420 test_t("-1.1*-2.2*-3.3",-7.986),
421 test_t("1 + 1/2",+1.5),
422 test_t("1 + (1/2)",+1.5),
423 test_t("1.1 + 1.1/2.2",+1.6),
424 test_t("1.1 + (1.1/2.2)",+1.6),
425 test_t("2 * 1/2",+1.0),
426 test_t("2 * (1/2)",+1.0),
427 test_t("2.2 * 1.1/2.2",+1.1),
428 test_t("2.2 * (1.1/2.2)",+1.1),
429 test_t("1^2",1.0),
430 test_t("2^1",2.0),
431 test_t("2^3",8.0),
432 test_t("-2^3",-8.0),
433 test_t("-2^4",-16.0),
434 test_t("(-2)^3",-8.0),
435 test_t("(-2)^4",+16.0),
436 test_t("3^2^4",43046721.0),
437 test_t("1.1^2.2",1.23328630055466251099),
438 test_t("2.2^1.1",2.3804822576003541627),
439 test_t("2.2^3.3",13.48946876053338489127),
440 test_t("3.3^2.2^1.1",17.15193942371376191362472354210675542022),
441 test_t("+3.3^2.2^1.1",17.15193942371376191362472354210675542022),
442 test_t("3.3^+2.2^1.1",17.15193942371376191362472354210675542022),
443 test_t("3.3^2.2^+1.1",17.15193942371376191362472354210675542022),
444 test_t("3.3^2.2^-1.1",1.65127293793867959137),
445 test_t("+3.3^+2.2^-1.1",1.65127293793867959137),
446 test_t("1.1^(1.1 * 2.2)",1.25941916576299080582),
447 test_t("2.2^(1.1 * 3.3)",17.49823848953534759743),
448 test_t("3.3^(1.1 * 2.2)",17.98058156638874965269),
449 test_t("1.1^-2.2/1.1",0.73712884727743375853),
450 test_t("1.1^+2.2/1.1",1.121169364140602282717273261774),
451 test_t("1.1^2.2/+1.1",1.121169364140602282717273261774),
452 test_t("1.1^+2.2/+1.1",1.121169364140602282717273261774),
453 test_t("1.1^+2.2/-1.1",-1.121169364140602282717273261774),
454 test_t("1.1^2.2/-1.1",-1.121169364140602282717273261774),
455 test_t("1.1^+2.2/-1.1",-1.121169364140602282717273261774),
456 test_t("+1.1^-2.2/1.1",0.73712884727743375853),
457 test_t("+1.1^+2.2/1.1",1.121169364140602282717273261774),
458 test_t("+1.1^2.2/+1.1",1.121169364140602282717273261774),
459 test_t("+1.1^+2.2/+1.1",1.121169364140602282717273261774),
460 test_t("+1.1^+2.2/-1.1",-1.121169364140602282717273261774),
461 test_t("+1.1^2.2/-1.1",-1.121169364140602282717273261774),
462 test_t("+1.1^+2.2/-1.1",-1.121169364140602282717273261774),
463 test_t("equal(1.23^3,(1.23 * 1.23 * 1.23))",1.0),
464 test_t("equal(1.23^-3,1/(1.23 * 1.23 * 1.23))",1.0),
465 test_t("equal((2.1 + 1.23^3),(2.1 + [1.23 * 1.23 * 1.23]))",1.0),
466 test_t("equal((2.1 - 1.23^3),(2.1 - [1.23 * 1.23 * 1.23]))",1.0),
467 test_t("equal((2.1 * 1.23^3),(2.1 * [1.23 * 1.23 * 1.23]))",1.0),
468 test_t("equal((2.1 / 1.23^3),(2.1 / [1.23 * 1.23 * 1.23]))",1.0),
469 test_t("equal((1.23^3 + 2.1),({1.23 * 1.23 * 1.23} + 2.1))",1.0),
470 test_t("equal((1.23^3 - 2.1),({1.23 * 1.23 * 1.23} - 2.1))",1.0),
471 test_t("equal((1.23^3 * 2.1),({1.23 * 1.23 * 1.23} * 2.1))",1.0),
472 test_t("equal((1.23^3 / 2.1),({1.23 * 1.23 * 1.23} / 2.1))",1.0),
473 test_t("equal(1.0^(1.0/2.0),sqrt(1.0))",1.0),
474 test_t("equal(1.0^(1.0/2.0),root(1.0,2.0))",1.0),
475 test_t("equal(1.0^(1.0/3.0),root(1.0,3.0))",1.0),
476 test_t("equal(1.0^(1.0/4.0),root(1.0,4.0))",1.0),
477 test_t("equal(1.0^(1.0/5.0),root(1.0,5.0))",1.0),
478 test_t("equal(1.0^(1.0/6.0),root(1.0,6.0))",1.0),
479 test_t("equal(1.0^(1.0/7.0),root(1.0,7.0))",1.0),
480 test_t("equal(1.0^(1.0/8.0),root(1.0,8.0))",1.0),
481 test_t("equal(1.0^(1.0/9.0),root(1.0,9.0))",1.0),
482 test_t("equal(2.0^(1.0/2.0),sqrt(2.0))",1.0),
483 test_t("equal(2.0^(1.0/2.0),root(2.0,2.0))",1.0),
484 test_t("equal(3.0^(1.0/3.0),root(3.0,3.0))",1.0),
485 test_t("equal(4.0^(1.0/4.0),root(4.0,4.0))",1.0),
486 test_t("equal(5.0^(1.0/5.0),root(5.0,5.0))",1.0),
487 test_t("equal(6.0^(1.0/6.0),root(6.0,6.0))",1.0),
488 test_t("equal(7.0^(1.0/7.0),root(7.0,7.0))",1.0),
489 test_t("equal(8.0^(1.0/8.0),root(8.0,8.0))",1.0),
490 test_t("equal(9.0^(1.0/9.0),root(9.0,9.0))",1.0),
491 test_t("1 < 2", 1.0),
492 test_t("1 <= 2", 1.0),
493 test_t("1.1 <= 2.2", 1.0),
494 test_t("(1.0 + 0.1) <= (2.0 + 0.2)", 1.0),
495 test_t("1 > 2", 0.0),
496 test_t("1 >= 2", 0.0),
497 test_t("1.1 >= 2.2", 0.0),
498 test_t("(1.0 + 0.1) >= (2.0 + 0.2)", 0.0),
499 test_t("1 <> 2", 1.0),
500 test_t("1 != 2", 1.0),
501 test_t("1.1 <> 2.2", 1.0),
502 test_t("1.1 != 2.2", 1.0),
503 test_t("(1.0 + 0.1) <> (2.0 + 0.2)", 1.0),
504 test_t("(1.0 + 0.1) != (2.0 + 0.2)", 1.0),
505 test_t("1 == 1", 1.0),
506 test_t("1.1 == 1.1", 1.0),
507 test_t("1 = 1", 1.0),
508 test_t("1.1 = 1.1", 1.0),
509 test_t("1 <> 1", 0.0),
510 test_t("1 != 1", 0.0),
511 test_t("1.1 <> 1.1", 0.0),
512 test_t("1.1 != 1.1", 0.0),
513 test_t("(1.0 + 0.1) <> (1.0 + 0.1)", 0.0),
514 test_t("(1.0 + 0.1) != (1.0 + 0.1)", 0.0),
515 test_t("equal(1.1,1.1)",1.0),
516 test_t("equal(1.1,2.2)",0.0),
517 test_t("not_equal(1.1,1.1)",0.0),
518 test_t("not_equal(1.1,2.2)",1.0),
519 test_t("1 and 1",1.0),
520 test_t("1 and 0",0.0),
521 test_t("0 and 1",0.0),
522 test_t("0 and 0",0.0),
523 test_t("1.0 and 1.0",1.0),
524 test_t("1.0 and 0.0",0.0),
525 test_t("0.0 and 1.0",0.0),
526 test_t("0.0 and 0.0",0.0),
527 test_t("(1 and 1)",1.0),
528 test_t("(1 and 0)",0.0),
529 test_t("(0 and 1)",0.0),
530 test_t("(0 and 0)",0.0),
531 test_t("(1.0 and 1.0)",1.0),
532 test_t("(1.0 and 0.0)",0.0),
533 test_t("(0.0 and 1.0)",0.0),
534 test_t("(0.0 and 0.0)",0.0),
535 test_t("1 or 1",1.0),
536 test_t("1 or 0",1.0),
537 test_t("0 or 1",1.0),
538 test_t("0 or 0",0.0),
539 test_t("1.0 or 1.0",1.0),
540 test_t("1.0 or 0.0",1.0),
541 test_t("0.0 or 1.0",1.0),
542 test_t("0.0 or 0.0",0.0),
543 test_t("(1 or 1)",1.0),
544 test_t("(1 or 0)",1.0),
545 test_t("(0 or 1)",1.0),
546 test_t("(0 or 0)",0.0),
547 test_t("(1.0 or 1.0)",1.0),
548 test_t("(1.0 or 0.0)",1.0),
549 test_t("(0.0 or 1.0)",1.0),
550 test_t("(0.0 or 0.0)",0.0),
551 test_t("1 nand 1",0.0),
552 test_t("1 nand 0",1.0),
553 test_t("0 nand 1",1.0),
554 test_t("0 nand 0",1.0),
555 test_t("1.0 nand 1.0",0.0),
556 test_t("1.0 nand 0.0",1.0),
557 test_t("0.0 nand 1.0",1.0),
558 test_t("0.0 nand 0.0",1.0),
559 test_t("(1 nand 1)",0.0),
560 test_t("(1 nand 0)",1.0),
561 test_t("(0 nand 1)",1.0),
562 test_t("(0 nand 0)",1.0),
563 test_t("(1.0 nand 1.0)",0.0),
564 test_t("(1.0 nand 0.0)",1.0),
565 test_t("(0.0 nand 1.0)",1.0),
566 test_t("(0.0 nand 0.0)",1.0),
567 test_t("1 nor 1",0.0),
568 test_t("1 nor 0",0.0),
569 test_t("0 nor 1",0.0),
570 test_t("0 nor 0",1.0),
571 test_t("1.0 nor 1.0",0.0),
572 test_t("1.0 nor 0.0",0.0),
573 test_t("0.0 nor 1.0",0.0),
574 test_t("0.0 nor 0.0",1.0),
575 test_t("(1 nor 1)",0.0),
576 test_t("(1 nor 0)",0.0),
577 test_t("(0 nor 1)",0.0),
578 test_t("(0 nor 0)",1.0),
579 test_t("(1.0 nor 1.0)",0.0),
580 test_t("(1.0 nor 0.0)",0.0),
581 test_t("(0.0 nor 1.0)",0.0),
582 test_t("(0.0 nor 0.0)",1.0),
583 test_t("0 xor 0",0.0),
584 test_t("0 xor 1",1.0),
585 test_t("1 xor 0",1.0),
586 test_t("1 xor 1",0.0),
587 test_t("0.0 xor 0.0",0.0),
588 test_t("0.0 xor 1.0",1.0),
589 test_t("1.0 xor 0.0",1.0),
590 test_t("1.0 xor 1.0",0.0),
591 test_t("(0 xor 0)",0.0),
592 test_t("(0 xor 1)",1.0),
593 test_t("(1 xor 0)",1.0),
594 test_t("(1 xor 1)",0.0),
595 test_t("(0.0 xor 0.0)",0.0),
596 test_t("(0.0 xor 1.0)",1.0),
597 test_t("(1.0 xor 0.0)",1.0),
598 test_t("(1.0 xor 1.0)",0.0),
599 test_t("1 & 1",1.0),
600 test_t("1 & 0",0.0),
601 test_t("0 & 1",0.0),
602 test_t("0 & 0",0.0),
603 test_t("1.0 & 1.0",1.0),
604 test_t("1.0 & 0.0",0.0),
605 test_t("0.0 & 1.0",0.0),
606 test_t("0.0 & 0.0",0.0),
607 test_t("(1 & 1)",1.0),
608 test_t("(1 & 0)",0.0),
609 test_t("(0 & 1)",0.0),
610 test_t("(0 & 0)",0.0),
611 test_t("(1.0 & 1.0)",1.0),
612 test_t("(1.0 & 0.0)",0.0),
613 test_t("(0.0 & 1.0)",0.0),
614 test_t("(0.0 & 0.0)",0.0),
615 test_t("1 | 1",1.0),
616 test_t("1 | 0",1.0),
617 test_t("0 | 1",1.0),
618 test_t("0 | 0",0.0),
619 test_t("1.0 | 1.0",1.0),
620 test_t("1.0 | 0.0",1.0),
621 test_t("0.0 | 1.0",1.0),
622 test_t("0.0 | 0.0",0.0),
623 test_t("(1 | 1)",1.0),
624 test_t("(1 | 0)",1.0),
625 test_t("(0 | 1)",1.0),
626 test_t("(0 | 0)",0.0),
627 test_t("(1.0 | 1.0)",1.0),
628 test_t("(1.0 | 0.0)",1.0),
629 test_t("(0.0 | 1.0)",1.0),
630 test_t("(0.0 | 0.0)",0.0),
631 test_t("(1 nand 1) == not(1 and 1)",1.0),
632 test_t("(1 nand 0) == not(1 and 0)",1.0),
633 test_t("(0 nand 1) == not(0 and 1)",1.0),
634 test_t("(0 nand 0) == not(0 and 0)",1.0),
635 test_t("(1 nor 1) == not(1 or 1)",1.0),
636 test_t("(1 nor 0) == not(1 or 0)",1.0),
637 test_t("(0 nor 1) == not(0 or 1)",1.0),
638 test_t("(0 nor 0) == not(0 or 0)",1.0),
639 test_t("(1.0 nand 1.0) == not(1.0 and 1.0)",1.0),
640 test_t("(1.0 nand 0.0) == not(1.0 and 0.0)",1.0),
641 test_t("(0.0 nand 1.0) == not(0.0 and 1.0)",1.0),
642 test_t("(0.0 nand 0.0) == not(0.0 and 0.0)",1.0),
643 test_t("(1.0 nor 1.0) == not(1.0 or 1.0)",1.0),
644 test_t("(1.0 nor 0.0) == not(1.0 or 0.0)",1.0),
645 test_t("(0.0 nor 1.0) == not(0.0 or 1.0)",1.0),
646 test_t("(0.0 nor 0.0) == not(0.0 or 0.0)",1.0),
647 test_t("(1 nand 1) == not(1 & 1)",1.0),
648 test_t("(1 nand 0) == not(1 & 0)",1.0),
649 test_t("(0 nand 1) == not(0 & 1)",1.0),
650 test_t("(0 nand 0) == not(0 & 0)",1.0),
651 test_t("(1 nor 1) == not(1 | 1)",1.0),
652 test_t("(1 nor 0) == not(1 | 0)",1.0),
653 test_t("(0 nor 1) == not(0 | 1)",1.0),
654 test_t("(0 nor 0) == not(0 | 0)",1.0),
655 test_t("(1.0 nand 1.0) == not(1.0 & 1.0)",1.0),
656 test_t("(1.0 nand 0.0) == not(1.0 & 0.0)",1.0),
657 test_t("(0.0 nand 1.0) == not(0.0 & 1.0)",1.0),
658 test_t("(0.0 nand 0.0) == not(0.0 & 0.0)",1.0),
659 test_t("(1.0 nor 1.0) == not(1.0 | 1.0)",1.0),
660 test_t("(1.0 nor 0.0) == not(1.0 | 0.0)",1.0),
661 test_t("(0.0 nor 1.0) == not(0.0 | 1.0)",1.0),
662 test_t("(0.0 nor 0.0) == not(0.0 | 0.0)",1.0),
663 test_t("mand(1,1)",1.0),
664 test_t("mand(1,0)",0.0),
665 test_t("mand(0,1)",0.0),
666 test_t("mand(0,0)",0.0),
667 test_t("mand(1.0,1.0)",1.0),
668 test_t("mand(1.0,0.0)",0.0),
669 test_t("mand(0.0,1.0)",0.0),
670 test_t("mand(0.0,0.0)",0.0),
671 test_t("mor(1,1)",1.0),
672 test_t("mor(1,0)",1.0),
673 test_t("mor(0,1)",1.0),
674 test_t("mor(0,0)",0.0),
675 test_t("mor(1.0,1.0)",1.0),
676 test_t("mor(1.0,0.0)",1.0),
677 test_t("mor(0.0,1.0)",1.0),
678 test_t("mor(0.0,0.0)",0.0),
679 test_t("(1 nand 1) == not(mand(1,1))",1.0),
680 test_t("(1 nand 0) == not(mand(1,0))",1.0),
681 test_t("(0 nand 1) == not(mand(0,1))",1.0),
682 test_t("(0 nand 0) == not(mand(0,0))",1.0),
683 test_t("(1 nor 1) == not(mor(1,1))",1.0),
684 test_t("(1 nor 0) == not(mor(1,0))",1.0),
685 test_t("(0 nor 1) == not(mor(0,1))",1.0),
686 test_t("(0 nor 0) == not(mor(0,0))",1.0),
687 test_t("(1.0 nand 1.0) == not(mand(1.0,1.0))",1.0),
688 test_t("(1.0 nand 0.0) == not(mand(1.0,0.0))",1.0),
689 test_t("(0.0 nand 1.0) == not(mand(0.0,1.0))",1.0),
690 test_t("(0.0 nand 0.0) == not(mand(0.0,0.0))",1.0),
691 test_t("(1.0 nor 1.0) == not(mor(1.0,1.0))",1.0),
692 test_t("(1.0 nor 0.0) == not(mor(1.0,0.0))",1.0),
693 test_t("(0.0 nor 1.0) == not(mor(0.0,1.0))",1.0),
694 test_t("(0.0 nor 0.0) == not(mor(0.0,0.0))",1.0),
695 test_t("abs(1)",1.0),
696 test_t("abs(-1)",1.0),
697 test_t("abs(1.0)",1.0),
698 test_t("abs(-1.0)",1.0),
699 test_t("min(1,2)",1.0),
700 test_t("min(1,2,3)",1.0),
701 test_t("min(1,2,3,4)",1.0),
702 test_t("min(1,2,3,4,5)",1.0),
703 test_t("min(1,2,3,4,5,6)",1.0),
704 test_t("min(1.1,2.2)",1.1),
705 test_t("min(1.1,2.2,3.3)",1.1),
706 test_t("min(1.1,2.2,3.3,4.4)",1.1),
707 test_t("min(1.1,2.2,3.3,4.4,5.5)",1.1),
708 test_t("min(1.1,2.2,3.3,4.4,5.5,6.6)",1.1),
709 test_t("min(min(1,2),min(3,4))",1.0),
710 test_t("max(1,2)",2.0),
711 test_t("max(1,2,3)",3.0),
712 test_t("max(1,2,3,4)",4.0),
713 test_t("max(1,2,3,4,5)",5.0),
714 test_t("max(1,2,3,4,5,6)",6.0),
715 test_t("max(1.1,2.2)",2.2),
716 test_t("max(1.1,2.2,3.3)",3.3),
717 test_t("max(1.1,2.2,3.3,4.4)",4.4),
718 test_t("max(1.1,2.2,3.3,4.4,5.5)",5.5),
719 test_t("max(1.1,2.2,3.3,4.4,5.5,6.6)",6.6),
720 test_t("max(max(1,2),max(3,4))",4.0),
721 test_t("avg(1,2)",1.5),
722 test_t("avg(1,2,3)",2.0),
723 test_t("avg(1,2,3,4)",2.5),
724 test_t("avg(1,2,3,4,5)",3.0),
725 test_t("avg(1.1,2.2)",1.65),
726 test_t("avg(1.1,2.2,3.3)",2.2),
727 test_t("avg(1.1,2.2,3.3,4.4)",2.75),
728 test_t("avg(1.1,2.2,3.3,4.4,5.5)",3.3),
729 test_t("avg(1.1,2.2,3.3,4.4,5.5,6.6)",3.85),
730 test_t("sum(1,2)",3.0),
731 test_t("sum(1,2,3)",6.0),
732 test_t("sum(1,2,3,4)",10),
733 test_t("sum(1,2,3,4,5)",15.0),
734 test_t("sum(1,2,3,4,5,6)",21),
735 test_t("sum(1.1,2.2)",3.3),
736 test_t("sum(1.1,2.2,3.3)",6.6),
737 test_t("sum(1.1,2.2,3.3,4.4)",11.0),
738 test_t("sum(1.1,2.2,3.3,4.4,5.5)",16.5),
739 test_t("sum(1.1,2.2,3.3,4.4,5.5,6.6)",23.1),
740 test_t("mul(1,2)",2.0),
741 test_t("mul(1,2,3)",6.0),
742 test_t("mul(1,2,3,4)",24.0),
743 test_t("mul(1,2,3,4,5)",120.0),
744 test_t("mul(1,2,3,4,5,6)",720.0),
745 test_t("mul(1.1,2.2)",2.42),
746 test_t("mul(1.1,2.2,3.3)",7.986),
747 test_t("mul(1.1,2.2,3.3,4.4)",35.1384),
748 test_t("mul(1.1,2.2,3.3,4.4,5.5)",193.2612),
749 test_t("mul(1.1,2.2,3.3,4.4,5.5,6.6)",1275.52392),
750 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),
751 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),
752 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),
753 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),
754 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),
755 test_t("floor(1.0)",1.0),
756 test_t("floor(1.1)",1.0),
757 test_t("floor(-1.0)",-1.0),
758 test_t("floor(-1.1)",-2.0),
759 test_t("ceil(1.0)",1.0),
760 test_t("ceil(1.1)",2.0),
761 test_t("ceil(-1.0)",-1.0),
762 test_t("ceil(-1.1)",-1.0),
763 test_t("round(1.1)",1.0),
764 test_t("round(1.49)",1.0),
765 test_t("round(1.5)",2.0),
766 test_t("round(1.9)",2.0),
767 test_t("roundn(1/3,2)",0.33),
768 test_t("roundn(1/3,5)",0.33333),
769 test_t("roundn(2/3,2)",0.67),
770 test_t("roundn(2/3,5)",0.66667),
771 test_t("roundn(1.0/3.0,2.0)",0.33),
772 test_t("roundn(1.0/3.0,5.0)",0.33333),
773 test_t("roundn(2.0/3.0,2.0)",0.67),
774 test_t("roundn(2.0/3.0,5.0)",0.66667),
775 test_t("cos(0.0)",1.0),
776 test_t("sin(0.0)",0.0),
777 test_t("equal(sin(pi/4.0),cos(pi/4.0))",1.0),
778 test_t("equal(sin(pi/6.0),cos(pi/3.0))",1.0),
779 test_t("(sin(pi/4.0) - cos(pi/4.0)) <= epsilon",1.0),
780 test_t("(cos(pi/3.0) - sin(pi/6.0)) <= epsilon",1.0),
781 test_t("sin(deg2rad(30))",0.5),
782 test_t("cos(deg2rad(60))",0.5),
783 test_t("sin(deg2rad(30)) + cos(deg2rad(60))",1.0),
784 test_t("equal(sin(deg2rad(30))/cos(deg2rad(30)),tan(deg2rad(30)))",1.0),
785 test_t("equal(sinh(pi),11.5487393572577483779773343153884) ",1.0),
786 test_t("equal(asinh(11.5487393572577483779773343153884),pi)",1.0),
787 test_t("equal(cosh(pi),11.5919532755215206277517520525601) ",1.0),
788 test_t("equal(acosh(11.5919532755215206277517520525601),pi)",1.0),
789 test_t("equal(tanh(pi),0.99627207622074994426469058001253) ",1.0),
790 test_t("equal(atanh(0.99627207622074994426469058001253),pi)",1.0),
791 test_t("exp(1.0)",2.71828182845904523536028747135266249775724),
792 test_t("exp(0.0)",1.0),
793 test_t("log(2.7182818284590451)",1.0),
794 test_t("log10(10.0)",1.0),
795 test_t("frac(12.34) + trunc(12.34)",12.34),
796 test_t("hypot(3.0,4.0)",5.0),
797 test_t("hypot(1.0,sqrt(3.0))",2.0),
798 test_t("if(1 < 2, 3, 4)",3.0),
799 test_t("if(1.1 < 2.2, 3.3, 4.4)",3.3),
800 test_t("if((1.0+1.1) < (2.0+1.2), 3.3, 4.4)",3.3),
801 test_t("if(1 = 2, 3, 4)",4.0),
802 test_t("if(1.1 = 2.2, 3.3, 4.4)",4.4),
803 test_t("if((1.0+1.1) = (2.0+1.2), 3.3, 4.4)",4.4),
804 test_t("if(1 == 2, 3, 4)",4.0),
805 test_t("if(1.1 == 2.2, 3.3, 4.4)",4.4),
806 test_t("if((1.0+1.1) == (2.0+1.2), 3.3, 4.4)",4.4),
807 test_t("if(1 >= 2, 3, 4)",4.0),
808 test_t("if(1.1 >= 2.2, 3.3, 4.4)",4.4),
809 test_t("if((1.0+1.1) >= (2.0+1.2), 3.3, 4.4)",4.4),
810 test_t("if(((1.0 + 2.0) == 3.0) and ((4.0 + 5.0) < 9.0),1,2)",2.0),
811 test_t("(3.0 - 1.0 - 2.0) == ((3.0 - 1.0) - 2.0)",1.0),
812 test_t("true == true",1.0),
813 test_t("false == false",1.0),
814 test_t("true != false",1.0),
815 test_t("false != true",1.0),
816 test_t("(1 < 2) == true",1.0),
817 test_t("(1 > 2) == false",1.0),
818 test_t("true == (1 < 2)",1.0),
819 test_t("false == (1 > 2)",1.0),
820 test_t("(1 > 2) != true",1.0),
821 test_t("(1 < 2) != false",1.0),
822 test_t("true != (1 > 2)",1.0),
823 test_t("false != (1 < 2)",1.0),
824 test_t("(true and true) == true",1.0),
825 test_t("(false and false) == false",1.0),
826 test_t("(true or true) == true",1.0),
827 test_t("(false or false) == false",1.0),
828 test_t("(true and false) == false",1.0),
829 test_t("(false and true) == false",1.0),
830 test_t("(true or false) == true",1.0),
831 test_t("(false or true) == true",1.0),
832 test_t("(true & true) == true",1.0),
833 test_t("(false & false) == false",1.0),
834 test_t("(true | true) == true",1.0),
835 test_t("(false | false) == false",1.0),
836 test_t("(true & false) == false",1.0),
837 test_t("(false & true) == false",1.0),
838 test_t("(true | false) == true",1.0),
839 test_t("(false | true) == true",1.0),
840 test_t("clamp(-1,1,+1)",1.0),
841 test_t("clamp(-1,-1.5,+1.0)",-1.0),
842 test_t("clamp(-1,+1.5,+1.0)",+1.0),
843 test_t("clamp(-1,-1.5,+1.0) + clamp(-1,+1.5,+1.0)",0.0),
844 test_t("inrange(-2,1,+2) == ((-2 <= 1) and (1 <= +2))",1.0),
845 test_t("inrange(-2,1,+2) == if(({-2 <= 1} and [1 <= +2]),1.0,0.0)",1.0),
846 test_t("sgn( 0)", 0.0),
847 test_t("sgn(+3)",+1.0),
848 test_t("sgn(-3)",-1.0),
849 test_t("equal($f00(1.1,2.2,3.3),(1.1+2.2)/3.3)",1.0),
850 test_t("equal($f01(1.1,2.2,3.3),(1.1+2.2)*3.3)",1.0),
851 test_t("equal($f02(1.1,2.2,3.3),(1.1+2.2)-3.3)",1.0),
852 test_t("equal($f03(1.1,2.2,3.3),(1.1+2.2)+3.3)",1.0),
853 test_t("equal($f04(1.1,2.2,3.3),(1.1-2.2)+3.3)",1.0),
854 test_t("equal($f05(1.1,2.2,3.3),(1.1-2.2)/3.3)",1.0),
855 test_t("equal($f06(1.1,2.2,3.3),(1.1-2.2)*3.3)",1.0),
856 test_t("equal($f07(1.1,2.2,3.3),(1.1*2.2)+3.3)",1.0),
857 test_t("equal($f08(1.1,2.2,3.3),(1.1*2.2)-3.3)",1.0),
858 test_t("equal($f09(1.1,2.2,3.3),(1.1*2.2)/3.3)",1.0),
859 test_t("equal($f10(1.1,2.2,3.3),(1.1*2.2)*3.3)",1.0),
860 test_t("equal($f11(1.1,2.2,3.3),(1.1/2.2)+3.3)",1.0),
861 test_t("equal($f12(1.1,2.2,3.3),(1.1/2.2)-3.3)",1.0),
862 test_t("equal($f13(1.1,2.2,3.3),(1.1/2.2)/3.3)",1.0),
863 test_t("equal($f14(1.1,2.2,3.3),(1.1/2.2)*3.3)",1.0),
864 test_t("equal($f15(1.1,2.2,3.3),1.1/(2.2+3.3))",1.0),
865 test_t("equal($f16(1.1,2.2,3.3),1.1/(2.2-3.3))",1.0),
866 test_t("equal($f17(1.1,2.2,3.3),1.1/(2.2*3.3))",1.0),
867 test_t("equal($f18(1.1,2.2,3.3),1.1/(2.2/3.3))",1.0),
868 test_t("equal($f19(1.1,2.2,3.3),1.1*(2.2+3.3))",1.0),
869 test_t("equal($f20(1.1,2.2,3.3),1.1*(2.2-3.3))",1.0),
870 test_t("equal($f21(1.1,2.2,3.3),1.1*(2.2*3.3))",1.0),
871 test_t("equal($f22(1.1,2.2,3.3),1.1*(2.2/3.3))",1.0),
872 test_t("equal($f23(1.1,2.2,3.3),1.1-(2.2+3.3))",1.0),
873 test_t("equal($f24(1.1,2.2,3.3),1.1-(2.2-3.3))",1.0),
874 test_t("equal($f25(1.1,2.2,3.3),1.1-(2.2/3.3))",1.0),
875 test_t("equal($f26(1.1,2.2,3.3),1.1-(2.2*3.3))",1.0),
876 test_t("equal($f27(1.1,2.2,3.3),1.1+(2.2*3.3))",1.0),
877 test_t("equal($f28(1.1,2.2,3.3),1.1+(2.2/3.3))",1.0),
878 test_t("equal($f29(1.1,2.2,3.3),1.1+(2.2+3.3))",1.0),
879 test_t("equal($f30(1.1,2.2,3.3),1.1+(2.2-3.3))",1.0),
880 test_t("equal($f31(1.1,2.2,3.3),1.1*2.2^2+3.3)",1.0),
881 test_t("equal($f32(1.1,2.2,3.3),1.1*2.2^3+3.3)",1.0),
882 test_t("equal($f33(1.1,2.2,3.3),1.1*2.2^4+3.3)",1.0),
883 test_t("equal($f34(1.1,2.2,3.3),1.1*2.2^5+3.3)",1.0),
884 test_t("equal($f35(1.1,2.2,3.3),1.1*2.2^6+3.3)",1.0),
885 test_t("equal($f36(1.1,2.2,3.3),1.1*2.2^7+3.3)",1.0),
886 test_t("equal($f37(1.1,2.2,3.3),1.1*2.2^8+3.3)",1.0),
887 test_t("equal($f38(1.1,2.2,3.3),1.1*2.2^9+3.3)",1.0),
888 test_t("equal($f39(1.1,2.2,3.3),1.1*log(2.2)+3.3)",1.0),
889 test_t("equal($f40(1.1,2.2,3.3),1.1*log(2.2)-3.3)",1.0),
890 test_t("equal($f41(1.1,2.2,3.3),1.1*log10(2.2)+3.3)",1.0),
891 test_t("equal($f42(1.1,2.2,3.3),1.1*log10(2.2)-3.3)",1.0),
892 test_t("equal($f43(1.1,2.2,3.3),1.1*sin(2.2)+3.3)",1.0),
893 test_t("equal($f44(1.1,2.2,3.3),1.1*sin(2.2)-3.3)",1.0),
894 test_t("equal($f45(1.1,2.2,3.3),1.1*cos(2.2)+3.3)",1.0),
895 test_t("equal($f46(1.1,2.2,3.3),1.1*cos(2.2)-3.3)",1.0),
896 test_t("equal($f47(1.1,2.2,3.3),if(0!=1.1,2.2,3.3))",1.0),
897 test_t("equal($f48(1.1,2.2,3.3,4.4),1.1+((2.2+3.3)/4.4))",1.0),
898 test_t("equal($f49(1.1,2.2,3.3,4.4),1.1+((2.2+3.3)*4.4))",1.0),
899 test_t("equal($f50(1.1,2.2,3.3,4.4),1.1+((2.2-3.3)/4.4))",1.0),
900 test_t("equal($f51(1.1,2.2,3.3,4.4),1.1+((2.2-3.3)*4.4))",1.0),
901 test_t("equal($f52(1.1,2.2,3.3,4.4),1.1+((2.2*3.3)/4.4))",1.0),
902 test_t("equal($f53(1.1,2.2,3.3,4.4),1.1+((2.2*3.3)*4.4))",1.0),
903 test_t("equal($f54(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)+4.4))",1.0),
904 test_t("equal($f55(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)/4.4))",1.0),
905 test_t("equal($f56(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)*4.4))",1.0),
906 test_t("equal($f57(1.1,2.2,3.3,4.4),1.1-((2.2+3.3)/4.4))",1.0),
907 test_t("equal($f58(1.1,2.2,3.3,4.4),1.1-((2.2+3.3)*4.4))",1.0),
908 test_t("equal($f59(1.1,2.2,3.3,4.4),1.1-((2.2-3.3)/4.4))",1.0),
909 test_t("equal($f60(1.1,2.2,3.3,4.4),1.1-((2.2-3.3)*4.4))",1.0),
910 test_t("equal($f61(1.1,2.2,3.3,4.4),1.1-((2.2*3.3)/4.4))",1.0),
911 test_t("equal($f62(1.1,2.2,3.3,4.4),1.1-((2.2*3.3)*4.4))",1.0),
912 test_t("equal($f63(1.1,2.2,3.3,4.4),1.1-((2.2/3.3)/4.4))",1.0),
913 test_t("equal($f64(1.1,2.2,3.3,4.4),1.1-((2.2/3.3)*4.4))",1.0),
914 test_t("equal($f65(1.1,2.2,3.3,4.4),((1.1+2.2)*3.3)-4.4)",1.0),
915 test_t("equal($f66(1.1,2.2,3.3,4.4),((1.1-2.2)*3.3)-4.4)",1.0),
916 test_t("equal($f67(1.1,2.2,3.3,4.4),((1.1*2.2)*3.3)-4.4)",1.0),
917 test_t("equal($f68(1.1,2.2,3.3,4.4),((1.1/2.2)*3.3)-4.4)",1.0),
918 test_t("equal($f69(1.1,2.2,3.3,4.4),((1.1+2.2)/3.3)-4.4)",1.0),
919 test_t("equal($f70(1.1,2.2,3.3,4.4),((1.1-2.2)/3.3)-4.4)",1.0),
920 test_t("equal($f71(1.1,2.2,3.3,4.4),((1.1*2.2)/3.3)-4.4)",1.0),
921 test_t("equal($f72(1.1,2.2,3.3,4.4),((1.1/2.2)/3.3)-4.4)",1.0),
922 test_t("equal($f73(1.1,2.2,3.3,4.4),(1.1*2.2)+(3.3*4.4))",1.0),
923 test_t("equal($f74(1.1,2.2,3.3,4.4),(1.1*2.2)-(3.3*4.4))",1.0),
924 test_t("equal($f75(1.1,2.2,3.3,4.4),(1.1*2.2)+(3.3/4.4))",1.0),
925 test_t("equal($f76(1.1,2.2,3.3,4.4),(1.1*2.2)-(3.3/4.4))",1.0),
926 test_t("equal($f77(1.1,2.2,3.3,4.4),(1.1/2.2)+(3.3/4.4))",1.0),
927 test_t("equal($f78(1.1,2.2,3.3,4.4),(1.1/2.2)-(3.3/4.4))",1.0),
928 test_t("equal($f79(1.1,2.2,3.3,4.4),(1.1/2.2)-(3.3*4.4))",1.0),
929 test_t("equal($f80(1.1,2.2,3.3,4.4),1.1/(2.2+(3.3*4.4)))",1.0),
930 test_t("equal($f81(1.1,2.2,3.3,4.4),1.1/(2.2-(3.3*4.4)))",1.0),
931 test_t("equal($f82(1.1,2.2,3.3,4.4),1.1*(2.2+(3.3*4.4)))",1.0),
932 test_t("equal($f83(1.1,2.2,3.3,4.4),1.1*(2.2-(3.3*4.4)))",1.0),
933 test_t("equal($f84(1.1,2.2,3.3,4.4),1.1*2.2^2+3.3*4.4^2)",1.0),
934 test_t("equal($f85(1.1,2.2,3.3,4.4),1.1*2.2^3+3.3*4.4^3)",1.0),
935 test_t("equal($f86(1.1,2.2,3.3,4.4),1.1*2.2^4+3.3*4.4^4)",1.0),
936 test_t("equal($f87(1.1,2.2,3.3,4.4),1.1*2.2^5+3.3*4.4^5)",1.0),
937 test_t("equal($f88(1.1,2.2,3.3,4.4),1.1*2.2^6+3.3*4.4^6)",1.0),
938 test_t("equal($f89(1.1,2.2,3.3,4.4),1.1*2.2^7+3.3*4.4^7)",1.0),
939 test_t("equal($f90(1.1,2.2,3.3,4.4),1.1*2.2^8+3.3*4.4^8)",1.0),
940 test_t("equal($f91(1.1,2.2,3.3,4.4),1.1*2.2^9+3.3*4.4^9)",1.0),
941 test_t("equal($f92(1.1,2.2,3.3,4.4),if(1.1 and 2.2,3.3,4.4))",1.0),
942 test_t("equal($f93(1.1,2.2,3.3,4.4),if(1.1 or 2.2,3.3,4.4))",1.0),
943 test_t("equal($f94(1.1,2.2,3.3,4.4),if(1.1 < 2.2,3.3,4.4))",1.0),
944 test_t("equal($f95(1.1,2.2,3.3,4.4),if(1.1 <= 2.2,3.3,4.4))",1.0),
945 test_t("equal($f96(1.1,2.2,3.3,4.4),if(1.1 > 2.2,3.3,4.4))",1.0),
946 test_t("equal($f97(1.1,2.2,3.3,4.4),if(1.1 >= 2.2,3.3,4.4))",1.0),
947 test_t("equal($f98(1.1,2.2,3.3,4.4),if(equal(1.1,2.2),3.3,4.4))",1.0),
948 test_t("equal($f99(1.1,2.2,3.3,4.4),1.1*sin(2.2)+3.3*cos(4.4))",1.0),
949 test_t("equal((48.0/2.0*(9.0+3.0)),288.0)",1.0),
950 test_t("equal((48.0/2.0(9.0+3.0)),288.0)",1.0),
951 test_t("equal((6.0/2.0(1.0+2.0)),9.0)",1.0),
952 test_t("1+2+3+4+5+6+7+8+9+0",45.0),
953 test_t("1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0",45.0),
954 test_t("1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0 + 8.0 + 9.0 + 0.0",45.0),
955 test_t("(1+2)+(3+4)+(5+6)+(7+8)+(9+0)",45.0),
956 test_t("(1-2)+(3-4)+(5-6)+(7-8)+(9-0)",+5.0),
957 test_t("(1+2)-(3+4)-(5+6)-(7+8)-(9+0)",-39.0),
958 test_t("(1.0+2.0)+(3.0+4.0)+(5.0+6.0)+(7.0+8.0)+(9.0+0.0)",45.0),
959 test_t("(1.0-2.0)+(3.0-4.0)+(5.0-6.0)+(7.0-8.0)+(9.0-0.0)",+5.0),
960 test_t("(1.0+2.0)-(3.0+4.0)-(5.0+6.0)-(7.0+8.0)-(9.0+0.0)",-39.0),
961 test_t("[(1.0+2.0)+[3.0+4.0]+(5.0+6.0)]+([7.0+8.0]+(9.0+0.0))",45.0),
962 test_t("([1.0-2.0]+(3.0-4.0)+[5.0-6.0])+[(7.0-8.0)+[9.0-0.0]]",+5.0),
963 test_t("((1.0+2.0))-[(3.0+4.0)]-((5.0+6.0))-[(7.0+8.0)]-((9.0+0.0))",-39.0),
964 test_t("{[(1.0+2.0)+[3.0+4.0]+({5.0+6.0})]}+({[7.0+8.0]+(9.0+0.0)})",45.0),
965 test_t("{([1.0-2.0]+(3.0-4.0)+[5.0-6.0])}+[({+7.0}-{+8.0})+[{+9.0-0.0}]]",+5.0),
966 test_t("((+1.0+2.0))-[({+3.0+4.0})]-(({+5.0+6.0}))-[({+7.0}+8.0)]-(({+9.0}+{0.0}))",-39.0),
967 test_t("1+2-3*4/5+6-7*8/9+0",0.37777777777777777778),
968 test_t("1.1+2.2-3.3*4.4/5.5+6.6-7.7*8.8/9.9+0.0",0.41555555555555555556),
969 test_t("(1+2)-(3*4)/(5+6)-(7*8)/(9+0)",-4.31313131313131313131),
970 test_t("1/1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9",2.82896825396825396825),
971 test_t("(1/1)+(1/2)+(1/3)+(1/4)+(1/5)+(1/6)+(1/7)+(1/8)+(1/9)",2.82896825396825396825),
972 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),
973 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),
974 test_t("1/1*1/2*1/3*1/4*1/5*1/6*1/7*1/8*1/9",0.00000275573192239859),
975 test_t("(1/1)*(1/2)*(1/3)*(1/4)*(1/5)*(1/6)*(1/7)*(1/8)*(1/9)",0.00000275573192239859),
976 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),
977 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),
978 test_t("equal(poly01(1.2345,2.2,1.1),(2.2*1.2345^1+1.1))",1.0),
979 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),
980 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),
981 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),
982 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),
983 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),
984 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),
985 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),
986 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),
987 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),
988 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),
989 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),
990 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),
991 test_t("equal((pi^2^3),(pi^8))",1.0),
992 test_t("equal((pi^(2^3)),(pi^8))",1.0),
993 test_t("equal(pi^2^3-pi^8,0)",1.0),
994 test_t("equal((2*pi^2^3),2*(pi^8))",1.0),
995 test_t("equal((pi^2^3*2),2*(pi^8))",1.0),
996 test_t("equal((pi^2^3/2),(pi^8)/2)",1.0),
997 test_t("equal((pi^2.2^3.3),(pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
998 test_t("equal((pi^(2.2^3.3)),(pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
999 test_t("equal((2.2*pi^2.2^3.3),2.2*(pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1000 test_t("equal((pi^2.2^3.3*2),2*(pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1001 test_t("equal((pi^2.2^3.3/2.2),(pi^13.48946876053338489126547661922171945249366318331656582663329188)/2.2)",1.0),
1002 test_t("equal((pi^-2^3),1/(pi^8))",1.0),
1003 test_t("equal((pi^(-2^3)),1/(pi^8))",1.0),
1004 test_t("equal((pi^2^-3),(pi^(1/8)))",1.0),
1005 test_t("equal((pi^(2^-3)),(pi^(1/8)))",1.0),
1006 test_t("equal((pi^-2^-3),1/(pi^(1/8)))",1.0),
1007 test_t("equal((pi^(-2^-3)),1/(pi^(1/8)))",1.0),
1008 test_t("equal((-pi^2^3),(-pi^8))",1.0),
1009 test_t("equal((-pi^(2^3)),(-pi^8))",1.0),
1010 test_t("equal(-pi^2^3--pi^8,0)",1.0),
1011 test_t("equal((2*-pi^2^3),2*(-pi^8))",1.0),
1012 test_t("equal((-pi^2^3*2),2*(-pi^8))",1.0),
1013 test_t("equal((-pi^2^3/2),(-pi^8)/2)",1.0),
1014 test_t("equal((-pi^2.2^3.3),(-pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1015 test_t("equal((-pi^(2.2^3.3)),(-pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1016 test_t("equal((2.2*-pi^2.2^3.3),2.2*(-pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1017 test_t("equal((-pi^2.2^3.3*2),2*(-pi^13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1018 test_t("equal((-pi^2.2^3.3/2.2),(-pi^13.48946876053338489126547661922171945249366318331656582663329188)/2.2)",1.0),
1019 test_t("equal((-pi^-2^3),1/(-pi^8))",1.0),
1020 test_t("equal((-pi^(-2^3)),1/(-pi^8))",1.0),
1021 test_t("equal((-pi^2^-3),(-pi^(1/8)))",1.0),
1022 test_t("equal((-pi^(2^-3)),(-pi^(1/8)))",1.0),
1023 test_t("equal((-pi^-2^-3),1/(-pi^(1/8)))",1.0),
1024 test_t("equal((-pi^(-2^-3)),1/(-pi^(1/8)))",1.0),
1025 test_t("equal((+pi^+2^+3),(+pi^+8))",1.0),
1026 test_t("equal((+pi^(2^3)),(+pi^+8))",1.0),
1027 test_t("equal(+pi^+2^+3-+pi^+8,0)",1.0),
1028 test_t("equal((+2*+pi^+2^+3),+2*(+pi^+8))",1.0),
1029 test_t("equal((+pi^+2^+3*+2),+2*(+pi^+8))",1.0),
1030 test_t("equal((+pi^+2^+3/+2),(+pi^+8)/+2)",1.0),
1031 test_t("equal((+pi^+2.2^+3.3),(+pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1032 test_t("equal((+pi^(+2.2^+3.3)),(+pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1033 test_t("equal((+2.2*+pi^+2.2^+3.3),+2.2*(+pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1034 test_t("equal((+pi^+2.2^+3.3*+2),+2*(+pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1035 test_t("equal((+pi^+2.2^+3.3/+2.2),(+pi^+13.48946876053338489126547661922171945249366318331656582663329188)/+2.2)",1.0),
1036 test_t("equal((+pi^-2^3),1/(+pi^+8))",1.0),
1037 test_t("equal((+pi^(-2^3)),1/(+pi^+8))",1.0),
1038 test_t("equal((+pi^2^-3),(+pi^(+1/+8)))",1.0),
1039 test_t("equal((+pi^(2^-3)),(+pi^(+1/+8)))",1.0),
1040 test_t("equal((+pi^-2^-3),1/(+pi^(+1/+8)))",1.0),
1041 test_t("equal((+pi^(-2^-3)),1/(+pi^(+1/+8)))",1.0),
1042 test_t("equal((-pi^+2^+3),(-pi^+8))",1.0),
1043 test_t("equal((-pi^(2^3)),(-pi^+8))",1.0),
1044 test_t("equal(-pi^+2^+3--pi^+8,0)",1.0),
1045 test_t("equal((+2*-pi^+2^+3),2*(-pi^+8))",1.0),
1046 test_t("equal((-pi^+2^+3*2),2*(-pi^+8))",1.0),
1047 test_t("equal((-pi^+2^+3/+2),(-pi^+8)/+2)",1.0),
1048 test_t("equal((-pi^+2.2^+3.3),(-pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1049 test_t("equal((-pi^(2.2^3.3)),(-pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1050 test_t("equal((+2.2*-pi^+2.2^+3.3),2.2*(-pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1051 test_t("equal((-pi^+2.2^+3.3*2),2*(-pi^+13.48946876053338489126547661922171945249366318331656582663329188))",1.0),
1052 test_t("equal((-pi^+2.2^+3.3/+2.2),(-pi^+13.48946876053338489126547661922171945249366318331656582663329188)/+2.2)",1.0),
1053 test_t("equal((-pi^-2^3),1/(-pi^+8))",1.0),
1054 test_t("equal((-pi^(-2^3)),1/(-pi^+8))",1.0),
1055 test_t("equal((-pi^2^-3),(-pi^(+1/+8)))",1.0),
1056 test_t("equal((-pi^(2^-3)),(-pi^(+1/+8)))",1.0),
1057 test_t("equal((-pi^-2^-3),1/(-pi^(+1/+8)))",1.0),
1058 test_t("equal((-pi^(-2^-3)),1/(-pi^(+1/+8)))",1.0),
1059 test_t("switch { case (1 <= 2) : 1; default: 1.12345; }",1.0),
1060 test_t("switch { case (1 > 2) : 0; case (1 <= 2) : 1; default: 1.12345; }",1.0),
1061 test_t("switch { case (1 <= 2) : switch { case (1 <= 2) : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1062 test_t("switch { case [1 <= 2] : 1; default: 1.12345; }",1.0),
1063 test_t("switch { case [1 > 2] : 0; case [1 <= 2] : 1; default: 1.12345; }",1.0),
1064 test_t("switch { case [1 <= 2] : switch { case [1 <= 2] : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1065 test_t("switch { case {1 <= 2} : 1; default: 1.12345; }",1.0),
1066 test_t("switch { case {1 > 2} : 0; case {1 <= 2} : 1; default: 1.12345; }",1.0),
1067 test_t("switch { case {1 <= 2} : switch { case {1 <= 2} : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1068 test_t("switch { case [(1 <= 2)] : {1}; default: 1.12345; }",1.0),
1069 test_t("switch { case ([1 > 2]) : [0]; case ([1 <= 2]) : 1; default: 1.12345; }",1.0),
1070 test_t("switch { case {(1 <= 2)} : switch { case ({1 <= 2}) : 1; default: 1.12345; }; default: 1.12345; }",1.0),
1071 test_t("switch { case 1 > 1 : 1; case 2 > 2 : 2; case 3 = 3 : 3; case 4 > 4 : 4; default : 5; }",3.0),
1072 test_t("repeat 1.1 + 2.2 until (1 < 2)",3.3),
1073 test_t("repeat (1.1 + 2.2) until (1 < 2)",3.3),
1074 test_t("repeat 1.1 + 2.2; until (1 < 2)",3.3),
1075 test_t("repeat (1.1 + 2.2); until (1 < 2)",3.3),
1076 test_t("repeat 1.1234; 1 < 2; 1.1 + 2.2 until (1 < 2)",3.3),
1077 test_t("repeat 1.1234; 1 < 2; (1.1 + 2.2) until (1 < 2)",3.3),
1078 test_t("repeat 1.1234; 1 < 2; 1.1 + 2.2; until (1 < 2)",3.3),
1079 test_t("repeat 1.1234; 1 < 2; (1.1 + 2.2); until (1 < 2)",3.3),
1080 test_t("[*] { case 1 < 2 : 1 / 2; case (1 < 3) : 2 / 2; case 1 < 4 : 3 / 2; case (1 < 5) : 4 / 2; }",2.0),
1081 test_t(" 0 ? 1 : 2",2.0),
1082 test_t(" 1 ? 3 : 4",3.0),
1083 test_t("(0 ? 1 : 2) == 2",1.0),
1084 test_t("(1 ? 3 : 4) == 3",1.0),
1085 test_t("[(0)] ? [(1)] : [(2)]",2.0),
1086 test_t("([(0)] ? [(1)] : [(2)]) == 2",1.0),
1087 test_t("([(1)] ? [(3)] : [(4)]) == 3",1.0),
1088 test_t("(1 < 2 ? 3 : 4) == 3",1.0),
1089 test_t("(1 > 2 ? 3 : 4) == 4",1.0),
1090 test_t("(1 < 2 ? 3 + 5 : 4) == 8",1.0),
1091 test_t("(1 > 2 ? 3 : 4 + 5) == 9",1.0),
1092 test_t("(2 < 3 + 3 ? 7 : 9) == 7",1.0),
1093 test_t("(1 + 1 < 3 ? 7 : 9) == 7",1.0),
1094 test_t("(1 + 1 < 3 + 3 ? 7 : 9) == 7",1.0),
1095 test_t("(2 > 3 + 3 ? 7 : 9) == 9",1.0),
1096 test_t("(1 + 1 > 3 ? 7 : 9) == 9",1.0),
1097 test_t("(1 + 1 > 3 + 3 ? 7 : 9) == 9",1.0),
1098 test_t("(2 < (3 + 3) ? 7 : 9) == 7",1.0),
1099 test_t("((1 + 1) < 3 ? 7 : 9) == 7",1.0),
1100 test_t("((1 + 1) < (3 + 3) ? 7 : 9) == 7",1.0),
1101 test_t("(min(1,2) ? 1 + 3 : 1 + 4) == 4",1.0),
1102 test_t("(min(0,1) ? 1 + 3 : 1 + 4) == 5",1.0),
1103 test_t("(if (1 < 2) 3;) == 3",1.0),
1104 test_t("(if (1 > 2) 3;) == null",1.0),
1105 test_t("(if (1 < 2) 3; else 4;) == 3",1.0),
1106 test_t("(if (1 > 2) 3; else 4;) == 4",1.0),
1107 test_t("if (1 < 2) 3; else {1+2; 4;} == 3",1.0),
1108 test_t("if (1 > 2) 3; else {1+2; 4;} == 4",1.0),
1109 test_t("(if (1 < 2) 3; else if (1 < 2) 4;) == 3",1.0),
1110 test_t("(if (1 > 2) 3; else if (1 < 2) 4;) == 4",1.0),
1111 test_t("(if (1 > 2) 3; else if (1 > 2) 4;) == null",1.0),
1112 test_t("if (1 < 2) 3; else if (1 < 2) {1+2; 4;} == 3",1.0),
1113 test_t("if (1 > 2) 3; else if (1 < 2) {1+2; 4;} == 4",1.0),
1114 test_t("if (1 > 2) 3; else if (1 > 2) {1+2; 4;} == null",1.0),
1115 test_t("if (1 < 2) { 1+2; 3;} == 3",1.0),
1116 test_t("if (1 > 2) { 1+2; 3;} == null",1.0),
1117 test_t("(if (1 < 2) { 1+2; 3;} else 4;) == 3",1.0),
1118 test_t("(if (1 > 2) { 1+2; 3;} else 4;) == 4",1.0),
1119 test_t("if (1 < 2) { 1+2; 3;} else {1+2; 4;} == 3",1.0),
1120 test_t("if (1 > 2) { 1+2; 3;} else {1+2; 4;} == 4",1.0),
1121 test_t("(if (1 < 2) { 1+2; 3;} else if (1 < 2) 4;) == 3",1.0),
1122 test_t("(if (1 > 2) { 1+2; 3;} else if (1 < 2) 4;) == 4",1.0),
1123 test_t("(if (1 > 2) { 1+2; 3;} else if (1 > 2) 4;) == null",1.0),
1124 test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 3",1.0),
1125 test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 4",1.0),
1126 test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) {1+2; 4;} == null",1.0)
1127};
1128
1129static const std::size_t global_test_list_size = sizeof(global_test_list) / sizeof(test_t);
1130
1131template <typename T>
1132inline bool not_equal_impl(const T& t1,
1133 const T& t2,
1134 const T& epsilon = 0.000000000001/*std::numeric_limits<T>::epsilon()*/)
1135{
1136 if (t1 != t1) return true;
1137 if (t2 != t2) return true;
1138 T diff = mpfr::abs(t1 - t2);
1139 T eps_norm = (mpfr::max(T(1),mpfr::max(mpfr::abs(t1),mpfr::abs(t2))) * epsilon);
1140 return diff > eps_norm;
1141}
1142
1143template <typename T>
1144inline bool not_equal(const T& t0, const T& t1,
1145 const T& epsilon = T(0.000000000001))
1146{
1147 return not_equal_impl(t0,t1,epsilon);
1148}
1149
1150template <typename T>
1151inline bool test_expression(const std::string& expression_string, const T& expected_result)
1152{
1153 exprtk::symbol_table<T> symbol_table;
1154 symbol_table.add_constants();
1155
1168
1169 symbol_table.add_function("poly01", poly01);
1170 symbol_table.add_function("poly02", poly02);
1171 symbol_table.add_function("poly03", poly03);
1172 symbol_table.add_function("poly04", poly04);
1173 symbol_table.add_function("poly05", poly05);
1174 symbol_table.add_function("poly06", poly06);
1175 symbol_table.add_function("poly07", poly07);
1176 symbol_table.add_function("poly08", poly08);
1177 symbol_table.add_function("poly09", poly09);
1178 symbol_table.add_function("poly10", poly10);
1179 symbol_table.add_function("poly11", poly11);
1180 symbol_table.add_function("poly12", poly12);
1181
1182 exprtk::expression<T> expression;
1183 expression.register_symbol_table(symbol_table);
1184
1185 {
1186 exprtk::parser<T> parser;
1187
1188 if (!parser.compile(expression_string,expression))
1189 {
1190 printf("test_expression() - Error: %s Expression: %s\n",
1191 parser.error().c_str(),
1192 expression_string.c_str());
1193
1194 return false;
1195 }
1196 }
1197
1199 {
1200 printf("test_expression() - Error: Expression did not compile to a constant! Expression: %s\n",
1201 expression_string.c_str());
1202
1203 return false;
1204 }
1205
1206 const T result = expression.value();
1207
1208 if (not_equal(result,expected_result))
1209 {
1210 printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1211 expression_string.c_str(),
1212 expected_result.toDouble(),
1213 result.toDouble());
1214
1215 return false;
1216 }
1217
1218 return true;
1219}
1220
1221template <typename T>
1222struct edge_cases {};
1223
1224template <>
1226{
1227 static inline std::vector<test_t> test_cases()
1228 {
1229 std::vector<test_t> cases;
1230 cases.push_back(test_t(" 2.2250738585072013831e-308", 2.2250738585072013831e-308));
1231 cases.push_back(test_t(" 1.7976931348623157081e+308", 1.7976931348623157081e+308));
1232 cases.push_back(test_t("+2.2250738585072013831e-308", +2.2250738585072013831e-308));
1233 cases.push_back(test_t("+1.7976931348623157081e+308", +1.7976931348623157081e+308));
1234 cases.push_back(test_t("-2.2250738585072013831e-308", -2.2250738585072013831e-308));
1235 cases.push_back(test_t("-1.7976931348623157081e+308", -1.7976931348623157081e+308));
1236
1237 return cases;
1238 }
1239};
1240
1241template <typename T>
1243{
1244 const std::size_t rounds = 10;
1245
1246 for (std::size_t r = 0; r < rounds; ++r)
1247 {
1248 bool result = true;
1249
1250 for (std::size_t i = 0; i < global_test_list_size; ++i)
1251 {
1252 if (!test_expression<T>(global_test_list[i].first,T(global_test_list[i].second)))
1253 {
1254 result = false;
1255 }
1256 }
1257
1258 if (!result)
1259 {
1260 return false;
1261 }
1262 }
1263
1264 {
1265 const std::vector<test_t> tests = edge_cases<T>::test_cases();
1266
1267 bool result = true;
1268
1269 for (std::size_t i = 0; i < tests.size(); ++i)
1270 {
1271 if (!test_expression<T>(tests[i].first,T(tests[i].second)))
1272 {
1273 result = false;
1274 }
1275 }
1276
1277 if (!result)
1278 {
1279 return false;
1280 }
1281 }
1282
1283 return true;
1284}
1285
1286template <typename T>
1288{
1289 test_xy(const std::string& e, const T& v0, const T& v1, const T& r)
1290 : expr(e)
1291 , x(v0)
1292 , y(v1)
1293 , result(r)
1294 {}
1295
1296 std::string expr;
1297 T x;
1298 T y;
1300};
1301
1302template <typename T>
1304{
1305 test_xyzw(const std::string& e, const T& v0, const T& v1, const T& v2, const T& v3, const T& r)
1306 : expr(e)
1307 , x(v0)
1308 , y(v1)
1309 , z(v2)
1310 , w(v3)
1311 , result(r)
1312 {}
1313
1314 std::string expr;
1315 T x;
1316 T y;
1317 T z;
1318 T w;
1320};
1321
1322template <typename T>
1324{
1325 {
1326 static const test_xy<T> test_list[] =
1327 {
1328 test_xy<T>("x + y" ,T(2.2),T(3.3),T(5.5 )),
1329 test_xy<T>("x - y" ,T(3.3),T(2.2),T(1.1 )),
1330 test_xy<T>("x * y" ,T(3.3),T(2.2),T(7.26 )),
1331 test_xy<T>("x / y" ,T(3.3),T(2.2),T(1.5 )),
1332 test_xy<T>("(x + y) * (x + y)" ,T(2.2),T(3.3),T(30.25)),
1333 test_xy<T>("(x + y) / (x + y)" ,T(2.2),T(3.3),T(1.0 )),
1334 test_xy<T>("x + y > x and x + y > y" ,T(2.2),T(3.3),T(1.0)),
1335 test_xy<T>("1 + (x + y)" ,T(2.2),T(3.3),T(6.5 )),
1336 test_xy<T>("(x + y) - 1" ,T(2.2),T(3.3),T(4.5 )),
1337 test_xy<T>("1 + (x + y) * 2" ,T(2.2),T(3.3),T(12.0 )),
1338 test_xy<T>("2 * (x + y) - 1" ,T(2.2),T(3.3),T(10.0 )),
1339 test_xy<T>("y + (x + 1)" ,T(2.2),T(3.3),T(6.5 )),
1340 test_xy<T>("(x + 1) + y" ,T(2.2),T(3.3),T(6.5 )),
1341 test_xy<T>("2 * x" ,T(2.2),T(0.0),T(4.4)),
1342 test_xy<T>("x * 2" ,T(2.2),T(0.0),T(4.4)),
1343 test_xy<T>("1.1 + x" ,T(2.2),T(0.0),T(3.3)),
1344 test_xy<T>("x + 1.1" ,T(2.2),T(0.0),T(3.3)),
1345 test_xy<T>("x - -1 " ,T(1.0),T(0.0),T(2)),
1346 test_xy<T>("x --1 " ,T(1.0),T(0.0),T(2)),
1347 test_xy<T>("x-- 1 " ,T(1.0),T(0.0),T(2)),
1348 test_xy<T>("x--1 " ,T(1.0),T(0.0),T(2)),
1349 test_xy<T>("x -- -1" ,T(1.0),T(0.0),T(0)),
1350 test_xy<T>("x + -1 " ,T(1.0),T(0.0),T(0)),
1351 test_xy<T>("x +-1 " ,T(1.0),T(0.0),T(0)),
1352 test_xy<T>("x+- 1 " ,T(1.0),T(0.0),T(0)),
1353 test_xy<T>("x+-1 " ,T(1.0),T(0.0),T(0)),
1354 test_xy<T>("x +- -1" ,T(1.0),T(0.0),T(2)),
1355 test_xy<T>("x + +1 " ,T(1.0),T(0.0),T(2)),
1356 test_xy<T>("x ++1 " ,T(1.0),T(0.0),T(2)),
1357 test_xy<T>("1 - -x " ,T(1.0),T(0.0),T(2)),
1358 test_xy<T>("1 --x " ,T(1.0),T(0.0),T(2)),
1359 test_xy<T>("1-- x " ,T(1.0),T(0.0),T(2)),
1360 test_xy<T>("1--x " ,T(1.0),T(0.0),T(2)),
1361 test_xy<T>("1 -- -x" ,T(1.0),T(0.0),T(0)),
1362 test_xy<T>("1 + -x " ,T(1.0),T(0.0),T(0)),
1363 test_xy<T>("1 +-x " ,T(1.0),T(0.0),T(0)),
1364 test_xy<T>("1+- x " ,T(1.0),T(0.0),T(0)),
1365 test_xy<T>("1+-x " ,T(1.0),T(0.0),T(0)),
1366 test_xy<T>("1 +- -x" ,T(1.0),T(0.0),T(2)),
1367 test_xy<T>("1 + +x " ,T(1.0),T(0.0),T(2)),
1368 test_xy<T>("1 ++x " ,T(1.0),T(0.0),T(2)),
1369 test_xy<T>("(x - -1 + 1)" ,T(1.0),T(0.0),T(3)),
1370 test_xy<T>("(x --1 + 1)" ,T(1.0),T(0.0),T(3)),
1371 test_xy<T>("(x-- 1 + 1)" ,T(1.0),T(0.0),T(3)),
1372 test_xy<T>("(x--1 + 1)" ,T(1.0),T(0.0),T(3)),
1373 test_xy<T>("(x -- -1 + 1)" ,T(1.0),T(0.0),T(1)),
1374 test_xy<T>("(x + -1 + 1)" ,T(1.0),T(0.0),T(1)),
1375 test_xy<T>("(x +-1 + 1)" ,T(1.0),T(0.0),T(1)),
1376 test_xy<T>("(x+- 1 + 1)" ,T(1.0),T(0.0),T(1)),
1377 test_xy<T>("(x+-1 + 1)" ,T(1.0),T(0.0),T(1)),
1378 test_xy<T>("(x +- -1 + 1)" ,T(1.0),T(0.0),T(3)),
1379 test_xy<T>("(x + +1 + 1)" ,T(1.0),T(0.0),T(3)),
1380 test_xy<T>("(x ++1 + 1)" ,T(1.0),T(0.0),T(3)),
1381 test_xy<T>("(1 - -x + 1)" ,T(1.0),T(0.0),T(3)),
1382 test_xy<T>("(1 --x + 1)" ,T(1.0),T(0.0),T(3)),
1383 test_xy<T>("(1-- x + 1)" ,T(1.0),T(0.0),T(3)),
1384 test_xy<T>("(1--x + 1)" ,T(1.0),T(0.0),T(3)),
1385 test_xy<T>("(1 -- -x + 1)" ,T(1.0),T(0.0),T(1)),
1386 test_xy<T>("(1 + -x + 1)" ,T(1.0),T(0.0),T(1)),
1387 test_xy<T>("(1 +-x + 1)" ,T(1.0),T(0.0),T(1)),
1388 test_xy<T>("(1+- x + 1)" ,T(1.0),T(0.0),T(1)),
1389 test_xy<T>("(1+-x + 1)" ,T(1.0),T(0.0),T(1)),
1390 test_xy<T>("(1 +- -x + 1)" ,T(1.0),T(0.0),T(3)),
1391 test_xy<T>("(1 + +x + 1)" ,T(1.0),T(0.0),T(3)),
1392 test_xy<T>("(1 ++x + 1)" ,T(1.0),T(0.0),T(3)),
1393 test_xy<T>("(x - -1 - 1)" ,T(1.0),T(0.0),T(1)),
1394 test_xy<T>("(x --1 - 1)" ,T(1.0),T(0.0),T(1)),
1395 test_xy<T>("(x-- 1 - 1)" ,T(1.0),T(0.0),T(1)),
1396 test_xy<T>("(x--1 - 1)" ,T(1.0),T(0.0),T(1)),
1397 test_xy<T>("(x -- -1 - 1)" ,T(1.0),T(0.0),T(-1)),
1398 test_xy<T>("(x + -1 - 1)" ,T(1.0),T(0.0),T(-1)),
1399 test_xy<T>("(x +-1 - 1)" ,T(1.0),T(0.0),T(-1)),
1400 test_xy<T>("(x+- 1 - 1)" ,T(1.0),T(0.0),T(-1)),
1401 test_xy<T>("(x+-1 - 1)" ,T(1.0),T(0.0),T(-1)),
1402 test_xy<T>("(x +- -1 - 1)" ,T(1.0),T(0.0),T(1)),
1403 test_xy<T>("(x + +1 - 1)" ,T(1.0),T(0.0),T(1)),
1404 test_xy<T>("(x ++1 - 1)" ,T(1.0),T(0.0),T(1)),
1405 test_xy<T>("(1 - -x - 1)" ,T(1.0),T(0.0),T(1)),
1406 test_xy<T>("(1 --x - 1)" ,T(1.0),T(0.0),T(1)),
1407 test_xy<T>("(1-- x - 1)" ,T(1.0),T(0.0),T(1)),
1408 test_xy<T>("(1--x - 1)" ,T(1.0),T(0.0),T(1)),
1409 test_xy<T>("(1 -- -x - 1)" ,T(1.0),T(0.0),T(-1)),
1410 test_xy<T>("(1 + -x - 1)" ,T(1.0),T(0.0),T(-1)),
1411 test_xy<T>("(1 +-x - 1)" ,T(1.0),T(0.0),T(-1)),
1412 test_xy<T>("(1+- x - 1)" ,T(1.0),T(0.0),T(-1)),
1413 test_xy<T>("(1+-x - 1)" ,T(1.0),T(0.0),T(-1)),
1414 test_xy<T>("(1 +- -x - 1)" ,T(1.0),T(0.0),T(1)),
1415 test_xy<T>("(1 + +x - 1)" ,T(1.0),T(0.0),T(1)),
1416 test_xy<T>("(1 ++x - 1)" ,T(1.0),T(0.0),T(1)),
1417 test_xy<T>("x * 1 == x" ,T(2.0),T(3.0),T(1.0)),
1418 test_xy<T>("1 * x == x" ,T(2.0),T(3.0),T(1.0)),
1419 test_xy<T>("y * 1 == y" ,T(2.0),T(3.0),T(1.0)),
1420 test_xy<T>("1 * y == y" ,T(2.0),T(3.0),T(1.0)),
1421 test_xy<T>("x * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
1422 test_xy<T>("0 * x == 0" ,T(2.0),T(3.0),T(1.0)),
1423 test_xy<T>("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
1424 test_xy<T>("0 * y == 0" ,T(2.0),T(3.0),T(1.0)),
1425 test_xy<T>("x + 1 == 1 + x" ,T(2.0),T(3.0),T(1.0)),
1426 test_xy<T>("y + 1 == 1 + y" ,T(2.0),T(3.0),T(1.0)),
1427 test_xy<T>("x + y == y + x" ,T(2.0),T(3.0),T(1.0)),
1428 test_xy<T>("x * y == y * x" ,T(2.0),T(3.0),T(1.0)),
1429 test_xy<T>("x < y" ,T(2.0),T(3.0),T(1.0)),
1430 test_xy<T>("y > x" ,T(2.0),T(3.0),T(1.0)),
1431 test_xy<T>("x <= y" ,T(2.0),T(3.0),T(1.0)),
1432 test_xy<T>("y >= x" ,T(2.0),T(3.0),T(1.0)),
1433 test_xy<T>("x + y > y" ,T(2.0),T(3.0),T(1.0)),
1434 test_xy<T>("x + y > x" ,T(2.0),T(3.0),T(1.0)),
1435 test_xy<T>("x * y > y" ,T(2.0),T(3.0),T(1.0)),
1436 test_xy<T>("x * y > x" ,T(2.0),T(3.0),T(1.0)),
1437 test_xy<T>("(x + y) > y" ,T(2.0),T(3.0),T(1.0)),
1438 test_xy<T>("(x + y) > x" ,T(2.0),T(3.0),T(1.0)),
1439 test_xy<T>("(x * y) > y" ,T(2.0),T(3.0),T(1.0)),
1440 test_xy<T>("(x * y) > x" ,T(2.0),T(3.0),T(1.0)),
1441 test_xy<T>("(2x + 3y) == (2*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
1442 test_xy<T>("2(x + y) == (2*x + 2*y)" ,T(2.0),T(3.0),T(1.0)),
1443 test_xy<T>(" (x + y)3 == (3*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
1444 test_xy<T>("2x + 3y == 2*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
1445 test_xy<T>("2(x + y) == 2*x + 2*y" ,T(2.0),T(3.0),T(1.0)),
1446 test_xy<T>(" (x + y)3 == 3*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
1447 test_xy<T>(" (x)y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1448 test_xy<T>(" x(y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1449 test_xy<T>(" (x) y == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1450 test_xy<T>(" x (y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1451 test_xy<T>(" ((x) y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1452 test_xy<T>(" (x (y)) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1453 test_xy<T>(" (x)3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1454 test_xy<T>(" x(3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1455 test_xy<T>(" (x) 3 == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1456 test_xy<T>(" x (3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1457 test_xy<T>(" ((x) 3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1458 test_xy<T>(" (x (3)) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1459 test_xy<T>(" (2)y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1460 test_xy<T>(" 2(y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1461 test_xy<T>(" (2) y == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1462 test_xy<T>(" 2 (y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1463 test_xy<T>(" ((2) y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1464 test_xy<T>(" (2 (y)) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1465 test_xy<T>("var a := 2; (a)(3) == 6" ,T(2.0),T(3.0),T(1.0)),
1466 test_xy<T>("var a := 2; (A){3} == 6" ,T(2.0),T(3.0),T(1.0)),
1467 test_xy<T>("var a := 2; (a)[3] == 6" ,T(2.0),T(3.0),T(1.0)),
1468 test_xy<T>("var a := 2; {a}(3) == 6" ,T(2.0),T(3.0),T(1.0)),
1469 test_xy<T>("var a := 2; {a}{3} == 6" ,T(2.0),T(3.0),T(1.0)),
1470 test_xy<T>("var a := 2; {a}[3] == 6" ,T(2.0),T(3.0),T(1.0)),
1471 test_xy<T>("var a := 2; var b := 3; (a)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1472 test_xy<T>("var a := 2; var b := 3; (a){B} == 6" ,T(2.0),T(3.0),T(1.0)),
1473 test_xy<T>("var a := 2; var b := 3; (a)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1474 test_xy<T>("var a := 2; var b := 3; {a}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1475 test_xy<T>("var a := 2; var b := 3; {a}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
1476 test_xy<T>("var a := 2; var b := 3; {a}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1477 test_xy<T>("var a := 2; (a)(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
1478 test_xy<T>("var a := 2; (a){a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
1479 test_xy<T>("var a := 2; (a)[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
1480 test_xy<T>("var a := 2; {a}(a+1) == 6" ,T(2.0),T(3.0),T(1.0)),
1481 test_xy<T>("var a := 2; {a}{a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
1482 test_xy<T>("var a := 2; {a}[a+1] == 6" ,T(2.0),T(3.0),T(1.0)),
1483 test_xy<T>("var a := 2; var b := 3; (b-1)(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1484 test_xy<T>("var a := 2; var b := 3; (b-1){b} == 6" ,T(2.0),T(3.0),T(1.0)),
1485 test_xy<T>("var a := 2; var b := 3; (b-1)[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1486 test_xy<T>("var a := 2; var b := 3; {b-1}(b) == 6" ,T(2.0),T(3.0),T(1.0)),
1487 test_xy<T>("var a := 2; var b := 3; {b-1}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
1488 test_xy<T>("var a := 2; var b := 3; {b-1}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1489 test_xy<T>("abs(x^2.2^1.1 - 17.15193942371376191362472354210675542022)" ,T("3.3"),T("0.0"),T("0.0")),
1490 test_xy<T>("equal(x^2.2^1.1,17.15193942371376191362472354210675542022)" ,T("3.3"),T("0.0"),T("1.0")),
1491 test_xy<T>("equal(3.3^x^1.1,17.15193942371376191362472354210675542022)" ,T("2.2"),T("0.0"),T("1.0")),
1492 test_xy<T>("equal(3.3^2.2^x,17.15193942371376191362472354210675542022)" ,T("1.1"),T("0.0"),T("1.0")),
1493 test_xy<T>("equal(x^2.2^y,17.15193942371376191362472354210675542022) " ,T("3.3"),T("1.1"),T("1.0")),
1494 test_xy<T>("equal(x^y^1.1,17.15193942371376191362472354210675542022) " ,T("3.3"),T("2.2"),T("1.0")),
1495 test_xy<T>("equal(3.3^x^y,17.15193942371376191362472354210675542022) " ,T("2.2"),T("1.1"),T("1.0")),
1496 test_xy<T>("equal(x+y^3/7,x+(y*y*y)/7)",T(2.0),T(3.0),T(1.0)),
1497 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)),
1498 test_xy<T>("equal( x^0,1)",T(12.34),T(0.0),T(1.0)),
1499 test_xy<T>("equal( x^1,x)",T(12.34),T(0.0),T(1.0)),
1500 test_xy<T>("equal( x^2,x*x)",T(12.34),T(0.0),T(1.0)),
1501 test_xy<T>("equal( x^3,x*x*x)",T(12.34),T(0.0),T(1.0)),
1502 test_xy<T>("equal( x^4,x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1503 test_xy<T>("equal( x^5,x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1504 test_xy<T>("equal( x^6,x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1505 test_xy<T>("equal( x^7,x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1506 test_xy<T>("equal( x^8,x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1507 test_xy<T>("equal( x^9,x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1508 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)),
1509 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)),
1510 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)),
1511 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)),
1512 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)),
1513 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)),
1514 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)),
1515 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)),
1516 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)),
1517 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)),
1518 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)),
1519 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)),
1520 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)),
1521 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)),
1522 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)),
1523 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)),
1524 test_xy<T>("equal( y^0,1)",T(0.0),T(12.34),T(1.0)),
1525 test_xy<T>("equal( y^1,y)",T(0.0),T(12.34),T(1.0)),
1526 test_xy<T>("equal( y^2,y*y)",T(0.0),T(12.34),T(1.0)),
1527 test_xy<T>("equal( y^3,y*y*y)",T(0.0),T(12.34),T(1.0)),
1528 test_xy<T>("equal( y^4,y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1529 test_xy<T>("equal( y^5,y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1530 test_xy<T>("equal( y^6,y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1531 test_xy<T>("equal( y^7,y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1532 test_xy<T>("equal( y^8,y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1533 test_xy<T>("equal( y^9,y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1534 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)),
1535 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)),
1536 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)),
1537 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)),
1538 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)),
1539 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)),
1540 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)),
1541 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)),
1542 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)),
1543 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)),
1544 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)),
1545 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)),
1546 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)),
1547 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)),
1548 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)),
1549 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)),
1550 test_xy<T>("equal( x^-0,1/1)",T(12.34),T(0.0),T(1.0)),
1551 test_xy<T>("equal( x^-1,1/(x))",T(12.34),T(0.0),T(1.0)),
1552 test_xy<T>("equal( x^-2,1/(x*x))",T(12.34),T(0.0),T(1.0)),
1553 test_xy<T>("equal( x^-3,1/(x*x*x))",T(12.34),T(0.0),T(1.0)),
1554 test_xy<T>("equal( x^-4,1/(x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1555 test_xy<T>("equal( x^-5,1/(x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1556 test_xy<T>("equal( x^-6,1/(x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1557 test_xy<T>("equal( x^-7,1/(x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1558 test_xy<T>("equal( x^-8,1/(x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1559 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)),
1560 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)),
1561 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)),
1562 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)),
1563 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)),
1564 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)),
1565 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)),
1566 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)),
1567 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)),
1568 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)),
1569 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)),
1570 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)),
1571 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)),
1572 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)),
1573 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)),
1574 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)),
1575 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)),
1576 test_xy<T>("equal( y^-0,1/1)",T(0.0),T(12.34),T(1.0)),
1577 test_xy<T>("equal( y^-1,1/(y))",T(0.0),T(12.34),T(1.0)),
1578 test_xy<T>("equal( y^-2,1/(y*y))",T(0.0),T(12.34),T(1.0)),
1579 test_xy<T>("equal( y^-3,1/(y*y*y))",T(0.0),T(12.34),T(1.0)),
1580 test_xy<T>("equal( y^-4,1/(y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1581 test_xy<T>("equal( y^-5,1/(y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1582 test_xy<T>("equal( y^-6,1/(y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1583 test_xy<T>("equal( y^-7,1/(y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1584 test_xy<T>("equal( y^-8,1/(y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1585 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)),
1586 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)),
1587 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)),
1588 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)),
1589 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)),
1590 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)),
1591 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)),
1592 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)),
1593 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)),
1594 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)),
1595 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)),
1596 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)),
1597 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)),
1598 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)),
1599 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)),
1600 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)),
1601 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)),
1602 test_xy<T>("(2 + x) + 7",T(3.0),T(0.0),T((2.0 + 3.0) + 7.0)),
1603 test_xy<T>("(2 + x) - 7",T(3.0),T(0.0),T((2.0 + 3.0) - 7.0)),
1604 test_xy<T>("(2 - x) + 7",T(3.0),T(0.0),T((2.0 - 3.0) + 7.0)),
1605 test_xy<T>("(2 - x) - 7",T(3.0),T(0.0),T((2.0 - 3.0) - 7.0)),
1606 test_xy<T>("(2 * x) * 7",T(3.0),T(0.0),T((2.0 * 3.0) * 7.0)),
1607 test_xy<T>("(2 * x) / 7",T(3.0),T(0.0),T((2.0 * 3.0) / 7.0)),
1608 test_xy<T>("(2 / x) * 7",T(3.0),T(0.0),T((2.0 / 3.0) * 7.0)),
1609 test_xy<T>("(2 / x) / 7",T(3.0),T(0.0),T((2.0 / 3.0) / 7.0)),
1610 test_xy<T>("2 + (x + 7)",T(3.0),T(0.0),T(2.0 + (3.0 + 7.0))),
1611 test_xy<T>("2 + (x - 7)",T(3.0),T(0.0),T(2.0 + (3.0 - 7.0))),
1612 test_xy<T>("2 - (x + 7)",T(3.0),T(0.0),T(2.0 - (3.0 + 7.0))),
1613 test_xy<T>("2 - (x - 7)",T(3.0),T(0.0),T(2.0 - (3.0 - 7.0))),
1614 test_xy<T>("2 * (x * 7)",T(3.0),T(0.0),T(2.0 * (3.0 * 7.0))),
1615 test_xy<T>("2 * (x / 7)",T(3.0),T(0.0),T(2.0 * (3.0 / 7.0))),
1616 test_xy<T>("2 / (x * 7)",T(3.0),T(0.0),T(2.0 / (3.0 * 7.0))),
1617 test_xy<T>("2 / (x / 7)",T(3.0),T(0.0),T(2.0 / (3.0 / 7.0))),
1618 test_xy<T>("2 + (7 + x)",T(3.0),T(0.0),T(2.0 + (7.0 + 3.0))),
1619 test_xy<T>("2 + (7 - x)",T(3.0),T(0.0),T(2.0 + (7.0 - 3.0))),
1620 test_xy<T>("2 - (7 + x)",T(3.0),T(0.0),T(2.0 - (7.0 + 3.0))),
1621 test_xy<T>("2 - (7 - x)",T(3.0),T(0.0),T(2.0 - (7.0 - 3.0))),
1622 test_xy<T>("2 * (7 * x)",T(3.0),T(0.0),T(2.0 * (7.0 * 3.0))),
1623 test_xy<T>("2 * (7 / x)",T(3.0),T(0.0),T(2.0 * (7.0 / 3.0))),
1624 test_xy<T>("2 / (7 * x)",T(3.0),T(0.0),T(2.0 / (7.0 * 3.0))),
1625 test_xy<T>("2 / (7 / x)",T(3.0),T(0.0),T(2.0 / (7.0 / 3.0))),
1626 test_xy<T>("(x + 2) + 7",T(3.0),T(0.0),T((3.0 + 2.0) + 7.0)),
1627 test_xy<T>("(x + 2) - 7",T(3.0),T(0.0),T((3.0 + 2.0) - 7.0)),
1628 test_xy<T>("(x - 2) + 7",T(3.0),T(0.0),T((3.0 - 2.0) + 7.0)),
1629 test_xy<T>("(x - 2) - 7",T(3.0),T(0.0),T((3.0 - 2.0) - 7.0)),
1630 test_xy<T>("(x * 2) * 7",T(3.0),T(0.0),T((3.0 * 2.0) * 7.0)),
1631 test_xy<T>("(x * 2) / 7",T(3.0),T(0.0),T((3.0 * 2.0) / 7.0)),
1632 test_xy<T>("(x / 2) * 7",T(3.0),T(0.0),T((3.0 / 2.0) * 7.0)),
1633 test_xy<T>("(x / 2) / 7",T(3.0),T(0.0),T((3.0 / 2.0) / 7.0)),
1634 test_xy<T>("((2 + x) + (3 + y))",T(7.0),T(9.0),T(((2.0 + 7.0) + (3.0 + 9.0)))),
1635 test_xy<T>("((2 + x) - (3 + y))",T(7.0),T(9.0),T(((2.0 + 7.0) - (3.0 + 9.0)))),
1636 test_xy<T>("((2 - x) - (3 - y))",T(7.0),T(9.0),T(((2.0 - 7.0) - (3.0 - 9.0)))),
1637 test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1638 test_xy<T>("((x + 2) + (y + 3))",T(7.0),T(9.0),T(((7.0 + 2.0) + (9.0 + 3.0)))),
1639 test_xy<T>("((x + 2) - (y + 3))",T(7.0),T(9.0),T(((7.0 + 2.0) - (9.0 + 3.0)))),
1640 test_xy<T>("((x - 2) - (y - 3))",T(7.0),T(9.0),T(((7.0 - 2.0) - (9.0 - 3.0)))),
1641 test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1642 test_xy<T>("((2 + x) + (y + 3))",T(7.0),T(9.0),T(((2.0 + 7.0) + (9.0 + 3.0)))),
1643 test_xy<T>("((2 + x) - (y + 3))",T(7.0),T(9.0),T(((2.0 + 7.0) - (9.0 + 3.0)))),
1644 test_xy<T>("((2 - x) - (y - 3))",T(7.0),T(9.0),T(((2.0 - 7.0) - (9.0 - 3.0)))),
1645 test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1646 test_xy<T>("((x + 2) + (3 + y))",T(7.0),T(9.0),T(((7.0 + 2.0) + (3.0 + 9.0)))),
1647 test_xy<T>("((x + 2) - (3 + y))",T(7.0),T(9.0),T(((7.0 + 2.0) - (3.0 + 9.0)))),
1648 test_xy<T>("((x - 2) - (3 - y))",T(7.0),T(9.0),T(((7.0 - 2.0) - (3.0 - 9.0)))),
1649 test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.0)))),
1650 test_xy<T>("((2 * x) / (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) / (3.0 * 9.0)))),
1651 test_xy<T>("((2 / x) * (3 / y))",T(7.0),T(9.0),T(((2.0 / 7.0) * (3.0 / 9.0)))),
1652 test_xy<T>("((2 * x) / (3 / y))",T(7.0),T(9.0),T(((2.0 * 7.0) / (3.0 / 9.0)))),
1653 test_xy<T>("((2 / x) / (3 * y))",T(7.0),T(9.0),T(((2.0 / 7.0) / (3.0 * 9.0)))),
1654 test_xy<T>("((x * 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 * 2.0) / (9.0 * 3.0)))),
1655 test_xy<T>("((x / 2) * (y / 3))",T(7.0),T(9.0),T(((7.0 / 2.0) * (9.0 / 3.0)))),
1656 test_xy<T>("((x * 2) / (y / 3))",T(7.0),T(9.0),T(((7.0 * 2.0) / (9.0 / 3.0)))),
1657 test_xy<T>("((x / 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 / 2.0) / (9.0 * 3.0)))),
1658 test_xy<T>("((2 * x) / (y * 3))",T(7.0),T(9.0),T(((2.0 * 7.0) / (9.0 * 3.0)))),
1659 test_xy<T>("((2 / x) * (y / 3))",T(7.0),T(9.0),T(((2.0 / 7.0) * (9.0 / 3.0)))),
1660 test_xy<T>("((2 * x) / (y / 3))",T(7.0),T(9.0),T(((2.0 * 7.0) / (9.0 / 3.0)))),
1661 test_xy<T>("((2 / x) / (y * 3))",T(7.0),T(9.0),T(((2.0 / 7.0) / (9.0 * 3.0)))),
1662 test_xy<T>("((x * 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 * 2.0) / (3.0 * 9.0)))),
1663 test_xy<T>("((x / 2) * (3 / y))",T(7.0),T(9.0),T(((7.0 / 2.0) * (3.0 / 9.0)))),
1664 test_xy<T>("((x * 2) / (3 / y))",T(7.0),T(9.0),T(((7.0 * 2.0) / (3.0 / 9.0)))),
1665 test_xy<T>("((x / 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 / 2.0) / (3.0 * 9.0)))),
1666 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))),
1667 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))),
1668 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))),
1669 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))),
1670 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))),
1671 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))),
1672 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))),
1673 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))),
1674 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))),
1675 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))),
1676 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))),
1677 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))),
1678 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))),
1679 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))),
1680 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))),
1681 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))),
1682 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))))),
1683 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))))),
1684 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))))),
1685 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))))),
1686 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))))),
1687 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))))),
1688 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))))),
1689 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))))),
1690 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))))),
1691 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))))),
1692 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))))),
1693 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))))),
1694 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))))),
1695 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))))),
1696 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))))),
1697 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))))),
1698 test_xy<T>("((2 * x) + (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) + (2.0 * 9.0)))),
1699 test_xy<T>("((2 * x) - (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) - (2.0 * 9.0)))),
1700 test_xy<T>("((2 * x) + (y * 2))",T(7.0),T(9.0),T(((2.0 * 7.0) + (9.0 * 2.0)))),
1701 test_xy<T>("((x * 2) - (y * 2))",T(7.0),T(9.0),T(((7.0 * 2.0) - (9.0 * 2.0)))),
1702 test_xy<T>("0 * (abs (x) + acos (y) + asin (x) + atan (y))",T(1.0),T(1.0),T(0.0)),
1703 test_xy<T>("0 * (ceil (x) + cos (y) + cosh (x) + exp (y))",T(1.0),T(1.0),T(0.0)),
1704 test_xy<T>("0 * (floor(x) + log (y) + log10(x) + round(y))",T(1.0),T(1.0),T(0.0)),
1705 test_xy<T>("0 * (sin (x) + sinh (y) + sqrt (x) + tan (y))",T(1.0),T(1.0),T(0.0)),
1706 test_xy<T>("0 * (sec (x) + csc (y) + tanh (x) + cot (y))",T(1.0),T(1.0),T(0.0)),
1707 test_xy<T>("0 * (erf (x) + erfc (y) + sgn (y) + frac (y))",T(1.0),T(1.0),T(0.0)),
1708 test_xy<T>("0 * (log1p(x) + expm1(y) + acosh(x) + asinh(y))",T(1.0),T(1.0),T(0.0)),
1709 test_xy<T>("0 * (deg2grad(x) + grad2deg(y) + rad2deg(x) + deg2rad(y))",T(1.0),T(1.0),T(0.0)),
1710 test_xy<T>("switch { case (x <= y) : (y - x); default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1711 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)),
1712 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)),
1713 test_xy<T>("switch { case [x <= y] : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1714 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)),
1715 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)),
1716 test_xy<T>("switch { case {x <= y} : x; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1717 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)),
1718 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)),
1719 test_xy<T>("switch { case [(x <= y)] : {y - x}; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1720 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)),
1721 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)),
1722 test_xy<T>("[*]{ case x < y : x + y; case y < x : y - x; }",T(2.0),T(3.0),T(5.0)),
1723 test_xy<T>("[*]{ case x > y : x + y; case y > x : y - x; }",T(2.0),T(3.0),T(1.0)),
1724 test_xy<T>("[*]{ case x > y : x - y; case y < x : y + x; }",T(2.0),T(3.0),T(0.0)),
1725 test_xy<T>("0 ? x : y" ,T(1.0),T(2.0),T( 2.0)),
1726 test_xy<T>("1 ? x : y" ,T(1.0),T(2.0),T( 1.0)),
1727 test_xy<T>("x ? x : y" ,T(1.0),T(2.0),T( 1.0)),
1728 test_xy<T>("x ? x : y" ,T(0.0),T(2.0),T( 2.0)),
1729 test_xy<T>("(x + y < 4) ? 1 : 2" ,T(1.0),T(2.0),T( 1.0)),
1730 test_xy<T>("(x + y > 4) ? 1 : 2" ,T(1.0),T(2.0),T( 2.0)),
1731 test_xy<T>("x < y ? x + y : x - y" ,T(1.0),T(2.0),T( 3.0)),
1732 test_xy<T>("x > y ? x + y : x - y" ,T(1.0),T(2.0),T(-1.0)),
1733 test_xy<T>("(x + x < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1734 test_xy<T>("(x + x < y + y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1735 test_xy<T>("(x > y + y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1736 test_xy<T>("(x + x > y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1737 test_xy<T>("(x + x > y + 3 ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1738 test_xy<T>("(x < (y + y) ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1739 test_xy<T>("((x + x) < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1740 test_xy<T>("((x + x) < (y + y) ? 7 : 9) == 7",T(1.0),T(3.0),T( 1.0)),
1741 test_xy<T>("(x += 2 ) == 3 " ,T(1),T(3),T(1)),
1742 test_xy<T>("(x += 2y) == 7 " ,T(1),T(3),T(1)),
1743 test_xy<T>("(x -= 2 ) == -1 " ,T(1),T(3),T(1)),
1744 test_xy<T>("(x -= 2y) == -5 " ,T(1),T(3),T(1)),
1745 test_xy<T>("(x *= 2 ) == 2 " ,T(1),T(3),T(1)),
1746 test_xy<T>("(x *= 2y) == 6 " ,T(1),T(3),T(1)),
1747 test_xy<T>("(x /= 2 ) == (1/2)" ,T(1),T(3),T(1)),
1748 test_xy<T>("(x /= 2y) == (1/6)" ,T(1),T(3),T(1)),
1749 test_xy<T>("for(var i := 0; (i < 10);) { i += 1; }; x;" ,T(1),T(20),T( 1)),
1750 test_xy<T>("for(var i := 0; (i < 10) and (i != y); i+=2) { x += i; }; x;" ,T(1),T(20),T(21)),
1751 test_xy<T>("for(var i := 0; (i < 10) and (i != y);) { x += i; i+=2; }; x;",T(1),T(20),T(21)),
1752 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)),
1753 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)),
1754 test_xy<T>("var a := 2; (0 * a) == 0",T(0),T(0),T(1)),
1755 test_xy<T>("var a := 2; (0 / a) == 0",T(0),T(0),T(1)),
1756 test_xy<T>("var a := 2; (a * 0) == 0",T(0),T(0),T(1)),
1757 test_xy<T>("var a := 2; (a / 1) == a",T(0),T(0),T(1)),
1758 test_xy<T>("var a := 2; (0 + a) == a",T(0),T(0),T(1)),
1759 test_xy<T>("var a := 2; (a + 0) == a",T(0),T(0),T(1)),
1760 test_xy<T>("var a := 2; (1 * a) == a",T(0),T(0),T(1)),
1761 test_xy<T>("var a.b := 3; (2 * a.b ) == 6",T(0),T(0),T(1)),
1762 test_xy<T>("var aa.bb := 3; (2 * aa.bb ) == 6",T(0),T(0),T(1)),
1763 test_xy<T>("var aaa.bbb := 3; (2 * aAa.BbB) == 6",T(0),T(0),T(1)),
1764 test_xy<T>("var a1.b2 := 3; (2 * a1.b2 ) == 6",T(0),T(0),T(1))
1765 };
1766
1767 static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xy<T>);
1768
1769 const std::size_t rounds = 60;
1770
1771 for (std::size_t r = 0; r < rounds; ++r)
1772 {
1773 bool loop_result = true;
1774
1775 for (std::size_t i = 0; i < test_list_size; ++i)
1776 {
1777 test_xy<T>& test = const_cast<test_xy<T>&>(test_list[i]);
1778
1779 T x = test.x;
1780 T y = test.y;
1781
1782 exprtk::symbol_table<T> symbol_table;
1783 symbol_table.add_variable("x",x);
1784 symbol_table.add_variable("y",y);
1785
1786 exprtk::expression<T> expression;
1787 expression.register_symbol_table(symbol_table);
1788
1789 {
1790 exprtk::parser<T> parser;
1791
1792 if (!parser.compile(test.expr,expression))
1793 {
1794 printf("run_test01() - Error: %s Expression: %s\n",
1795 parser.error().c_str(),
1796 test.expr.c_str());
1797
1798 loop_result = false;
1799
1800 continue;
1801 }
1802 }
1803
1804 const T result = expression.value();
1805
1806 if (not_equal(result,test.result))
1807 {
1808 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %25.20f\tResult: %25.20f\n",
1809 test.expr.c_str(),
1810 test.result.toDouble(),
1811 result.toDouble());
1812
1813 loop_result = false;
1814 }
1815 }
1816
1817 if (!loop_result)
1818 {
1819 return false;
1820 }
1821 }
1822 }
1823
1824 {
1825 static const test_xyzw<T> test_list[] =
1826 {
1827 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 ))),
1828 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 ))),
1829 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 ))),
1830 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 ))),
1831 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)))),
1832 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)))),
1833 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)))),
1834 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)))),
1835 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))),
1836 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))),
1837 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))),
1838 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))),
1839 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))),
1840 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))),
1841 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))),
1842 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))),
1843 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))),
1844 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))),
1845 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))),
1846 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))),
1847 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))),
1848 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))),
1849 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))),
1850 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))),
1851 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))))),
1852 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))))),
1853 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))))),
1854 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))))),
1855 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))))),
1856 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))))),
1857 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))))),
1858 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))))),
1859 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))))),
1860 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))))),
1861 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))))),
1862 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))))),
1863 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))))),
1864 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))))),
1865 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))))),
1866 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))))),
1867 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)),
1868 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)),
1869 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)),
1870 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)),
1871 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)),
1872 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)),
1873 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)),
1874 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)),
1875 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)),
1876 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)),
1877 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)),
1878 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))
1879 };
1880
1881 static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xyzw<T>);
1882
1883 const std::size_t rounds = 60;
1884
1885 for (std::size_t r = 0; r < rounds; ++r)
1886 {
1887 bool loop_result = true;
1888 for (std::size_t i = 0; i < test_list_size; ++i)
1889 {
1890 test_xyzw<T>& test = const_cast<test_xyzw<T>&>(test_list[i]);
1891
1892 exprtk::symbol_table<T> symbol_table;
1893 symbol_table.add_variable("x",test.x);
1894 symbol_table.add_variable("y",test.y);
1895 symbol_table.add_variable("z",test.z);
1896 symbol_table.add_variable("w",test.w);
1897
1898 exprtk::expression<T> expression;
1899 expression.register_symbol_table(symbol_table);
1900
1901 {
1902 exprtk::parser<T> parser;
1903
1904 if (!parser.compile(test.expr,expression))
1905 {
1906 printf("run_test01() - Error: %s Expression: %s\n",
1907 parser.error().c_str(),
1908 test.expr.c_str());
1909
1910 loop_result = false;
1911
1912 continue;
1913 }
1914 }
1915
1916 const T result = expression.value();
1917
1918 if (not_equal(result,test.result))
1919 {
1920 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1921 test.expr.c_str(),
1922 test.result.toDouble(),
1923 result.toDouble());
1924
1925 loop_result = false;
1926 }
1927 }
1928
1929 if (!loop_result)
1930 {
1931 return false;
1932 }
1933 }
1934 }
1935
1936 {
1937 const std::string expr_list[] =
1938 {
1939 "((v[1] + x) == (x + v[1]))",
1940 "((v[0] += x) == x)",
1941 "((v[0] += x + y) == (x + y))",
1942 "((v[0] -= x) == -x)",
1943 "((v[0] -= (x + y)) == -(x + y))",
1944 "((v[1] + v[2]) == (v[3 - 1] + v[2 * 1/2]))",
1945 "(v[v[1]] == v[1])",
1946 "(v[1] += v[1]) == v[1 + 1]",
1947 "((v[i[1]] + x) == (x + v[i[1]]))",
1948 "((v[i[0]] += x) == x)",
1949 "((v[i[0]] += x + y) == (x + y))",
1950 "((v[i[0]] -= x) == -x)",
1951 "((v[i[0]] -= (x + y)) == -(x + y))",
1952 "((v[i[1]] + v[2]) == (v[i[3] - i[1]] + v[i[2] * 1/2]))",
1953 "(v[v[i[1]]] == v[i[1]])",
1954 "(v[i[1]] += v[i[1]]) == v[i[1] + 1]"
1955 };
1956
1957 const std::size_t expr_list_size = sizeof(expr_list) / sizeof(std::string);
1958
1959 const std::size_t rounds = 60;
1960
1961 for (std::size_t r = 0; r < rounds; ++r)
1962 {
1963 bool loop_result = true;
1964
1965 for (std::size_t i = 0; i < expr_list_size; ++i)
1966 {
1967 T v[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
1968 T index[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
1969
1970 T x = T(6.6);
1971 T y = T(7.7);
1972 T z = T(8.8);
1973
1974 exprtk::symbol_table<T> symbol_table;
1975 symbol_table.add_variable("x",x);
1976 symbol_table.add_variable("y",y);
1977 symbol_table.add_variable("z",z);
1978 symbol_table.add_vector ("v",v);
1979 symbol_table.add_vector ("i",index);
1980
1981 exprtk::expression<T> expression;
1982 expression.register_symbol_table(symbol_table);
1983
1984 {
1985 exprtk::parser<T> parser;
1986
1987 if (!parser.compile(expr_list[i],expression))
1988 {
1989 printf("run_test01() - Error: %s Expression: %s\n",
1990 parser.error().c_str(),
1991 expr_list[i].c_str());
1992
1993 loop_result = false;
1994
1995 continue;
1996 }
1997 }
1998
1999 const T result = expression.value();
2000
2001 if (not_equal(result,T(1)))
2002 {
2003 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
2004 expr_list[i].c_str(),
2005 static_cast<double>(1.0),
2006 result.toDouble());
2007
2008 loop_result = false;
2009 }
2010 }
2011
2012 if (!loop_result)
2013 {
2014 return false;
2015 }
2016 }
2017
2018 for (std::size_t r = 0; r < rounds; ++r)
2019 {
2020 bool loop_result = true;
2021
2022 for (std::size_t i = 0; i < expr_list_size; ++i)
2023 {
2024 T v_[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
2025 T index_[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
2026
2027 T x = T(6.6);
2028 T y = T(7.7);
2029 T z = T(8.8);
2030
2033
2034 exprtk::symbol_table<T> symbol_table;
2035 symbol_table.add_variable("x",x);
2036 symbol_table.add_variable("y",y);
2037 symbol_table.add_variable("z",z);
2038 symbol_table.add_vector ("v",v);
2039 symbol_table.add_vector ("i",index);
2040
2041 exprtk::expression<T> expression;
2042 expression.register_symbol_table(symbol_table);
2043
2044 {
2045 exprtk::parser<T> parser;
2046
2047 if (!parser.compile(expr_list[i],expression))
2048 {
2049 printf("run_test01() - Error: %s Expression: %s\n",
2050 parser.error().c_str(),
2051 expr_list[i].c_str());
2052
2053 loop_result = false;
2054
2055 continue;
2056 }
2057 }
2058
2059 const T result = expression.value();
2060
2061 if (not_equal(result,T(1)))
2062 {
2063 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
2064 expr_list[i].c_str(),
2065 static_cast<double>(1.0),
2066 result.toDouble());
2067 loop_result = false;
2068 }
2069 }
2070
2071 if (!loop_result)
2072 {
2073 return false;
2074 }
2075 }
2076 }
2077
2078 return true;
2079}
2080
2081template <typename T>
2083{
2084 test_ab(const std::string& e, const std::string& v0, const std::string& v1, const T& r)
2085 : expr(e)
2086 , a(v0)
2087 , b(v1)
2088 , c("ccc")
2089 , result(r)
2090 {}
2091
2092 std::string expr;
2093 std::string a;
2094 std::string b;
2095 std::string c;
2097};
2098
2099template <typename T>
2101{
2102 static const test_ab<T> test_list[] =
2103 {
2104 test_ab<T>("'aaa' == 'aaa'" ,"","",T(1.0)),
2105 test_ab<T>("'aaa' < 'bbb'" ,"","",T(1.0)),
2106 test_ab<T>("'aaa' <= 'bbb'" ,"","",T(1.0)),
2107 test_ab<T>("'bbb' > 'aaa'" ,"","",T(1.0)),
2108 test_ab<T>("'bbb' >= 'aaa'" ,"","",T(1.0)),
2109 test_ab<T>("'aaa' != 'aaa'" ,"","",T(0.0)),
2110 test_ab<T>("'aaa' != 'bbb'" ,"","",T(1.0)),
2111 test_ab<T>("'aaa' + '123' == 'aaa123'" ,"","",T(1.0)),
2112 test_ab<T>("'aaa123' == 'aaa' + '123'" ,"","",T(1.0)),
2113 test_ab<T>("('aaa' + '123') == 'aaa123'" ,"","",T(1.0)),
2114 test_ab<T>("'aaa123' == ('aaa' + '123')" ,"","",T(1.0)),
2115 test_ab<T>("'aaa' in 'aaa123'" ,"","",T(1.0)),
2116 test_ab<T>("'123' in 'aaa123'" ,"","",T(1.0)),
2117 test_ab<T>("'a123b' like '*123*'" ,"","",T(1.0)),
2118 test_ab<T>("'a123b' like '*123?'" ,"","",T(1.0)),
2119 test_ab<T>("'1XYZ2' ilike '*xyz*'" ,"","",T(1.0)),
2120 test_ab<T>("'1XYZ2' ilike '*xyz?'" ,"","",T(1.0)),
2121 test_ab<T>("inrange('aaa','bbb','ccc')" ,"","",T(1.0)),
2122 test_ab<T>("a == b" ,"aaa","aaa",T(1.0)),
2123 test_ab<T>("a != b" ,"aaa","bbb",T(1.0)),
2124 test_ab<T>("a < b" ,"aaa","bbb",T(1.0)),
2125 test_ab<T>("a <= b" ,"aaa","bbb",T(1.0)),
2126 test_ab<T>("b > a" ,"aaa","bbb",T(1.0)),
2127 test_ab<T>("b >= a" ,"aaa","bbb",T(1.0)),
2128 test_ab<T>("a in b" ,"aaa","aaa123",T(1.0)),
2129 test_ab<T>("a in b" ,"123","aaa123",T(1.0)),
2130 test_ab<T>("a == 'aaa'" ,"aaa","aaa",T(1.0)),
2131 test_ab<T>("'aaa' == a" ,"aaa","aaa",T(1.0)),
2132 test_ab<T>("a != 'bbb'" ,"aaa","bbb",T(1.0)),
2133 test_ab<T>("'bbb' != a" ,"aaa","bbb",T(1.0)),
2134 test_ab<T>("a < 'bbb'" ,"aaa","bbb",T(1.0)),
2135 test_ab<T>("a <= 'bbb'" ,"aaa","bbb",T(1.0)),
2136 test_ab<T>("'bbb' > a" ,"aaa","bbb",T(1.0)),
2137 test_ab<T>("'bbb' >= a" ,"aaa","bbb",T(1.0)),
2138 test_ab<T>("a in 'aaa123'" ,"aaa","aaa123",T(1.0)),
2139 test_ab<T>("a in 'aaa123'" ,"123","aaa123",T(1.0)),
2140 test_ab<T>("'aaa' in b" ,"aaa","aaa123",T(1.0)),
2141 test_ab<T>("'123' in b" ,"aaa","aaa123",T(1.0)),
2142 test_ab<T>("(a < b) or (a == b)" ,"aaa","bbb",T(1.0)),
2143 test_ab<T>("(a == b) or (a < b)" ,"aaa","bbb",T(1.0)),
2144 test_ab<T>("(b > a) or (b == a)" ,"aaa","bbb",T(1.0)),
2145 test_ab<T>("(b == a) or (b > a)" ,"aaa","bbb",T(1.0)),
2146 test_ab<T>("(a < b) and (b > a)" ,"aaa","bbb",T(1.0)),
2147 test_ab<T>("a like '*123*'" ,"a123b","",T(1.0)),
2148 test_ab<T>("a like '*123?'" ,"a123b","",T(1.0)),
2149 test_ab<T>("'a123b' like b" ,"a123b","*123*",T(1.0)),
2150 test_ab<T>("'a123b' like b" ,"a123b","*123?",T(1.0)),
2151 test_ab<T>("a ilike '*xyz*'" ,"1XYZ2","",T(1.0)),
2152 test_ab<T>("a ilike '*xyz?'" ,"1XYZ2","",T(1.0)),
2153 test_ab<T>("'1XYZ2' ilike b" ,"","*xyz*",T(1.0)),
2154 test_ab<T>("'1XYZ2' ilike b" ,"","*xyz?",T(1.0)),
2155 test_ab<T>("inrange(a,'bbb',c)" ,"aaa","bbb",T(1.0)),
2156 test_ab<T>("inrange('aaa',b,'ccc')" ,"aaa","bbb",T(1.0)),
2157 test_ab<T>("inrange(a,b,c)" ,"aaa","bbb",T(1.0)),
2158 test_ab<T>("inrange(a,b,'ccc')" ,"aaa","bbb",T(1.0)),
2159 test_ab<T>("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
2160 test_ab<T>("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
2161 test_ab<T>("(a < b ? a : b) == a" ,"aaa","bbb",T(1.0)),
2162 test_ab<T>("(a > b ? a : b) == b" ,"aaa","bbb",T(1.0)),
2163 test_ab<T>("(a == (a + '1') ? a : b) == b" ,"aaa","bbb",T(1.0)),
2164 test_ab<T>("((a + '2') != a ? a : b) == a" ,"aaa","bbb",T(1.0)),
2165 test_ab<T>("(a < b ? a + '1' : b) == 'aaa1'","aaa","bbb",T(1.0)),
2166 test_ab<T>("(a > b ? a : b + '2') == 'bbb2'","aaa","bbb",T(1.0)),
2167 test_ab<T>("b == (a == (a + '1') ? a : b)" ,"aaa","bbb",T(1.0)),
2168 test_ab<T>("a == (a != (a + '2') ? a : b)" ,"aaa","bbb",T(1.0)),
2169 test_ab<T>("'aaa1' == (a < b ? a + '1' : b)","aaa","bbb",T(1.0)),
2170 test_ab<T>("'bbb2' == (a > b ? a : b + '2')","aaa","bbb",T(1.0)),
2171 test_ab<T>("(a < b ? a[1:3] : b) == '23'" ,"1234","67890",T(1.0)),
2172 test_ab<T>("(a > b ? a : b[0:4]) == '6789'" ,"1234","67890",T(1.0)),
2173 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x : y) == x }}","","",T(1.0)),
2174 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y) == y }}","","",T(1.0)),
2175 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x == (x + '1') ? x : y) == y }}","","",T(1.0)),
2176 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{((x + '2') != x ? x : y) == x }}","","",T(1.0)),
2177 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x + '1' : y) == 'xxx1'}}","","",T(1.0)),
2178 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y + '2') == 'yyy2'}}","","",T(1.0)),
2179 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{y == (x == (x + '1') ? x : y) }}","","",T(1.0)),
2180 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{x == (x != (x + '2') ? x : y) }}","","",T(1.0)),
2181 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'xxx1' == (x < y ? x + '1' : y)}}","","",T(1.0)),
2182 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'yyy2' == (x > y ? x : y + '2')}}","","",T(1.0)),
2183 test_ab<T>("'01234567890123456789'[0:9] == '0123456789' ","","",T(1.0)),
2184 test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:] ","","",T(1.0)),
2185 test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[0:]","","",T(1.0)),
2186 test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:9]","","",T(1.0)),
2187 test_ab<T>("'01234567890123456789'[:9] == '0123456789'[:9]","","",T(1.0)),
2188 test_ab<T>("'01234567890123456789'[10:] == '0123456789'[:] ","","",T(1.0)),
2189 test_ab<T>("'01234567890123456789'[0:9] != '123456789' ","","",T(1.0)),
2190 test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:] ","","",T(1.0)),
2191 test_ab<T>("'01234567890123456789'[0:9] != '123456789'[0:] ","","",T(1.0)),
2192 test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:8] ","","",T(1.0)),
2193 test_ab<T>("'01234567890123456789'[:9] != '123456789'[:8] ","","",T(1.0)),
2194 test_ab<T>("'01234567890123456789'[10:] != '123456789'[:] ","","",T(1.0)),
2195 test_ab<T>("'01234567890123456789'[2*6:10+6] == '23456' ","","",T(1.0)),
2196 test_ab<T>("'0123456789' == '01234567890123456789'[0:9]","","",T(1.0)),
2197 test_ab<T>("'0123456789'[:] == '01234567890123456789'[0:9]","","",T(1.0)),
2198 test_ab<T>("'0123456789'[0:] == '01234567890123456789'[0:9]","","",T(1.0)),
2199 test_ab<T>("'0123456789'[:9] == '01234567890123456789'[0:9]","","",T(1.0)),
2200 test_ab<T>("'0123456789'[:9] == '01234567890123456789'[:9] ","","",T(1.0)),
2201 test_ab<T>("'0123456789'[:] == '01234567890123456789'[10:]","","",T(1.0)),
2202 test_ab<T>("'0123456789'[3:3] == '3'[:] ","","",T(1.0)),
2203 test_ab<T>("'0123456789'[3:3] == '3'[0:0] ","","",T(1.0)),
2204 test_ab<T>("'123456789' != '01234567890123456789'[0:9]","","",T(1.0)),
2205 test_ab<T>("'123456789'[:] != '01234567890123456789'[0:9]","","",T(1.0)),
2206 test_ab<T>("'123456789'[0:] != '01234567890123456789'[0:9]","","",T(1.0)),
2207 test_ab<T>("'123456789'[:8] != '01234567890123456789'[0:9]","","",T(1.0)),
2208 test_ab<T>("'123456789'[:8] != '01234567890123456789'[:9] ","","",T(1.0)),
2209 test_ab<T>("'123456789'[:] != '01234567890123456789'[10:]","","",T(1.0)),
2210 test_ab<T>("'23456' == '01234567890123456789'[2*6:10+6] ","","",T(1.0)),
2211 test_ab<T>("'01234567890123456789'[r0: 6] == '23456' ","","",T(1.0)),
2212 test_ab<T>("'01234567890123456789'[2: r1] == '23456' ","","",T(1.0)),
2213 test_ab<T>("'01234567890123456789'[r0:3*2] == '23456' ","","",T(1.0)),
2214 test_ab<T>("'01234567890123456789'[1+1:r1] == '23456' ","","",T(1.0)),
2215 test_ab<T>("'01234567890123456789'[r0: ] == '234567890123456789' ","","",T(1.0)),
2216 test_ab<T>("'01234567890123456789'[: r1] == '0123456' ","","",T(1.0)),
2217 test_ab<T>("'01234567890123456789'[r0:r1] == '23456' ","","",T(1.0)),
2218 test_ab<T>("'01234567890123456789'[r0:r1+2] == '2345678' ","","",T(1.0)),
2219 test_ab<T>("'01234567890123456789'[r0+2:r1] == '456' ","","",T(1.0)),
2220 test_ab<T>("'01234567890123456789'[r1-r0:] == '4567890123456789' ","","",T(1.0)),
2221 test_ab<T>("'01234567890123456789'[:r1-r0] == '01234' ","","",T(1.0)),
2222 test_ab<T>("'23456' == '01234567890123456789'[r0: 6] ","","",T(1.0)),
2223 test_ab<T>("'23456' == '01234567890123456789'[2: r1] ","","",T(1.0)),
2224 test_ab<T>("'23456' == '01234567890123456789'[r0:3*2] ","","",T(1.0)),
2225 test_ab<T>("'23456' == '01234567890123456789'[1+1:r1] ","","",T(1.0)),
2226 test_ab<T>("'234567890123456789' == '01234567890123456789'[r0: ] ","","",T(1.0)),
2227 test_ab<T>("'0123456' == '01234567890123456789'[: r1] ","","",T(1.0)),
2228 test_ab<T>("'23456' == '01234567890123456789'[r0:r1] ","","",T(1.0)),
2229 test_ab<T>("'2345678' == '01234567890123456789'[r0:r1+2] ","","",T(1.0)),
2230 test_ab<T>("'456' == '01234567890123456789'[r0+2:r1] ","","",T(1.0)),
2231 test_ab<T>("'4567890123456789' == '01234567890123456789'[r1-r0:] ","","",T(1.0)),
2232 test_ab<T>("'01234' == '01234567890123456789'[:r1-r0] ","","",T(1.0)),
2233 test_ab<T>("a[r0: 6] == '23456' ","01234567890123456789","",T(1.0)),
2234 test_ab<T>("a[2: r1] == '23456' ","01234567890123456789","",T(1.0)),
2235 test_ab<T>("a[r0:3*2] == '23456' ","01234567890123456789","",T(1.0)),
2236 test_ab<T>("a[1+1:r1] == '23456' ","01234567890123456789","",T(1.0)),
2237 test_ab<T>("a[r0: ] == '234567890123456789' ","01234567890123456789","",T(1.0)),
2238 test_ab<T>("a[: r1] == '0123456' ","01234567890123456789","",T(1.0)),
2239 test_ab<T>("a[r0:r1] == '23456' ","01234567890123456789","",T(1.0)),
2240 test_ab<T>("a[r0:r1+2] == '2345678' ","01234567890123456789","",T(1.0)),
2241 test_ab<T>("a[r0+2:r1] == '456' ","01234567890123456789","",T(1.0)),
2242 test_ab<T>("a[r1-r0:] == '4567890123456789' ","01234567890123456789","",T(1.0)),
2243 test_ab<T>("a[:r1-r0] == '01234' ","01234567890123456789","",T(1.0)),
2244 test_ab<T>("'23456' == a[r0: 6] ","01234567890123456789","",T(1.0)),
2245 test_ab<T>("'23456' == a[2: r1] ","01234567890123456789","",T(1.0)),
2246 test_ab<T>("'23456' == a[r0:3*2] ","01234567890123456789","",T(1.0)),
2247 test_ab<T>("'23456' == a[1+1:r1] ","01234567890123456789","",T(1.0)),
2248 test_ab<T>("'234567890123456789' == a[r0: ] ","01234567890123456789","",T(1.0)),
2249 test_ab<T>("'0123456' == a[: r1] ","01234567890123456789","",T(1.0)),
2250 test_ab<T>("'23456' == a[r0:r1] ","01234567890123456789","",T(1.0)),
2251 test_ab<T>("'2345678' == a[r0:r1+2] ","01234567890123456789","",T(1.0)),
2252 test_ab<T>("'456' == a[r0+2:r1] ","01234567890123456789","",T(1.0)),
2253 test_ab<T>("'4567890123456789' == a[r1-r0:] ","01234567890123456789","",T(1.0)),
2254 test_ab<T>("'01234' == a[:r1-r0] ","01234567890123456789","",T(1.0)),
2255 test_ab<T>("a[r0: 6] == b ","01234567890123456789","23456",T(1.0)),
2256 test_ab<T>("a[2: r1] == b ","01234567890123456789","23456",T(1.0)),
2257 test_ab<T>("a[r0:3*2] == b ","01234567890123456789","23456",T(1.0)),
2258 test_ab<T>("a[1+1:r1] == b ","01234567890123456789","23456",T(1.0)),
2259 test_ab<T>("a[r0: ] == b ","01234567890123456789","234567890123456789",T(1.0)),
2260 test_ab<T>("a[: r1] == b ","01234567890123456789","0123456",T(1.0)),
2261 test_ab<T>("a[r0:r1] == b ","01234567890123456789","23456",T(1.0)),
2262 test_ab<T>("a[r0:r1+2] == b ","01234567890123456789","2345678",T(1.0)),
2263 test_ab<T>("a[r0+2:r1] == b ","01234567890123456789","456",T(1.0)),
2264 test_ab<T>("a[r1-r0:] == b ","01234567890123456789","4567890123456789",T(1.0)),
2265 test_ab<T>("a[:r1-r0] == b ","01234567890123456789","01234",T(1.0)),
2266 test_ab<T>("b == a[r0: 6] ","01234567890123456789","23456",T(1.0)),
2267 test_ab<T>("b == a[2: r1] ","01234567890123456789","23456",T(1.0)),
2268 test_ab<T>("b == a[r0:3*2] ","01234567890123456789","23456",T(1.0)),
2269 test_ab<T>("b == a[1+1:r1] ","01234567890123456789","23456",T(1.0)),
2270 test_ab<T>("b == a[r0: ] ","01234567890123456789","234567890123456789",T(1.0)),
2271 test_ab<T>("b == a[: r1] ","01234567890123456789","0123456",T(1.0)),
2272 test_ab<T>("b == a[r0:r1] ","01234567890123456789","23456",T(1.0)),
2273 test_ab<T>("b == a[r0:r1+2] ","01234567890123456789","2345678",T(1.0)),
2274 test_ab<T>("b == a[r0+2:r1] ","01234567890123456789","456",T(1.0)),
2275 test_ab<T>("b == a[r1-r0:] ","01234567890123456789","4567890123456789",T(1.0)),
2276 test_ab<T>("b == a[:r1-r0] ","01234567890123456789","01234",T(1.0)),
2277 test_ab<T>("'01234567890123456789'[0:9] == a ","0123456789","",T(1.0)),
2278 test_ab<T>("'01234567890123456789'[0:9] == a[:] ","0123456789","",T(1.0)),
2279 test_ab<T>("'01234567890123456789'[0:9] == a[0:] ","0123456789","",T(1.0)),
2280 test_ab<T>("'01234567890123456789'[0:9] == a[:9] ","0123456789","",T(1.0)),
2281 test_ab<T>("'01234567890123456789'[:9] == a[:9] ","0123456789","",T(1.0)),
2282 test_ab<T>("'01234567890123456789'[10:] == a[:] ","0123456789","",T(1.0)),
2283 test_ab<T>("'01234567890123456789'[0:9] != a ","123456789" ,"",T(1.0)),
2284 test_ab<T>("'01234567890123456789'[0:9] != a[:] ","123456789" ,"",T(1.0)),
2285 test_ab<T>("'01234567890123456789'[0:9] != a[0:] ","123456789" ,"",T(1.0)),
2286 test_ab<T>("'01234567890123456789'[0:9] != a[:8] ","123456789" ,"",T(1.0)),
2287 test_ab<T>("'01234567890123456789'[:9] != a[:8] ","123456789" ,"",T(1.0)),
2288 test_ab<T>("'01234567890123456789'[10:] != a[:] ","123456789" ,"",T(1.0)),
2289 test_ab<T>("'01234567890123456789'[2*6:10+6] == a","23456" ,"",T(1.0)),
2290 test_ab<T>("'23456' == a[:] ","23456" ,"",T(1.0)),
2291 test_ab<T>("a == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2292 test_ab<T>("a[:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2293 test_ab<T>("a[0:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2294 test_ab<T>("a[:9] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2295 test_ab<T>("a[:9] == '01234567890123456789'[:9] ","0123456789","",T(1.0)),
2296 test_ab<T>("a[:] == '01234567890123456789'[10:] ","0123456789","",T(1.0)),
2297 test_ab<T>("a != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2298 test_ab<T>("a[:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2299 test_ab<T>("a[0:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2300 test_ab<T>("a[:8] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2301 test_ab<T>("a[:8] != '01234567890123456789'[:9] ","123456789" ,"",T(1.0)),
2302 test_ab<T>("a[:] != '01234567890123456789'[10:] ","123456789" ,"",T(1.0)),
2303 test_ab<T>("a == '01234567890123456789'[2*6:10+6]","23456" ,"",T(1.0)),
2304 test_ab<T>("a[:] == '23456' ","23456" ,"",T(1.0)),
2305 test_ab<T>("a[0:9] == b ","01234567890123456789","0123456789",T(1.0)),
2306 test_ab<T>("a[0:9] == b[:] ","01234567890123456789","0123456789",T(1.0)),
2307 test_ab<T>("a[0:9] == b[0:] ","01234567890123456789","0123456789",T(1.0)),
2308 test_ab<T>("a[0:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
2309 test_ab<T>("a[:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
2310 test_ab<T>("a[10:] == b[:] ","01234567890123456789","0123456789",T(1.0)),
2311 test_ab<T>("a[0:9] != b ","01234567890123456789","123456789" ,T(1.0)),
2312 test_ab<T>("a[0:9] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
2313 test_ab<T>("a[0:9] != b[0:] ","01234567890123456789","123456789" ,T(1.0)),
2314 test_ab<T>("a[0:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
2315 test_ab<T>("a[:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
2316 test_ab<T>("a[10:] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
2317 test_ab<T>("a[2*6:10+6] == b ","01234567890123456789","23456" ,T(1.0)),
2318 test_ab<T>("b == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2319 test_ab<T>("b[:] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2320 test_ab<T>("b[0:] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2321 test_ab<T>("b[:9] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2322 test_ab<T>("b[:9] == a[:9] ","01234567890123456789","0123456789",T(1.0)),
2323 test_ab<T>("b[:] == a[10:] ","01234567890123456789","0123456789",T(1.0)),
2324 test_ab<T>("b != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2325 test_ab<T>("b[:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2326 test_ab<T>("b[0:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2327 test_ab<T>("b[:8] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2328 test_ab<T>("b[:8] != a[:9] ","01234567890123456789","123456789" ,T(1.0)),
2329 test_ab<T>("b[:] != a[10:] ","01234567890123456789","123456789" ,T(1.0)),
2330 test_ab<T>("b == a[2*6:10+6] ","01234567890123456789","23456" ,T(1.0)),
2331 test_ab<T>("a[2:6] == b" ,"0123456789","23456" ,T(1.0)),
2332 test_ab<T>("a == b[2:6]" ,"23456","0123456789" ,T(1.0)),
2333 test_ab<T>("a[1+1:2*3] == b" ,"0123456789","23456" ,T(1.0)),
2334 test_ab<T>("a == b[4/2:sqrt(36)]","23456","0123456789" ,T(1.0)),
2335 test_ab<T>("a[0:6] == b" ,"0123456789","0123456",T(1.0)),
2336 test_ab<T>("a[:6] == b" ,"0123456789","0123456",T(1.0)),
2337 test_ab<T>("a[4/2-2:2+4] == b" ,"0123456789","0123456",T(1.0)),
2338 test_ab<T>("a[:12/2] == b" ,"0123456789","0123456",T(1.0)),
2339 test_ab<T>("a[0:] == b" ,"0123456","0123456" ,T(1.0)),
2340 test_ab<T>("a[:] == b" ,"0123456","0123456" ,T(1.0)),
2341 test_ab<T>("a == b[0:6]" ,"0123456","0123456789",T(1.0)),
2342 test_ab<T>("a == b[:6]" ,"0123456","0123456789",T(1.0)),
2343 test_ab<T>("a == b[4/2-2:2+4]" ,"0123456","0123456789",T(1.0)),
2344 test_ab<T>("a == b[:12/2]" ,"0123456","0123456789",T(1.0)),
2345 test_ab<T>("a == b[0:]" ,"0123456","0123456" ,T(1.0)),
2346 test_ab<T>("a == b[:]" ,"0123456","0123456" ,T(1.0)),
2347 test_ab<T>("a[:9] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2348 test_ab<T>("a[0:9] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2349 test_ab<T>("a[0:] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2350 test_ab<T>("a[:] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2351 test_ab<T>("a[:] == b[10:]" ,"0123456789","01234567890123456789",T(1.0)),
2352 test_ab<T>("'!@#$%^&*([{}])-=' != ')]}{[(*&^%$#@!'","","",T(1.0)),
2353 test_ab<T>("('!@#$%^&*([{}])-=') != (')]}{[(*&^%$#@!')","","",T(1.0)),
2354 test_ab<T>("{[('a')]} == [{('a')}]","","",T(1.0)),
2355 test_ab<T>("{[('!@#$%^&*([{}])-=')]} != [{(')]}{[(*&^%$#@!')}]","","",T(1.0)),
2356 test_ab<T>("'!@#$%^&*([{}])-=' == '!@#$%^&*([{}])-='","","",T(1.0)),
2357 test_ab<T>("('!@#$%^&*([{}])-=') == ('!@#$%^&*([{}])-=')","","",T(1.0)),
2358 test_ab<T>("{[('!@#$%^&*([{}])-=')]} == [{('!@#$%^&*([{}])-=')}]","","",T(1.0)),
2359 test_ab<T>("'1234\\\\abc\nxyz\r890\tqaz\\'567' == a","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
2360 test_ab<T>("a == '1234\\\\abc\nxyz\r890\tqaz\\'567'","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
2361 test_ab<T>("'123'[] == 3" ,"","" ,T(1.0)),
2362 test_ab<T>("3 == '123'[]" ,"","" ,T(1.0)),
2363 test_ab<T>("'123'[] + '1234'[] == 7" ,"","" ,T(1.0)),
2364 test_ab<T>("abs('123'[] - '1234'[]) == 1" ,"","" ,T(1.0)),
2365 test_ab<T>("'1234'[] == a[]" ,"1234","" ,T(1.0)),
2366 test_ab<T>("'123'[] + a[] == 7" ,"1234","" ,T(1.0)),
2367 test_ab<T>("abs(a[] - '12345'[]) == 1" ,"1234","" ,T(1.0)),
2368 test_ab<T>("'1234'[] + '12345'[] == a[] + b[]" ,"1234","12345" ,T(1.0)),
2369 test_ab<T>("abs('123'[] -'1234'[]) == abs(a[] - b[])" ,"1234","12345",T(1.0)),
2370 test_ab<T>("(a + b) == 'abc123' ","abc","123" ,T(1.0)),
2371 test_ab<T>("(a + '123') == 'abc123' ","abc","123" ,T(1.0)),
2372 test_ab<T>("('abc' + b) == 'abc123' ","abc","123" ,T(1.0)),
2373 test_ab<T>("(a + '1') == 'abc1' ","abc","123" ,T(1.0)),
2374 test_ab<T>("('a' + b) == 'a123' ","abc","123" ,T(1.0)),
2375 test_ab<T>("(a[2:8] + b) == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
2376 test_ab<T>("(a + b[2:8]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
2377 test_ab<T>("(a[2:8] + '0123') == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
2378 test_ab<T>("('abc' + b[2:8]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
2379 test_ab<T>("(a[2:3] + b[3:4]) == 'c3' ","abc","0123456789" ,T(1.0)),
2380 test_ab<T>("(a[3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2381 test_ab<T>("('abc' + b[:8]) == 'abc01234567' ","abc","0123456789" ,T(1.0)),
2382 test_ab<T>("a + '123' == 'abc'+ b ","abc" , "123" , T(1.0)),
2383 test_ab<T>("a[0:3] + '123' == 'abc' + b[0:3] ","abcXYZ", "123XYZ", T(1.0)),
2384 test_ab<T>("a[ :3] + '123' == 'abc' + b[ :3] ","abcXYZ", "123XYZ", T(1.0)),
2385 test_ab<T>("a[3: ] + '123' == 'abc' + b[3: ]","XYZabc", "XYZ123", T(1.0)),
2386 test_ab<T>("a[3:a[]] + '123' == 'abc' + b[3:b[]]","XYZabc", "XYZ123", T(1.0)),
2387 test_ab<T>("(a[r0:r2] + b) == 'cdefg0123' ","abcdefghij","0123",T(1.0)),
2388 test_ab<T>("(a + b[r0:r2]) == 'abc23456' ","abc","0123456789" ,T(1.0)),
2389 test_ab<T>("(a[r0:r2] + '0123') == 'cdefg0123' ","abcdefghij","0123",T(1.0)),
2390 test_ab<T>("('abc' + b[r0:r2]) == 'abc23456' ","abc","0123456789" ,T(1.0)),
2391 test_ab<T>("(a[r0:r0+1] + b[r3:r3+1]) == 'c3' ","abc","0123456789" ,T(1.0)),
2392 test_ab<T>("(a[r3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2393 test_ab<T>("('abc' + b[:r2]) == 'abc0123456' ","abc","0123456789" ,T(1.0)),
2394 test_ab<T>("a[0:r0] + '123' == 'ab'+ b[0:r0+1] ","abcXYZ", "123XYZ", T(1.0)),
2395 test_ab<T>("a[ :r0] + '123' == 'ab' +b[ :r0+1] ","abcXYZ", "123XYZ", T(1.0)),
2396 test_ab<T>("a[r3: ] + '123' == 'abc' + b[r3: ]","XYZabc", "XYZ123", T(1.0)),
2397 test_ab<T>("a[r3:a[]] + '123' == 'abc' + b[r3:b[]] ","XYZabc", "XYZ123", T(1.0)),
2398 test_ab<T>("(a[r0:r0+1] + b[r3:r0+2]) == 'c3' ","abc","0123456789" ,T(1.0)),
2399 test_ab<T>("(a[r0+1:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2400 test_ab<T>("a[r0+1: ] + '123' == 'abc' + b[r0+1: ]", "XYZabc" ,"XYZ123" ,T(1.0)),
2401 test_ab<T>("a[r0+1:a[]] + '123' == 'abc' + b[r0+1:b[]] ", "XYZabc" ,"XYZ123" ,T(1.0)),
2402 test_ab<T>("(a + b)[ :14] == 'abcdefghij0123' ", "abcdefghij", "0123456789" ,T(1.0)),
2403 test_ab<T>("(a + b)[ 6: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2404 test_ab<T>("(a + b)[ 2:3r1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2405 test_ab<T>("(a[2:8] + b[2:8]) == 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2406 test_ab<T>("(a[2:8] + b[2:8])[3:9] == 'fgh234' ", "abcdefghij", "0123456789" ,T(1.0)),
2407 test_ab<T>("(a + b)[r0 - 2: r1 + r2 +1] == 'abcdefghij0123'", "abcdefghij", "0123456789" ,T(1.0)),
2408 test_ab<T>("(a + b)[r0*r3:] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2409 test_ab<T>("(a + b)[3r0: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2410 test_ab<T>("(a + b)[2r3: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2411 test_ab<T>("(a + b)[2:3r1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2412 test_ab<T>("(a[r0:8] + b[r0:r2+1])== 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2413 test_ab<T>("(a[r1 / r3:8] + b[r0:r2+1])[3:r2 + 2] == 'fgh234'", "abcdefghij", "0123456789" ,T(1.0)),
2414 test_ab<T>("(a += b) == 'abc123' ", "abc","123" ,T(1.0)),
2415 test_ab<T>("(a += '123') == 'abc123' ", "abc","123" ,T(1.0)),
2416 test_ab<T>("(a += b[3:6]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2417 test_ab<T>("(a += 'XXX123XXX'[3:6]) == 'abc123' ", "abc","123" ,T(1.0)),
2418 test_ab<T>("(a += b)[:] == 'abc123' ", "abc","123" ,T(1.0)),
2419 test_ab<T>("(a += '123')[:] == 'abc123' ", "abc","123" ,T(1.0)),
2420 test_ab<T>("(a += b[3:6])[:] == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2421 test_ab<T>("(a += 'XXX123XXX'[3:6])[:] == 'abc123' ", "abc","123" ,T(1.0)),
2422 test_ab<T>("(a += b[r1/2:r1]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2423 test_ab<T>("(a += 'XXX123XXX'[r0+1:r1]) == 'abc123' ", "abc","123" ,T(1.0)),
2424 test_ab<T>("(a += b)[] == 6 ", "abc","123" ,T(1.0)),
2425 test_ab<T>("(a += '123')[] == 6 ", "abc","123" ,T(1.0)),
2426 test_ab<T>("(a += b[3:6])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
2427 test_ab<T>("(a += b[r0+1:r1])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
2428 test_ab<T>("(a + b)[:][] == 6 ","abc","123" ,T(1.0)),
2429 test_ab<T>("(a + b)[:][:][] == 6 ","abc","123" ,T(1.0)),
2430 test_ab<T>("(a + b)[:][:][:][] == 6 ","abc","123" ,T(1.0)),
2431 test_ab<T>("(a + b)[:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
2432 test_ab<T>("(a + b)[:][:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
2433 test_ab<T>("(a + b)[:][:][:][:][:][:][] == 6 ","abc","123" ,T(1.0)),
2434 test_ab<T>("(a + b)[:][:][:][:][:][:][:][]== 6 ","abc","123" ,T(1.0)),
2435 test_ab<T>("(a + b)[0:6] == 'abc123' ","abc","123" ,T(1.0)),
2436 test_ab<T>("(a + b)[0:6][1:5] == 'bc12' ","abc","123" ,T(1.0)),
2437 test_ab<T>("(a + b)[0:6][1:5][1:3] == 'c1' ","abc","123" ,T(1.0)),
2438 test_ab<T>("(a + b)[0:6][1:5][1:3][0:1] == 'c' ","abc","123" ,T(1.0)),
2439 test_ab<T>("(a + b)[0:6][] == 6 ","abc","123" ,T(1.0)),
2440 test_ab<T>("(a + b)[0:6][1:5][] == 4 ","abc","123" ,T(1.0)),
2441 test_ab<T>("(a + b)[0:6][1:5][1:3][] == 2 ","abc","123" ,T(1.0)),
2442 test_ab<T>("(a + b)[0:6][1:5][1:4][0:1][] == 1 ","abc","123" ,T(1.0)),
2443 test_ab<T>("(a[ : ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2444 test_ab<T>("(a[0: ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2445 test_ab<T>("(a[ :10]:= b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2446 test_ab<T>("(a[3: 8]:= b); (a == '012ABCDE89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2447 test_ab<T>("(a[2: 9]:= b); (a == '01ABCDEFG9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2448 test_ab<T>("(a[1:10]:= b); (a == '0ABCDEFGHI');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2449 test_ab<T>("(a[0:1] := b); (a == 'A123456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2450 test_ab<T>("(a[1:2] := b); (a == '0A23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2451 test_ab<T>("(a[2:3] := b); (a == '01A3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2452 test_ab<T>("(a[3:4] := b); (a == '012A456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2453 test_ab<T>("(a[4:5] := b); (a == '0123A56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2454 test_ab<T>("(a[5:6] := b); (a == '01234A6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2455 test_ab<T>("(a[6:7] := b); (a == '012345A789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2456 test_ab<T>("(a[7:8] := b); (a == '0123456A89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2457 test_ab<T>("(a[8:9] := b); (a == '01234567A9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2458 test_ab<T>("(a[9:10]:= b); (a == '012345678A');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2459 test_ab<T>("(a[0:2] := b); (a == 'AB23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2460 test_ab<T>("(a[1:3] := b); (a == '0AB3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2461 test_ab<T>("(a[2:4] := b); (a == '01AB456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2462 test_ab<T>("(a[3:5] := b); (a == '012AB56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2463 test_ab<T>("(a[4:6] := b); (a == '0123AB6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2464 test_ab<T>("(a[5:7] := b); (a == '01234AB789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2465 test_ab<T>("(a[6:8] := b); (a == '012345AB89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2466 test_ab<T>("(a[7:9] := b); (a == '0123456AB9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2467 test_ab<T>("(a[8:10]:= b); (a == '01234567AB');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2468 test_ab<T>("(a[ : ] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2469 test_ab<T>("(a[0: ] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2470 test_ab<T>("(a[ :10] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2471 test_ab<T>("(a[3:8] := b[3:b[] - 2]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2472 test_ab<T>("(a[2:9] := b[3:b[] - 2]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2473 test_ab<T>("(a[1:10] := b[3:b[] - 2]); (a == '0ABCDEFGHI');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2474 test_ab<T>("(a[0:1] := b[3:b[] - 2]); (a == 'A123456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2475 test_ab<T>("(a[1:2] := b[3:b[] - 2]); (a == '0A23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2476 test_ab<T>("(a[2:3] := b[3:b[] - 2]); (a == '01A3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2477 test_ab<T>("(a[3:4] := b[3:b[] - 2]); (a == '012A456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2478 test_ab<T>("(a[4:5] := b[3:b[] - 2]); (a == '0123A56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2479 test_ab<T>("(a[5:6] := b[3:b[] - 2]); (a == '01234A6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2480 test_ab<T>("(a[6:7] := b[3:b[] - 2]); (a == '012345A789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2481 test_ab<T>("(a[7:8] := b[3:b[] - 2]); (a == '0123456A89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2482 test_ab<T>("(a[8:9] := b[3:b[] - 2]); (a == '01234567A9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2483 test_ab<T>("(a[9:10] := b[3:b[] - 2]); (a == '012345678A');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2484 test_ab<T>("(a[0:2] := b[3:b[] - 2]); (a == 'AB23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2485 test_ab<T>("(a[1:3] := b[3:b[] - 2]); (a == '0AB3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2486 test_ab<T>("(a[2:4] := b[3:b[] - 2]); (a == '01AB456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2487 test_ab<T>("(a[3:5] := b[3:b[] - 2]); (a == '012AB56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2488 test_ab<T>("(a[4:6] := b[3:b[] - 2]); (a == '0123AB6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2489 test_ab<T>("(a[5:7] := b[3:b[] - 2]); (a == '01234AB789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2490 test_ab<T>("(a[6:8] := b[3:b[] - 2]); (a == '012345AB89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2491 test_ab<T>("(a[7:9] := b[3:b[] - 2]); (a == '0123456AB9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2492 test_ab<T>("(a[8:10] := b[3:b[] - 2]); (a == '01234567AB');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2493 test_ab<T>("(a[0:10] := b); (a == 'A123456789');", "0123456789","A" ,T(1.0)),
2494 test_ab<T>("(a[0:10] := b); (a == 'AB23456789');", "0123456789","AB" ,T(1.0)),
2495 test_ab<T>("(a[0:10] := b); (a == 'ABC3456789');", "0123456789","ABC" ,T(1.0)),
2496 test_ab<T>("(a[0:10] := b); (a == 'ABCD456789');", "0123456789","ABCD" ,T(1.0)),
2497 test_ab<T>("(a[0:10] := b); (a == 'ABCDE56789');", "0123456789","ABCDE" ,T(1.0)),
2498 test_ab<T>("(a[0:10] := b); (a == 'ABCDEF6789');", "0123456789","ABCDEF" ,T(1.0)),
2499 test_ab<T>("(a[0:10] := b); (a == 'ABCDEFG789');", "0123456789","ABCDEFG" ,T(1.0)),
2500 test_ab<T>("(a[0:10] := b); (a == 'ABCDEFGH89');", "0123456789","ABCDEFGH" ,T(1.0)),
2501 test_ab<T>("(a[0:10] := b); (a == 'ABCDEFGHI9');", "0123456789","ABCDEFGHI" ,T(1.0)),
2502 test_ab<T>("(a[3:10] := b); (a == '012A456789');", "0123456789","A" ,T(1.0)),
2503 test_ab<T>("(a[3:10] := b); (a == '012AB56789');", "0123456789","AB" ,T(1.0)),
2504 test_ab<T>("(a[3:10] := b); (a == '012ABC6789');", "0123456789","ABC" ,T(1.0)),
2505 test_ab<T>("(a[3:10] := b); (a == '012ABCD789');", "0123456789","ABCD" ,T(1.0)),
2506 test_ab<T>("(a[3:10] := b); (a == '012ABCDE89');", "0123456789","ABCDE" ,T(1.0)),
2507 test_ab<T>("(a[3:10] := b); (a == '012ABCDEF9');", "0123456789","ABCDEF" ,T(1.0)),
2508 test_ab<T>("(a[r1 / r0:r2 + 1] := b[3:b[] - r3 + 1]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2509 test_ab<T>("(a[r0:r2 + 2] := b[r3:b[] - r3 + 1]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2510 test_ab<T>("'\\0x30\\0x31\\0x32\\0x33\\0x34\\0x35\\0x36\\0x37\\0x38\\0x39' == '0123456789'","","",T(1.0)),
2511 test_ab<T>("'abc\\0x30\\0x31\\0x32\\0x33xyz' == 'abc0123xyz'" ,"","",T(1.0)),
2512 test_ab<T>("'\\0x30\\n\\0x31\\n\\0x32\\n\\0x33' == '0\\n1\\n2\\n3'" ,"","",T(1.0)),
2513 test_ab<T>("('\\0x30' + '') == '0'" ,"","",T(1.0)),
2514 test_ab<T>("('\\0x30' + '') == '0' + ''" ,"","",T(1.0)),
2515 test_ab<T>("('\\0x30' + '') == ''+ '0'" ,"","",T(1.0)),
2516 test_ab<T>("('' + '\\0x30') == '0'" ,"","",T(1.0)),
2517 test_ab<T>("('' + '\\0x30') == '0' + ''" ,"","",T(1.0)),
2518 test_ab<T>("('' + '\\0x30') == ''+ '0'" ,"","",T(1.0)),
2519 test_ab<T>("('' + '\\0x30' + '') == '0'" ,"","",T(1.0)),
2520 test_ab<T>("('' + '\\0x30' + '') == '0' + ''" ,"","",T(1.0)),
2521 test_ab<T>("('' + '\\0x30' + '') == ''+ '0'" ,"","",T(1.0)),
2522 test_ab<T>("('' + '\\0x30' + '') == '0'" ,"","",T(1.0)),
2523 test_ab<T>("('' + '\\0x30' + '') == '0' + ''" ,"","",T(1.0)),
2524 test_ab<T>("('' + '\\0x30' + '') == ''+ '0'" ,"","",T(1.0)),
2525 test_ab<T>("('\\0x30' + '\\0x31\\0x32') == '012'" ,"","",T(1.0)),
2526 test_ab<T>("('\\0x30' + '\\0x31\\0x32' + '\\0x33\\0x34\\0x35') == '012345'" ,"","",T(1.0)),
2527 test_ab<T>("'a\\'\\\\b' == a" ,"a'\\b","",T(1.0)),
2528 test_ab<T>("'a\\\\\\'b' == a" ,"a\\'b","",T(1.0)),
2529 test_ab<T>("'a\\'\\\\\\\\b' == a" ,"a'\\\\b","",T(1.0)),
2530 test_ab<T>("'a\\0x30\\'\\0x31\\\\\\0x32b' == a" ,"a0'1\\2b","",T(1.0)),
2531
2532 test_ab<T>("var x := 3; x > 2 and 'abc' like '*bc'" ,"","",T(1.0)),
2533 test_ab<T>("var x := 3; x > 2 and 'abc' ilike '*Bc'" ,"","",T(1.0)),
2534 test_ab<T>("var x := 3; x > 2 and 'abc' in '123abc123'","","",T(1.0)),
2535
2536 test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s like '*bc'" ,"","",T(1.0)),
2537 test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s ilike '*Bc'" ,"","",T(1.0)),
2538 test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s in '123abc123'","","",T(1.0)),
2539
2540 test_ab<T>("var x := 3; var s := 'abc'; var t := '*bc'; x > 2 and s like t" ,"","",T(1.0)),
2541 test_ab<T>("var x := 3; var s := 'abc'; var t := '*Bc'; x > 2 and s ilike t" ,"","",T(1.0)),
2542 test_ab<T>("var x := 3; var s := 'abc'; var t := '123abc123'; x > 2 and s in t","","",T(1.0)),
2543
2544 test_ab<T>("var x := 3; x > 2 and a like '*bc'" ,"abc","",T(1.0)),
2545 test_ab<T>("var x := 3; x > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
2546 test_ab<T>("var x := 3; x > 2 and a in '123abc123'","abc","",T(1.0)),
2547
2548 test_ab<T>("var x := 3; x > 2 and a like b ","abc","*bc",T(1.0)),
2549 test_ab<T>("var x := 3; x > 2 and a ilike b","abc","*Bc",T(1.0)),
2550 test_ab<T>("var x := 3; x > 2 and a in b ","abc","123abc123",T(1.0)),
2551
2552 test_ab<T>("a[] > 2 and a like '*bc'" ,"abc","",T(1.0)),
2553 test_ab<T>("a[] > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
2554 test_ab<T>("a[] > 2 and a in '123abc123'","abc","",T(1.0)),
2555
2556 test_ab<T>("a[] > 2 and a like b ","abc","*bc",T(1.0)),
2557 test_ab<T>("a[] > 2 and a ilike b","abc","*Bc",T(1.0)),
2558 test_ab<T>("a[] > 2 and a in b ","abc","123abc123",T(1.0)),
2559
2560 test_ab<T>("a[0:1] := b[ :]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
2561 test_ab<T>("a[0:2] := b[ :]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
2562 test_ab<T>("a[0:3] := b[ :]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
2563 test_ab<T>("a[0:4] := b[ :]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
2564 test_ab<T>("a[0:5] := b[ :]; a == '01234'", "XXXXX","01234567890",T(1.0)),
2565 test_ab<T>("a[0:1] := b[6:]; a == '6XXXX'", "XXXXX","01234567890",T(1.0)),
2566 test_ab<T>("a[0:2] := b[6:]; a == '67XXX'", "XXXXX","01234567890",T(1.0)),
2567 test_ab<T>("a[0:3] := b[6:]; a == '678XX'", "XXXXX","01234567890",T(1.0)),
2568 test_ab<T>("a[0:4] := b[6:]; a == '6789X'", "XXXXX","01234567890",T(1.0)),
2569 test_ab<T>("a[0:5] := b[6:]; a == '67890'", "XXXXX","01234567890",T(1.0)),
2570 test_ab<T>("a[0:1] <=> b[ :]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
2571 test_ab<T>("a[0:2] <=> b[ :]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
2572 test_ab<T>("a[0:3] <=> b[ :]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
2573 test_ab<T>("a[0:4] <=> b[ :]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
2574 test_ab<T>("a[0:5] <=> b[ :]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
2575 test_ab<T>("a[0:1] <=> b[6:]; (a == '6XXXX') and (b == '012345X7890')", "XXXXX","01234567890",T(1.0)),
2576 test_ab<T>("a[0:2] <=> b[6:]; (a == '67XXX') and (b == '012345XX890')", "XXXXX","01234567890",T(1.0)),
2577 test_ab<T>("a[0:3] <=> b[6:]; (a == '678XX') and (b == '012345XXX90')", "XXXXX","01234567890",T(1.0)),
2578 test_ab<T>("a[0:4] <=> b[6:]; (a == '6789X') and (b == '012345XXXX0')", "XXXXX","01234567890",T(1.0)),
2579 test_ab<T>("a[0:5] <=> b[6:]; (a == '67890') and (b == '012345XXXXX')", "XXXXX","01234567890",T(1.0)),
2580 test_ab<T>("var i := 0; a[0:i+1] := b[:]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
2581 test_ab<T>("var i := 0; a[0:i+2] := b[:]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
2582 test_ab<T>("var i := 0; a[0:i+3] := b[:]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
2583 test_ab<T>("var i := 0; a[0:i+4] := b[:]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
2584 test_ab<T>("var i := 0; a[0:i+5] := b[:]; a == '01234'", "XXXXX","01234567890",T(1.0)),
2585 test_ab<T>("var i := 0; a[0:i+1] <=> b[:]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
2586 test_ab<T>("var i := 0; a[0:i+2] <=> b[:]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
2587 test_ab<T>("var i := 0; a[0:i+3] <=> b[:]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
2588 test_ab<T>("var i := 0; a[0:i+4] <=> b[:]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
2589 test_ab<T>("var i := 0; a[0:i+5] <=> b[:]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
2590
2591 test_ab<T>("var y:= 2; '01234567890'[y:] == a ", "234567890","" ,T(1.0)),
2592 test_ab<T>("var y:= 2; '01234567890'[y:][y:] == a ", "4567890" ,"" ,T(1.0)),
2593 test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:] == a ", "67890" ,"" ,T(1.0)),
2594 test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:][y:] == a ", "890" ,"" ,T(1.0)),
2595 test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:][y:][y:] == a", "0" ,"" ,T(1.0)),
2596 test_ab<T>("var y:= 2; '0123456789'[y:] == a ", "23456789" ,"" ,T(1.0)),
2597 test_ab<T>("var y:= 2; '0123456789'[y:][y:] == a ", "456789" ,"" ,T(1.0)),
2598 test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:] == a ", "6789" ,"" ,T(1.0)),
2599 test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:][y:] == a ", "89" ,"" ,T(1.0)),
2600 test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:][y:][y:] == a ", "" ,"" ,T(1.0)),
2601
2602 test_ab<T>("var s:= ''; s := ''; s == '' ", "" ,"" ,T(1.0)),
2603 test_ab<T>("var s:= ''; s := ''; '' == s ", "" ,"" ,T(1.0)),
2604 test_ab<T>("var s:= ''; s := ''; s[:] == '' ", "" ,"" ,T(1.0)),
2605 test_ab<T>("var s:= ''; s := ''; '' == s[:] ", "" ,"" ,T(1.0)),
2606 test_ab<T>("var s:= ''; s := ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2607 test_ab<T>("var s:= ''; s := ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2608
2609 test_ab<T>("var s:= ''; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2610 test_ab<T>("var s:= ''; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2611 test_ab<T>("var s:= ''; s += ''; s == '' ", "" ,"" ,T(1.0)),
2612 test_ab<T>("var s:= ''; s += ''; '' == s ", "" ,"" ,T(1.0)),
2613 test_ab<T>("var s:= '1'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2614 test_ab<T>("var s:= '1'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2615 test_ab<T>("var s:= '12'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2616 test_ab<T>("var s:= '12'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2617 test_ab<T>("var s:= '123'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2618 test_ab<T>("var s:= '123'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2619 test_ab<T>("var s:= '1'; s += ''; s == '1' ", "" ,"" ,T(1.0)),
2620 test_ab<T>("var s:= '1'; s += ''; '1' == s ", "" ,"" ,T(1.0)),
2621 test_ab<T>("var s:= '12'; s += ''; s == '12' ", "" ,"" ,T(1.0)),
2622 test_ab<T>("var s:= '12'; s += ''; '12' == s ", "" ,"" ,T(1.0)),
2623 test_ab<T>("var s:= '123'; s += ''; s == '123' ", "" ,"" ,T(1.0)),
2624 test_ab<T>("var s:= '123'; s += ''; '123' == s ", "" ,"" ,T(1.0)),
2625
2626 test_ab<T>("var s:= ''; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2627 test_ab<T>("var s:= ''; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2628 test_ab<T>("var s:= ''; s += ''; s[:] == '' ", "" ,"" ,T(1.0)),
2629 test_ab<T>("var s:= ''; s += ''; '' == s[:] ", "" ,"" ,T(1.0)),
2630 test_ab<T>("var s:= '1'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2631 test_ab<T>("var s:= '1'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2632 test_ab<T>("var s:= '12'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2633 test_ab<T>("var s:= '12'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2634 test_ab<T>("var s:= '123'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2635 test_ab<T>("var s:= '123'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2636 test_ab<T>("var s:= '1'; s += ''; s[:] == '1' ", "" ,"" ,T(1.0)),
2637 test_ab<T>("var s:= '1'; s += ''; '1' == s[:] ", "" ,"" ,T(1.0)),
2638 test_ab<T>("var s:= '12'; s += ''; s[:] == '12' ", "" ,"" ,T(1.0)),
2639 test_ab<T>("var s:= '12'; s += ''; '12' == s[:] ", "" ,"" ,T(1.0)),
2640 test_ab<T>("var s:= '123'; s += ''; s[:] == '123' ", "" ,"" ,T(1.0)),
2641 test_ab<T>("var s:= '123'; s += ''; '123' == s[:] ", "" ,"" ,T(1.0)),
2642
2643 test_ab<T>("var s:= ''; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2644 test_ab<T>("var s:= ''; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2645 test_ab<T>("var s:= ''; s += ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2646 test_ab<T>("var s:= ''; s += ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2647 test_ab<T>("var s:= '1'; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2648 test_ab<T>("var s:= '1'; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2649 test_ab<T>("var s:= '12'; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2650 test_ab<T>("var s:= '12'; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2651 test_ab<T>("var s:= '123'; s := '' + ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2652 test_ab<T>("var s:= '123'; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2653 test_ab<T>("var s:= '1'; s += ''; s[:s[]] == '1' ", "" ,"" ,T(1.0)),
2654 test_ab<T>("var s:= '1'; s += ''; '1' == s[:s[]] ", "" ,"" ,T(1.0)),
2655 test_ab<T>("var s:= '12'; s += ''; s[:s[]] == '12' ", "" ,"" ,T(1.0)),
2656 test_ab<T>("var s:= '12'; s += ''; '12' == s[:s[]] ", "" ,"" ,T(1.0)),
2657 test_ab<T>("var s:= '123'; s += ''; s[:s[]] == '123' ", "" ,"" ,T(1.0)),
2658 test_ab<T>("var s:= '123'; s += ''; '123' == s[:s[]] ", "" ,"" ,T(1.0)),
2659
2660 test_ab<T>("var s:= ''; for(var i:=0; i < 10; i+=1) {s += '';}; s == '' ", "" ,"" ,T(1.0)),
2661 test_ab<T>("var s:= ''; for(var i:=0; i < 10; i+=1) {s += '';}; '' == s ", "" ,"" ,T(1.0)),
2662 test_ab<T>("var s:= '1'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '1' ", "" ,"" ,T(1.0)),
2663 test_ab<T>("var s:= '1'; for(var i:=0; i < 10; i+=1) {s += '';}; '1' == s ", "" ,"" ,T(1.0)),
2664 test_ab<T>("var s:= '12'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '12' ", "" ,"" ,T(1.0)),
2665 test_ab<T>("var s:= '12'; for(var i:=0; i < 10; i+=1) {s += '';}; '12' == s ", "" ,"" ,T(1.0)),
2666 test_ab<T>("var s:= '123'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '123' ", "" ,"" ,T(1.0)),
2667 test_ab<T>("var s:= '123'; for(var i:=0; i < 10; i+=1) {s += '';}; '123' == s ", "" ,"" ,T(1.0)),
2668
2669 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s += '1';}; s == '1111' ", "" ,"" ,T(1.0)),
2670 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s += '1';}; '1111' == s ", "" ,"" ,T(1.0)),
2671 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '22';}; s == '2222' ", "" ,"" ,T(1.0)),
2672 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '22';}; '2222' == s ", "" ,"" ,T(1.0)),
2673 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '333';}; s == '333333' ", "" ,"" ,T(1.0)),
2674 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '333';}; '333333' == s ", "" ,"" ,T(1.0)),
2675
2676 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := s + '1';}; s == '1111' ", "" ,"" ,T(1.0)),
2677 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := s + '1';}; '1111' == s ", "" ,"" ,T(1.0)),
2678 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '22';}; s == '2222' ", "" ,"" ,T(1.0)),
2679 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '22';}; '2222' == s ", "" ,"" ,T(1.0)),
2680 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '333';}; s == '333333'", "" ,"" ,T(1.0)),
2681 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '333';}; '333333' == s", "" ,"" ,T(1.0)),
2682
2683 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := '1' + s;}; s == '1111' ", "" ,"" ,T(1.0)),
2684 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := '1' + s;}; '1111' == s ", "" ,"" ,T(1.0)),
2685 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '22' + s;}; s == '2222' ", "" ,"" ,T(1.0)),
2686 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '22' + s;}; '2222' == s ", "" ,"" ,T(1.0)),
2687 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '333' + s;}; s == '333333'", "" ,"" ,T(1.0)),
2688 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '333' + s;}; '333333' == s", "" ,"" ,T(1.0)),
2689
2690 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[:]; x == '0XXXX'", "","",T(1.0)),
2691 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[:]; x == '01XXX'", "","",T(1.0)),
2692 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[:]; x == '012XX'", "","",T(1.0)),
2693 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[:]; x == '0123X'", "","",T(1.0)),
2694 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] := y[:]; x == '01234'", "","",T(1.0)),
2695 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[6:]; x == '6XXXX'", "","",T(1.0)),
2696 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[6:]; x == '67XXX'", "","",T(1.0)),
2697 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[6:]; x == '678XX'", "","",T(1.0)),
2698 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[6:]; x == '6789X'", "","",T(1.0)),
2699 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] := y[6:]; x == '67890'", "","",T(1.0)),
2700 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] <=> y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
2701 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] <=> y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
2702 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] <=> y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
2703 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] <=> y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
2704 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] <=> y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
2705 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] <=> y[6:]; (x == '6XXXX') and (y == '012345X7890')", "","",T(1.0)),
2706 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] <=> y[6:]; (x == '67XXX') and (y == '012345XX890')", "","",T(1.0)),
2707 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] <=> y[6:]; (x == '678XX') and (y == '012345XXX90')", "","",T(1.0)),
2708 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] <=> y[6:]; (x == '6789X') and (y == '012345XXXX0')", "","",T(1.0)),
2709 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] <=> y[6:]; (x == '67890') and (y == '012345XXXXX')", "","",T(1.0)),
2710 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] := y[:]; x == '0XXXX'", "","",T(1.0)),
2711 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] := y[:]; x == '01XXX'", "","",T(1.0)),
2712 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] := y[:]; x == '012XX'", "","",T(1.0)),
2713 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] := y[:]; x == '0123X'", "","",T(1.0)),
2714 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+5] := y[:]; x == '01234'", "","",T(1.0)),
2715 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] <=> y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
2716 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] <=> y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
2717 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] <=> y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
2718 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] <=> y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
2719 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+5] <=> y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
2720
2721 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)),
2722 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)),
2723 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)),
2724 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)),
2725
2726 test_ab<T>("a like b", "abcd", "abcd*", T(1.0)),
2727 test_ab<T>("a like b", "abcd", "abcd" , T(1.0)),
2728 test_ab<T>("a like b", "abcd", "abc*" , T(1.0)),
2729 test_ab<T>("a like b", "abcd", "*bcd" , T(1.0)),
2730 test_ab<T>("a like b", "abcd", "abc?" , T(1.0)),
2731 test_ab<T>("a like b", "abcd", "?bcd" , T(1.0)),
2732 test_ab<T>("a like b", "abcd", "ab?d" , T(1.0)),
2733 test_ab<T>("a like b", "abcd", "ab*d" , T(1.0)),
2734 test_ab<T>("a like b", "abcd", "a?cd" , T(1.0)),
2735 test_ab<T>("a like b", "abcd", "a*cd" , T(1.0)),
2736 test_ab<T>("a like b", "abcd", "a??d" , T(1.0)),
2737 test_ab<T>("a like b", "abcd", "a*?d" , T(1.0)),
2738 test_ab<T>("a like b", "abcd", "*bc*" , T(1.0)),
2739 test_ab<T>("a like b", "abcd", "?bc?" , T(1.0)),
2740 test_ab<T>("a like b", "abcd", "????" , T(1.0)),
2741 test_ab<T>("a like b", "abcd", "a???" , T(1.0)),
2742 test_ab<T>("a like b", "abcd", "ab??" , T(1.0)),
2743 test_ab<T>("a like b", "abcd", "abc?" , T(1.0)),
2744 test_ab<T>("a like b", "abcd", "???d" , T(1.0)),
2745 test_ab<T>("a like b", "abcd", "??cd" , T(1.0)),
2746 test_ab<T>("a like b", "abcd", "?bcd" , T(1.0)),
2747 test_ab<T>("a like b", "abcd", "?b?d" , T(1.0)),
2748 test_ab<T>("a like b", "abcd", "a?c?" , T(1.0)),
2749 test_ab<T>("a like b", "abcd", "a??d" , T(1.0)),
2750 test_ab<T>("a like b", "abcd", "?bc?" , T(1.0)),
2751 test_ab<T>("a like b", "abcd", "ab**" , T(1.0)),
2752 test_ab<T>("a like b", "abcd", "ab*?" , T(1.0)),
2753 test_ab<T>("a like b", "abcd", "a***" , T(1.0)),
2754 test_ab<T>("a like b", "abcd", "**cd" , T(1.0)),
2755 test_ab<T>("a like b", "abcd", "*?cd" , T(1.0)),
2756 test_ab<T>("a like b", "abcd", "***d" , T(1.0)),
2757 test_ab<T>("a like b", "abcd", "*bc*" , T(1.0)),
2758 test_ab<T>("a like b", "abcd", "*bc?" , T(1.0)),
2759 test_ab<T>("a like b", "abcd", "*b??" , T(1.0)),
2760 test_ab<T>("a like b", "abcd", "?bc*" , T(1.0)),
2761 test_ab<T>("a like b", "abcd", "??c*" , T(1.0)),
2762 test_ab<T>("a like b", "abcd", "*b?*" , T(1.0)),
2763 test_ab<T>("a like b", "ab" , "a*" , T(1.0)),
2764 test_ab<T>("a like b", "ab" , "a?" , T(1.0)),
2765
2766 test_ab<T>("a ilike b", "aBcD", "abcd*", T(1.0)),
2767 test_ab<T>("a ilike b", "aBcD", "abcd" , T(1.0)),
2768 test_ab<T>("a ilike b", "aBcD", "abc*" , T(1.0)),
2769 test_ab<T>("a ilike b", "aBcD", "*bcd" , T(1.0)),
2770 test_ab<T>("a ilike b", "aBcD", "abc?" , T(1.0)),
2771 test_ab<T>("a ilike b", "aBcD", "?bcd" , T(1.0)),
2772 test_ab<T>("a ilike b", "aBcD", "ab?d" , T(1.0)),
2773 test_ab<T>("a ilike b", "aBcD", "ab*d" , T(1.0)),
2774 test_ab<T>("a ilike b", "aBcD", "a?cd" , T(1.0)),
2775 test_ab<T>("a ilike b", "aBcD", "a*cd" , T(1.0)),
2776 test_ab<T>("a ilike b", "aBcD", "a??d" , T(1.0)),
2777 test_ab<T>("a ilike b", "aBcD", "a*?d" , T(1.0)),
2778 test_ab<T>("a ilike b", "aBcD", "*bc*" , T(1.0)),
2779 test_ab<T>("a ilike b", "aBcD", "?bc?" , T(1.0)),
2780 test_ab<T>("a ilike b", "aBcD", "????" , T(1.0)),
2781 test_ab<T>("a ilike b", "aBcD", "a???" , T(1.0)),
2782 test_ab<T>("a ilike b", "aBcD", "ab??" , T(1.0)),
2783 test_ab<T>("a ilike b", "aBcD", "abc?" , T(1.0)),
2784 test_ab<T>("a ilike b", "aBcD", "???d" , T(1.0)),
2785 test_ab<T>("a ilike b", "aBcD", "??cd" , T(1.0)),
2786 test_ab<T>("a ilike b", "aBcD", "?bcd" , T(1.0)),
2787 test_ab<T>("a ilike b", "aBcD", "?b?d" , T(1.0)),
2788 test_ab<T>("a ilike b", "aBcD", "a?c?" , T(1.0)),
2789 test_ab<T>("a ilike b", "aBcD", "a??d" , T(1.0)),
2790 test_ab<T>("a ilike b", "aBcD", "?bc?" , T(1.0)),
2791 test_ab<T>("a ilike b", "aBcD", "ab**" , T(1.0)),
2792 test_ab<T>("a ilike b", "aBcD", "ab*?" , T(1.0)),
2793 test_ab<T>("a ilike b", "aBcD", "a***" , T(1.0)),
2794 test_ab<T>("a ilike b", "aBcD", "**cd" , T(1.0)),
2795 test_ab<T>("a ilike b", "aBcD", "*?cd" , T(1.0)),
2796 test_ab<T>("a ilike b", "aBcD", "***d" , T(1.0)),
2797 test_ab<T>("a ilike b", "aBcD", "*bc*" , T(1.0)),
2798 test_ab<T>("a ilike b", "aBcD", "*bc?" , T(1.0)),
2799 test_ab<T>("a ilike b", "aBcD", "*b??" , T(1.0)),
2800 test_ab<T>("a ilike b", "aBcD", "?bc*" , T(1.0)),
2801 test_ab<T>("a ilike b", "aBcD", "??c*" , T(1.0)),
2802 test_ab<T>("a ilike b", "aBcD", "*b?*" , T(1.0)),
2803 test_ab<T>("a ilike b", "aB" , "a*" , T(1.0)),
2804 test_ab<T>("a ilike b", "aB" , "a?" , T(1.0))
2805 };
2806
2807 static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_ab<T>);
2808
2809 {
2810 const std::size_t rounds = 50;
2811
2812 for (std::size_t r = 0; r < rounds; ++r)
2813 {
2814 bool result = true;
2815
2816 for (std::size_t i = 0; i < test_list_size; ++i)
2817 {
2818 test_ab<T>& test = const_cast<test_ab<T>&>(test_list[i]);
2819
2820 std::string str_a;
2821 std::string str_b;
2822 std::string str_c;
2823
2824 T r0 = T(2);
2825 T r1 = T(6);
2826 T r2 = T(7);
2827 T r3 = T(3);
2828
2829 exprtk::symbol_table<T> symbol_table;
2830 symbol_table.add_stringvar("a", str_a);
2831 symbol_table.add_stringvar("b", str_b);
2832 symbol_table.add_stringvar("c", str_c);
2833 symbol_table.add_variable("r0", r0);
2834 symbol_table.add_variable("r1", r1);
2835 symbol_table.add_variable("r2", r2);
2836 symbol_table.add_variable("r3", r3);
2837
2838 exprtk::expression<T> expression;
2839 expression.register_symbol_table(symbol_table);
2840
2841 {
2842 exprtk::parser<T> parser;
2843
2844 if (!parser.compile(test.expr, expression))
2845 {
2846 printf("run_test02() - Error: %s Expression: %s\n",
2847 parser.error().c_str(),
2848 test.expr.c_str());
2849
2850 result = false;
2851 continue;
2852 }
2853 }
2854
2855 str_a = test.a;
2856 str_b = test.b;
2857 str_c = test.c;
2858
2859 T expr_result = expression.value();
2860
2861 if (not_equal(expr_result, test.result))
2862 {
2863 printf("run_test02() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\t"
2864 "a='%s'\tb='%s'\tc='%s'\n",
2865 test.expr.c_str(),
2866 test.result.toDouble(),
2867 expr_result.toDouble(),
2868 str_a.c_str(),
2869 str_b.c_str(),
2870 str_c.c_str());
2871
2872 result = false;
2873 continue;
2874 }
2875 }
2876
2877 if (!result)
2878 {
2879 return false;
2880 }
2881 }
2882 }
2883
2884 {
2885 std::string s0;
2886 std::string s1;
2887
2888 const std::string expression_str =
2889 " s0 := 'abc'; "
2890 " s0 := (s1 := '0123456789'[2:8]); "
2891 " s1 := 'xyz'; "
2892 " s0 < s1; ";
2893
2894 exprtk::symbol_table<T> symbol_table;
2895 symbol_table.add_stringvar("s0" ,s0);
2896 symbol_table.add_stringvar("s1" ,s1);
2897
2898 exprtk::expression<T> expression;
2899 expression.register_symbol_table(symbol_table);
2900
2901 {
2902 exprtk::parser<T> parser;
2903
2904 if (!parser.compile(expression_str,expression))
2905 {
2906 printf("run_test02() - [2] Error: %s Expression: %s\n",
2907 parser.error().c_str(),
2908 expression_str.c_str());
2909
2910 return false;
2911 }
2912 }
2913
2914 if (T(0) == expression.value())
2915 {
2916 printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tExpected: True\n",
2917 expression_str.c_str());
2918
2919 return false;
2920 }
2921 else if ("234567" != s0)
2922 {
2923 printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s0\n",
2924 expression_str.c_str());
2925
2926 return false;
2927 }
2928 else if ("xyz" != s1)
2929 {
2930 printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s1\n",
2931 expression_str.c_str());
2932
2933 return false;
2934 }
2935 }
2936
2937 return true;
2938}
2939
2940template <typename T>
2942{
2943 typedef exprtk::symbol_table<T> symbol_table_t;
2944 typedef exprtk::expression<T> expression_t;
2945 typedef exprtk::parser<T> parser_t;
2946
2947 const std::string expression_string =
2948 "A+A0+aA+Aa0+b+B1+Bb+bB1+A+A0+AA+AA0+B+B1+BB+BB1+a+a0+aa+aa0+b+b1+bb+bb1+"
2949 "c+C2+Cc+Cc2+D+D3+dD+dD3+C+C2+CC+CC2+D+D3+DD+DD3+c+c2+cc+cc2+d+d3+dd+dd3+"
2950 "E+E4+eE+Ee4+f+F5+Ff+fF5+E+E4+EE+EE4+F+F5+FF+FF5+e+e4+ee+ee4+f+f5+ff+ff5+"
2951 "g+G6+Gg+Gg6+H+H7+hH+hH7+G+G6+GG+GG6+H+H7+HH+HH7+g+g6+gg+gg6+h+h7+hh+hh7+"
2952 "I+I8+iI+Ii8+j+J9+Jj+jJ9+I+I8+II+II8+J+J9+JJ+JJ9+i+i8+ii+ii8+j+j9+jj+jj9+"
2953 "k+K0+Kk+Kk0+L+L1+lL+lL1+K+K0+KK+KK0+L+L1+LL+LL1+k+k0+kk+kk0+l+l1+ll+ll1+"
2954 "M+M2+mM+Mm2+n+N3+Nn+nN3+M+M2+MM+MM2+N+N3+NN+NN3+m+m2+mm+mm2+n+n3+nn+nn3+"
2955 "o+O4+Oo+Oo4+P+P5+pP+pP5+O+O4+OO+OO4+P+P5+PP+PP5+o+o4+oo+oo4+p+p5+pp+pp5+"
2956 "Q+Q6+qQ+Qq6+r+R7+Rr+rR7+Q+Q6+QQ+QQ6+R+R7+RR+RR7+q+q6+qq+qq6+r+r7+rr+rr7+"
2957 "s+S8+Ss+Ss8+T+T9+tT+tT9+S+S8+SS+SS8+T+T9+TT+TT9+s+s8+ss+ss8+t+t9+tt+tt9+"
2958 "U+U0+uU+Uu0+v+V1+Vv+vV1+U+U0+UU+UU0+V+V1+VV+VV1+u+u0+uu+uu0+v+v1+vv+vv1+"
2959 "w+W2+Ww+Ww2+X+X3+xX+xX3+W+W2+WW+WW2+X+X3+XX+XX3+w+w2+ww+ww2+x+x3+xx+xx3+"
2960 "Y+Y4+yY+Yy4+z+Z5+Zz+zZ5+Y+Y4+YY+YY4+Z+Z5+ZZ+ZZ5+y+y4+yy+yy4+z+z5+zz+zz5 ";
2961
2962 static const std::string variable_list[] =
2963 {
2964 "A", "A0", "aA", "Aa0", "b", "B1", "Bb", "bB1",
2965 "c", "C2", "Cc", "Cc2", "D", "D3", "dD", "dD3",
2966 "E", "E4", "eE", "Ee4", "f", "F5", "Ff", "fF5",
2967 "g", "G6", "Gg", "Gg6", "H", "H7", "hH", "hH7",
2968 "I", "I8", "iI", "Ii8", "j", "J9", "Jj", "jJ9",
2969 "k", "K0", "Kk", "Kk0", "L", "L1", "lL", "lL1",
2970 "M", "M2", "mM", "Mm2", "n", "N3", "Nn", "nN3",
2971 "o", "O4", "Oo", "Oo4", "P", "P5", "pP", "pP5",
2972 "Q", "Q6", "qQ", "Qq6", "r", "R7", "Rr", "rR7",
2973 "s", "S8", "Ss", "Ss8", "T", "T9", "tT", "tT9",
2974 "U", "U0", "uU", "Uu0", "v", "V1", "Vv", "vV1",
2975 "w", "W2", "Ww", "Ww2", "X", "X3", "xX", "xX3",
2976 "Y", "Y4", "yY", "Yy4", "z", "Z5", "Zz", "zZ5"
2977 };
2978
2979 static const std::size_t variable_list_size = sizeof(variable_list) / sizeof(std::string);
2980
2981 static const std::size_t rounds = 300;
2982
2983 for (std::size_t r = 0; r < rounds; ++r)
2984 {
2985 symbol_table_t symbol_table_0;
2986 symbol_table_t symbol_table_1;
2987 expression_t expression;
2988
2989 std::vector<T> v;
2990 v.resize(variable_list_size);
2991
2992 for (std::size_t i = 0; i < variable_list_size; ++i)
2993 {
2994 v[i] = T(i);
2995 if (i & 1)
2996 symbol_table_0.add_variable(variable_list[i],v[i]);
2997 else
2998 symbol_table_1.add_variable(variable_list[i],v[i]);
2999 }
3000
3001 std::size_t total_symbol_count = symbol_table_0.variable_count() +
3002 symbol_table_1.variable_count();
3003
3004 if (variable_list_size != total_symbol_count)
3005 {
3006 printf("run_test03() - Error - Invalid number of variables in symbol_table! Expected: %d got: %d\n",
3007 static_cast<unsigned int>(variable_list_size),
3008 static_cast<unsigned int>(total_symbol_count));
3009
3010 return false;
3011 }
3012
3013 symbol_table_0.add_constants();
3014
3015 expression.register_symbol_table(symbol_table_0);
3016 expression.register_symbol_table(symbol_table_1);
3017
3018 {
3019 exprtk::parser<T> parser;
3020
3021 if (!parser.compile(expression_string,expression))
3022 {
3023 printf("run_test03() - Error: %s Expression: %s\n",
3024 parser.error().c_str(),
3025 expression_string.c_str());
3026
3027 return false;
3028 }
3029 }
3030
3031 expression.value();
3032 }
3033
3034 {
3035 static const std::string invalid_expr[] =
3036 {
3037 "x y",
3038 "x y z",
3039 "x y z w",
3040 "x 1",
3041 "x 1 2",
3042 "x 1 2 3",
3043 "x 'abc'",
3044 "x 1 'abc'",
3045 "x 'abc' 1",
3046 "1 2",
3047 "1 2 3",
3048 "1 2 3 4",
3049 "'abc' 'xyz'",
3050 "'abc' 1",
3051 "1 'abc'",
3052 "x sin(1)",
3053 "s 'abc'",
3054 "s x",
3055 "s y",
3056 "s 1",
3057 "s 1 x",
3058 "s 1 y",
3059 "s x 1",
3060 "s y 1",
3061 "x s ",
3062 "y s ",
3063 "1 s ",
3064 "1 s x",
3065 "1 s y",
3066 "x s 1",
3067 "y s 1",
3068 "v 'abc'",
3069 "v x ",
3070 "v y ",
3071 "v s ",
3072 "v 1 ",
3073 "v 1 x",
3074 "v 1 y",
3075 "v 1 s",
3076 "v x 1",
3077 "v y 1",
3078 "v s 1",
3079 "x v ",
3080 "y v ",
3081 "1 v ",
3082 "1 v x",
3083 "1 v y",
3084 "x v 1",
3085 "y v 1",
3086
3087 "(x == 'a string' )",
3088 "(x == 'a string'[1:3] )",
3089 "(x == 'a string' + 'b string' )",
3090 "(x == ('a string' + 'b string')[3:6])",
3091 "('a string' == x )",
3092 "('a string'[1:3] == x )",
3093 "('a string' + 'b string' == x )",
3094 "(('a string' + 'b string')[3:6] == x)",
3095
3096 "var a; var b; 3in(a)+sin(b) ",
3097 "var a; var b; sin(a)+3in(b) ",
3098 "var a; var b; sqrt(a)<3in(8) ",
3099 "var a; var b; (1.99-3in((b-b))) ",
3100 "var a; var b; ((3in(sin((b+b)))/1.06)-a) ",
3101 "var a; var b; ((sin(3in((b+b)))/1.06)-a) ",
3102 "var a; var b; (3in(x*(y+z))+cos(x*(y-z))) ",
3103 "var a; var b; (cos(x*(y+z))+3in(x*(y-z))) ",
3104
3105 "1++++",
3106 "1+-+-+",
3107 "1===",
3108 "1====",
3109 "[*][*][*][*][*]",
3110
3111 "var v[1] := {}; var s0appe0 := false; repeat s0appe0 false for(){(){}}",
3112 "var v[2] := {}; repeat var s0appe0 := false; s0appe0 false for(){(){}}",
3113 "var v[3] := {}; repeat var s0appe0 := false; for(){(){}} s0appe0 false",
3114 "var v[4] := {}; repeat var s0appe0 := false; s0appe0 for(){(){}} false",
3115 "var v[5] := {}; repeat for(){(){}} var s0appe0 := false; s0appe0 false",
3116 "var v{};v ;v 60;v 60;v o5",
3117
3118 "var vv[4] := [0]; v[k]",
3119 "var vv[4] := [0]; v[k + 1]",
3120 "var vv[4] := [0]; v[1 + k]"
3121 };
3122
3123 const std::size_t invalid_expr_size = sizeof(invalid_expr) / sizeof(std::string);
3124
3125 {
3126 for (std::size_t i = 0; i < invalid_expr_size; ++i)
3127 {
3128 symbol_table_t symbol_table;
3129 expression_t expression;
3130 parser_t parser;
3131
3132 T x = T(0);
3133 std::string s;
3134 std::vector<T> v(10, T(1.234));
3135
3136 symbol_table.add_variable ("x",x);
3137 symbol_table.add_stringvar("s",s);
3138 symbol_table.add_vector ("v",v);
3139
3140 if (parser.compile(invalid_expr[i],expression))
3141 {
3142 printf("run_test03() - Error: [1] Invalid expression compiled successfuly. Expression: %s\n",
3143 invalid_expr[i].c_str());
3144
3145 return false;
3146 }
3147 }
3148 }
3149
3150 {
3151 T x = T(0);
3152 std::string s;
3153 std::vector<T> v(10, T(1.234));
3154
3155 symbol_table_t symbol_table;
3156 parser_t parser;
3157
3158 symbol_table.add_variable ("x",x);
3159 symbol_table.add_stringvar("s",s);
3160 symbol_table.add_vector ("v",v);
3161
3162 for (std::size_t i = 0; i < invalid_expr_size; ++i)
3163 {
3164 exprtk::expression<T> expression;
3165
3166 if (parser.compile(invalid_expr[i],expression))
3167 {
3168 printf("run_test03() - Error: [2] Invalid expression compiled successfuly. Expression: %s\n",
3169 invalid_expr[i].c_str());
3170
3171 return false;
3172 }
3173 }
3174 }
3175
3176 {
3177 const std::string base_expression =
3178 "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)+"
3179 "(((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)";
3180
3181 const std::string mod =
3182 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789^+-/*,;:<>=%?[]{}() #&'\"\\\t\r\n";
3183
3184 symbol_table_t symbol_table;
3185 expression_t expression;
3186 parser_t parser;
3187
3188 T a = T(1.1 );
3189 T b = T(2.2 );
3190 T c = T(3.3 );
3191 T d = T(4.5 );
3192 T e = T(4.5 );
3193 T x = T(2.123456);
3194 T y = T(3.123456);
3195 T z = T(4.123456);
3196 T w = T(5.123456);
3197
3198 symbol_table.add_variable("a", a);
3199 symbol_table.add_variable("b", b);
3200 symbol_table.add_variable("c", c);
3201 symbol_table.add_variable("d", d);
3202 symbol_table.add_variable("e", e);
3203
3204 symbol_table.add_variable("x", x);
3205 symbol_table.add_variable("y", y);
3206 symbol_table.add_variable("z", z);
3207 symbol_table.add_variable("w", w);
3208
3209 expression.register_symbol_table(symbol_table);
3210
3211 T total = T(0);
3212
3213 for (std::size_t j = 0; j < base_expression.size(); ++j)
3214 {
3215 std::string expression_str = base_expression;
3216 const char old_c = base_expression[j];
3217
3218 for (std::size_t i = 0; i < mod.size(); ++i)
3219 {
3220 expression_str[j] = mod[i];
3221
3222 if (parser.compile(expression_str, expression))
3223 {
3224 total += expression.value();
3225 }
3226 }
3227
3228 expression_str[j] = old_c;
3229 }
3230
3231 if (total == T(12345.6789)) { printf(" "); }
3232 }
3233 }
3234
3235 return true;
3236}
3237
3238template <typename T>
3239inline T clamp(const T& l, const T& v, const T& u)
3240{
3241 return (v < l) ? l : ((v > u) ? u : v);
3242}
3243
3244template <typename T>
3246{
3247 const std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(y / 2 * pi),+1.0)";
3248
3249 exprtk::symbol_table<T> symbol_table;
3250 exprtk::expression<T> expression;
3251
3252 T x = T(-1000);
3253 T y = T(-1000);
3254
3255 symbol_table.add_variable("x",x);
3256 symbol_table.add_variable("y",y);
3257 symbol_table.add_constants();
3258
3259 expression.register_symbol_table(symbol_table);
3260
3261 {
3262 exprtk::parser<T> parser;
3263
3264 if (!parser.compile(expression_string,expression))
3265 {
3266 printf("run_test04() - Error: %s Expression: %s\n",
3267 parser.error().c_str(),
3268 expression_string.c_str());
3269
3270 return false;
3271 }
3272 }
3273
3274 const T pi = T(3.141592653589793238462643383279502);
3275 const T increment = T(0.001);
3276
3277 while ((x <= T(+1000)) && (y <= T(+1000)))
3278 {
3279 T result1 = expression.value();
3280 T result2 = clamp<T>(-1.0,mpfr::sin(2 * pi * x) + mpfr::cos(y / 2 * pi),+1.0);
3281
3282 if (not_equal(result1,result2))
3283 {
3284 printf("run_test04() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\n",
3285 expression_string.c_str(),
3286 result1.toDouble(),
3287 result2.toDouble(),
3288 x.toDouble(),
3289 y.toDouble());
3290
3291 return false;
3292 }
3293
3294 x += increment;
3295 y += increment;
3296 }
3297
3298 return true;
3299}
3300
3301template <typename T>
3303{
3304 typedef exprtk::expression<T> expression_t;
3305
3306 const std::string expression_string = "clamp(-1.0,sin(2 * pi * x_var123) + cos(y_var123 / 2 * pi),+1.0)";
3307
3308 exprtk::symbol_table<T> symbol_table;
3309 std::deque<expression_t> expression_list;
3310
3311 T x = T(-1000);
3312 T y = T(-1000);
3313
3314 symbol_table.add_variable("x_var123",x);
3315 symbol_table.add_variable("y_var123",y);
3316 symbol_table.add_constants();
3317
3318 const std::size_t expression_count = 10;
3319 for (std::size_t i = 0; i < expression_count; ++i)
3320 {
3321 expression_t e;
3322 e.register_symbol_table(symbol_table);
3323
3324 {
3325 exprtk::parser<T> parser;
3326
3327 if (!parser.compile(expression_string,e))
3328 {
3329 printf("run_test05() - Error: %s Expression: %s\n",
3330 parser.error().c_str(),
3331 expression_string.c_str());
3332
3333 return false;
3334 }
3335 }
3336
3337 expression_list.push_back(e);
3338 }
3339
3340 const T pi = T(3.141592653589793238462643383279502);
3341 const T increment = T(0.01);
3342
3343 while ((x <= T(+1000)) && (y <= T(+1000)))
3344 {
3345 T real_result = clamp<T>(-1.0,mpfr::sin(2 * pi * x) + mpfr::cos(y / 2 * pi),+1.0);
3346
3347 for (std::size_t i = 0; i < expression_list.size(); ++i)
3348 {
3349 expression_t& expr = expression_list[i];
3350
3351 T result = expr.value();
3352
3353 if (not_equal(result,real_result))
3354 {
3355 printf("run_test05() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\tIndex:%d\n",
3356 expression_string.c_str(),
3357 real_result.toDouble(),
3358 result.toDouble(),
3359 x.toDouble(),
3360 y.toDouble(),
3361 static_cast<unsigned int>(i));
3362
3363 return false;
3364 }
3365 }
3366
3367 x += increment;
3368 y += increment;
3369 }
3370
3371 return true;
3372}
3373
3374template <typename T>
3376{
3377 typedef exprtk::expression<T> expression_t;
3378
3379 const std::string expression_string = "sqrt(1 - (x^2))";
3380
3381 T x = T(0);
3382
3383 exprtk::symbol_table<T> symbol_table;
3384 symbol_table.add_variable("x",x);
3385
3386 expression_t expression;
3387 expression.register_symbol_table(symbol_table);
3388
3389 {
3390 exprtk::parser<T> parser;
3391
3392 if (!parser.compile(expression_string,expression))
3393 {
3394 printf("run_test06() - Error: %s Expression: %s\n",
3395 parser.error().c_str(),
3396 expression_string.c_str());
3397
3398 return false;
3399 }
3400 }
3401
3402 T total_area1 = exprtk::integrate(expression,x,T(-1),T(1));
3403 T total_area2 = exprtk::integrate(expression,"x",T(-1),T(1));
3404 const T pi = T(3.141592653589793238462643383279502);
3405
3406 if (not_equal(total_area1,total_area2,T(0.000001)))
3407 {
3408 printf("run_test06() - Integration Error: area1 != area2\n");
3409 return false;
3410 }
3411
3412 if (not_equal(total_area1,T(pi) / T(2),T(0.000001)))
3413 {
3414 printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n",
3415 (pi / T(2)).toDouble(),
3416 total_area1.toDouble());
3417
3418 return false;
3419 }
3420
3421 return true;
3422}
3423
3424template <typename T>
3426{
3427 typedef exprtk::expression<T> expression_t;
3428
3429 const std::string expression_string = "sin(2x + 1 / 3)";
3430
3431 T x = T(0);
3432
3433 exprtk::symbol_table<T> symbol_table;
3434 symbol_table.add_variable("x",x);
3435
3436 expression_t expression;
3437 expression.register_symbol_table(symbol_table);
3438
3439 {
3440 exprtk::parser<T> parser;
3441
3442 if (!parser.compile(expression_string,expression))
3443 {
3444 printf("run_test07() - Error: %s Expression: %s\n",
3445 parser.error().c_str(),
3446 expression_string.c_str());
3447
3448 return false;
3449 }
3450 }
3451
3452 const T delta = T(1.0) / T(1e+8);
3453
3454 for (x = T(-200); x < T(200); x += T(0.01))
3455 {
3456 {
3457 T deriv1_real_result = T(2) * mpfr::cos(T(2) * x + (T(1) / T(3)));
3458 T deriv1_result1 = exprtk::derivative(expression, x, delta);
3459 T deriv1_result2 = exprtk::derivative(expression,"x", delta);
3460
3461 if (not_equal(deriv1_result1,deriv1_result2))
3462 {
3463 printf("run_test07() - 1st Derivative Error: result1 != result2\n");
3464 return false;
3465 }
3466
3467 if (not_equal(deriv1_result1,deriv1_real_result))
3468 {
3469 printf("run_test07() - 1st Derivative Error: x: %s\tExpected: %s\tResult: %s\n",
3470 x.toString().c_str(),
3471 deriv1_real_result.toString().c_str(),
3472 deriv1_result1.toString().c_str());
3473
3474 return false;
3475 }
3476 }
3477
3478 {
3479 T deriv2_real_result = T(-4) * mpfr::sin(T(2) * x + (T(1) / T(3)));
3480 T deriv2_result1 = exprtk::second_derivative(expression, x, delta);
3481 T deriv2_result2 = exprtk::second_derivative(expression,"x", delta);
3482
3483 if (not_equal(deriv2_result1,deriv2_result2))
3484 {
3485 printf("run_test07() - 2nd Derivative Error: result1 != result2\n");
3486 return false;
3487 }
3488
3489 if (not_equal(deriv2_result1,deriv2_real_result))
3490 {
3491 printf("run_test07() - 2nd Derivative Error: x: %s\tExpected: %s\tResult: %s\n",
3492 x.toString().c_str(),
3493 deriv2_real_result.toString().c_str(),
3494 deriv2_result1.toString().c_str());
3495
3496 return false;
3497 }
3498 }
3499
3500 {
3501 T deriv3_real_result = T(-8) * mpfr::cos(T(2) * x + (T(1) / T(3)));
3502 T deriv3_result1 = exprtk::third_derivative(expression, x , delta);
3503 T deriv3_result2 = exprtk::third_derivative(expression,"x", delta);
3504
3505 if (not_equal(deriv3_result1,deriv3_result2))
3506 {
3507 printf("run_test07() - 3rd Derivative Error: result1 != result2\n");
3508 return false;
3509 }
3510
3511 if (not_equal(deriv3_result1,deriv3_real_result))
3512 {
3513 printf("run_test07() - 3rd Derivative Error: x: %s\tExpected: %s\tResult: %s\n",
3514 x.toString().c_str(),
3515 deriv3_real_result.toString().c_str(),
3516 deriv3_result1.toString().c_str());
3517
3518 return false;
3519 }
3520 }
3521 }
3522
3523 return true;
3524}
3525
3526template <typename T>
3528{
3529
3530 static const std::string expr_str[] =
3531 {
3532 "x", "y", "z", "w", "u",
3533 "x + y + z + w + u",
3534 "x + y / z * w ^ u",
3535 "x:=1.1", "y:=2.2", "z:=3.3", "w:=4.4", "u:=5.5",
3536 "x:=x+1.1", "y:=y+2.2", "z:=z+3.3", "w:=w+4.4", "u:=u+5.5",
3537 "x:=1.1+x", "y:=2.2+y", "z:=3.3+z", "w:=4.4+w", "u:=5.5+u",
3538 "x:=(x <= 1.1)",
3539 "y:=(2.2 >= y)",
3540 "z:=(3.3 and z)",
3541 "w:=(4.4 or w)",
3542 "u:=(u xor 5.5)",
3543 "min(x,y) + min(x,y,z) + min(x,y,z,w) + min(x,y,z,w,y)",
3544 "max(x,y) + max(x,y,z) + max(x,y,z,w) + max(x,y,z,w,y)",
3545 "avg(x,y)",
3546 "avg(x,y,z)",
3547 "avg(x,y,z,w)",
3548 "avg(x,y,z,w,u)",
3549 "(u := u := min(x:=1,y:=2,z:=3)) == 1",
3550 "(2x+3y+4z+5w)==(2*x+3*y+4*z+5*w)",
3551 "(3(x+y)/2+1)==(3*(x+y)/2+1)",
3552 "((x+y)3+1/4)==((x+y)*3+1/4)",
3553 "((x+y)z+1/2)==((x+y)*z+1/2)",
3554 "(x+y^3/z) == (x+(y*y*y)/z)",
3555 "(z-x^3+y^2*7) == (z-(x*x*x)+(y*y)*7)",
3556 "(3min(x,y))==(3*min(x,y))",
3557 "(sin(x)y)==(sin(x)*y)",
3558 "(sin(x)cos(y)+1)==(sin(x)*cos(y)+1)",
3559 "(sgn(sin(x))cos(sgn(y))+1)==(sgn(sin(x))*cos(sgn(y))+1)",
3560 "equal($f00(x,y,z),(x+y)/z)",
3561 "equal($f01(x,y,z),(x+y)*z)",
3562 "equal($f02(x,y,z),(x+y)-z)",
3563 "equal($f03(x,y,z),(x+y)+z)",
3564 "equal($f04(x,y,z),(x-y)+z)",
3565 "equal($f05(x,y,z),(x-y)/z)",
3566 "equal($f06(x,y,z),(x-y)*z)",
3567 "equal($f07(x,y,z),(x*y)+z)",
3568 "equal($f08(x,y,z),(x*y)-z)",
3569 "equal($f09(x,y,z),(x*y)/z)",
3570 "equal($f10(x,y,z),(x*y)*z)",
3571 "equal($f11(x,y,z),(x/y)+z)",
3572 "equal($f12(x,y,z),(x/y)-z)",
3573 "equal($f13(x,y,z),(x/y)/z)",
3574 "equal($f14(x,y,z),(x/y)*z)",
3575 "equal($f15(x,y,z),x/(y+z))",
3576 "equal($f16(x,y,z),x/(y-z))",
3577 "equal($f17(x,y,z),x/(y*z))",
3578 "equal($f18(x,y,z),x/(y/z))",
3579 "equal($f19(x,y,z),x*(y+z))",
3580 "equal($f20(x,y,z),x*(y-z))",
3581 "equal($f21(x,y,z),x*(y*z))",
3582 "equal($f22(x,y,z),x*(y/z))",
3583 "equal($f23(x,y,z),x-(y+z))",
3584 "equal($f24(x,y,z),x-(y-z))",
3585 "equal($f25(x,y,z),x-(y/z))",
3586 "equal($f26(x,y,z),x-(y*z))",
3587 "equal($f27(x,y,z),x+(y*z))",
3588 "equal($f28(x,y,z),x+(y/z))",
3589 "equal($f29(x,y,z),x+(y+z))",
3590 "equal($f30(x,y,z),x+(y-z))",
3591 "equal($f31(x,y,z),x*y^2+z)",
3592 "equal($f32(x,y,z),x*y^3+z)",
3593 "equal($f33(x,y,z),x*y^4+z)",
3594 "equal($f34(x,y,z),x*y^5+z)",
3595 "equal($f35(x,y,z),x*y^6+z)",
3596 "equal($f36(x,y,z),x*y^7+z)",
3597 "equal($f37(x,y,z),x*y^8+z)",
3598 "equal($f38(x,y,z),x*y^9+z)",
3599 "equal($f39(x,y,z),x*log(y)+z)",
3600 "equal($f40(x,y,z),x*log(y)-z)",
3601 "equal($f41(x,y,z),x*log10(y)+z)",
3602 "equal($f42(x,y,z),x*log10(y)-z)",
3603 "equal($f43(x,y,z),x*sin(y)+z)",
3604 "equal($f44(x,y,z),x*sin(y)-z)",
3605 "equal($f45(x,y,z),x*cos(y)+z)",
3606 "equal($f46(x,y,z),x*cos(y)-z)",
3607 "equal($f47(x,y,z),if(0!=x,y,z))",
3608 "equal($f48(x,y,z,w),x+((y+z)/w))",
3609 "equal($f49(x,y,z,w),x+((y+z)*w))",
3610 "equal($f50(x,y,z,w),x+((y-z)/w))",
3611 "equal($f51(x,y,z,w),x+((y-z)*w))",
3612 "equal($f52(x,y,z,w),x+((y*z)/w))",
3613 "equal($f53(x,y,z,w),x+((y*z)*w))",
3614 "equal($f54(x,y,z,w),x+((y/z)+w))",
3615 "equal($f55(x,y,z,w),x+((y/z)/w))",
3616 "equal($f56(x,y,z,w),x+((y/z)*w))",
3617 "equal($f57(x,y,z,w),x-((y+z)/w))",
3618 "equal($f58(x,y,z,w),x-((y+z)*w))",
3619 "equal($f59(x,y,z,w),x-((y-z)/w))",
3620 "equal($f60(x,y,z,w),x-((y-z)*w))",
3621 "equal($f61(x,y,z,w),x-((y*z)/w))",
3622 "equal($f62(x,y,z,w),x-((y*z)*w))",
3623 "equal($f63(x,y,z,w),x-((y/z)/w))",
3624 "equal($f64(x,y,z,w),x-((y/z)*w))",
3625 "equal($f65(x,y,z,w),((x+y)*z)-w)",
3626 "equal($f66(x,y,z,w),((x-y)*z)-w)",
3627 "equal($f67(x,y,z,w),((x*y)*z)-w)",
3628 "equal($f68(x,y,z,w),((x/y)*z)-w)",
3629 "equal($f69(x,y,z,w),((x+y)/z)-w)",
3630 "equal($f70(x,y,z,w),((x-y)/z)-w)",
3631 "equal($f71(x,y,z,w),((x*y)/z)-w)",
3632 "equal($f72(x,y,z,w),((x/y)/z)-w)",
3633 "equal($f73(x,y,z,w),(x*y)+(z*w))",
3634 "equal($f74(x,y,z,w),(x*y)-(z*w))",
3635 "equal($f75(x,y,z,w),(x*y)+(z/w))",
3636 "equal($f76(x,y,z,w),(x*y)-(z/w))",
3637 "equal($f77(x,y,z,w),(x/y)+(z/w))",
3638 "equal($f78(x,y,z,w),(x/y)-(z/w))",
3639 "equal($f79(x,y,z,w),(x/y)-(z*w))",
3640 "equal($f80(x,y,z,w),x/(y+(z*w)))",
3641 "equal($f81(x,y,z,w),x/(y-(z*w)))",
3642 "equal($f82(x,y,z,w),x*(y+(z*w)))",
3643 "equal($f83(x,y,z,w),x*(y-(z*w)))",
3644 "equal($f84(x,y,z,w),x*y^2+z*w^2)",
3645 "equal($f85(x,y,z,w),x*y^3+z*w^3)",
3646 "equal($f86(x,y,z,w),x*y^4+z*w^4)",
3647 "equal($f87(x,y,z,w),x*y^5+z*w^5)",
3648 "equal($f88(x,y,z,w),x*y^6+z*w^6)",
3649 "equal($f89(x,y,z,w),x*y^7+z*w^7)",
3650 "equal($f90(x,y,z,w),x*y^8+z*w^8)",
3651 "equal($f91(x,y,z,w),x*y^9+z*w^9)",
3652 "equal($f92(x,y,z,w),if(x and y,z,w))",
3653 "equal($f93(x,y,z,w),if(x or y,z,w))",
3654 "equal($f94(x,y,z,w),if(x < y,z,w))",
3655 "equal($f95(x,y,z,w),if(x <= y,z,w))",
3656 "equal($f96(x,y,z,w),if(x > y,z,w))",
3657 "equal($f97(x,y,z,w),if(x >= y,z,w))",
3658 "equal($f98(x,y,z,w),if(equal(x,y),z,w))",
3659 "equal($f92(x,y,z,w),x and y ? z : w)",
3660 "equal($f93(x,y,z,w),x or y ? z : w)",
3661 "equal($f94(x,y,z,w),x < y ? z : w)",
3662 "equal($f95(x,y,z,w),x <= y ? z : w)",
3663 "equal($f96(x,y,z,w),x > y ? z : w)",
3664 "equal($f97(x,y,z,w),x >= y ? z : w)",
3665 "equal($f98(x,y,z,w),equal(x,y) ? z : w)",
3666 "equal($f99(x,y,z,w),x*sin(y)+z*cos(w))"
3667 };
3668
3669 static const std::size_t expr_str_size = sizeof(expr_str) / sizeof(std::string);
3670
3671 static const std::size_t rounds = 25;
3672
3673 for (std::size_t i = 0; i < rounds; ++i)
3674 {
3675 for (std::size_t j = 0; j < expr_str_size; ++j)
3676 {
3677 typedef exprtk::expression<T> expression_t;
3678
3679 T x = T(1.12345);
3680 T y = T(2.12345);
3681 T z = T(3.12345);
3682 T w = T(4.12345);
3683 T u = T(5.12345);
3684
3685 exprtk::symbol_table<T> symbol_table;
3686 symbol_table.add_variable("x",x);
3687 symbol_table.add_variable("y",y);
3688 symbol_table.add_variable("z",z);
3689 symbol_table.add_variable("w",w);
3690 symbol_table.add_variable("u",u);
3691
3692 expression_t expression;
3693 expression.register_symbol_table(symbol_table);
3694
3695 {
3696 exprtk::parser<T> parser;
3697
3698 if (!parser.compile(expr_str[j],expression))
3699 {
3700 printf("run_test08() - Error: %s Expression: %s\n",
3701 parser.error().c_str(),
3702 expr_str[j].c_str());
3703
3704 return false;
3705 }
3706 }
3707
3708 expression.value();
3709 }
3710 }
3711
3712 return true;
3713}
3714
3715template <typename T>
3717{
3718 using exprtk::ifunction<T>::operator();
3719
3721
3722 inline T operator()(const T& v1, const T& v2)
3723 {
3724 return T(1) + (v1 * v2) / T(3);
3725 }
3726};
3727
3728#define define_free_functions(N,Type) \
3729inline Type N##1(Type v0) { return v0; } \
3730inline Type N##2(Type v0, Type v1) { return v0 + v1; } \
3731inline Type N##3(Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
3732inline Type N##4(Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
3733inline Type N##5(Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
3734inline Type N##6(Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \
3735
3737#undef define_free_functions
3738
3739template <typename T>
3741{
3742 {
3743 static const std::size_t rounds = 1000;
3744
3745 for (std::size_t i = 0; i < rounds; ++i)
3746 {
3747 typedef exprtk::expression<T> expression_t;
3748 const std::string expression_string =
3749 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3750 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3751 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3752 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3753 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3754 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3755 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3756 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3757 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3758 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3759 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3760 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3761 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3762 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3763 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3764 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3765 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3766 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3767 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3768 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)";
3769
3770 T x = T(1) + (i / T(10000));
3771 T y = T(2) + (i / T(10000));
3772 myfunc<T> mf;
3773
3774 exprtk::symbol_table<T> symbol_table;
3775 symbol_table.add_variable("x",x);
3776 symbol_table.add_variable("y",y);
3777 symbol_table.add_function("myfunc0",mf);
3778 symbol_table.add_function("myfunc1",mf);
3779 symbol_table.add_function("myfunc2",mf);
3780 symbol_table.add_function("myfunc3",mf);
3781 symbol_table.add_function("myfunc4",mf);
3782 symbol_table.add_function("myfunc5",mf);
3783 symbol_table.add_function("myfunc6",mf);
3784 symbol_table.add_function("myfunc7",mf);
3785 symbol_table.add_function("myfunc8",mf);
3786 symbol_table.add_function("myfunc9",mf);
3787 symbol_table.add_constants();
3788
3789 expression_t expression;
3790 expression.register_symbol_table(symbol_table);
3791
3792 {
3793 exprtk::parser<T> parser;
3794
3795 if (!parser.compile(expression_string,expression))
3796 {
3797 printf("run_test09() - Error: %s Expression: %s\n",
3798 parser.error().c_str(),
3799 expression_string.c_str());
3800
3801 return false;
3802 }
3803 }
3804
3805 const T pi = T(3.141592653589793238462643383279502);
3806
3807 const T result = expression.value();
3808
3809 const T expected =
3810 T(4) *
3811 (
3812 mf(sin(x * pi), y / T(2)) +
3813 mf(sin(x * pi), y / T(2)) +
3814 mf(sin(x * pi), y / T(2)) +
3815 mf(sin(x * pi), y / T(2)) +
3816 mf(sin(x * pi), y / T(2)) +
3817 mf(sin(x * pi), y / T(2)) +
3818 mf(sin(x * pi), y / T(2)) +
3819 mf(sin(x * pi), y / T(2)) +
3820 mf(sin(x * pi), y / T(2)) +
3821 mf(sin(x * pi), y / T(2))
3822 );
3823
3824 if (not_equal(result,expected,T(0.0000001)))
3825 {
3826 printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n",
3827 static_cast<double>(expected),
3828 static_cast<double>(result));
3829
3830 return false;
3831 }
3832 }
3833 }
3834
3835 {
3836 typedef exprtk::expression<T> expression_t;
3837 typedef exprtk::symbol_table<T> symbol_table_t;
3838
3839 bool result = true;
3840
3841 const std::string expression_list[] =
3842 {
3843 "foo1(1) == 1",
3844 "foo2(1,2) == (1 + 2)",
3845 "foo3(1,2,3) == (1 + 2 + 3)",
3846 "foo4(1,2,3,4) == (1 + 2 + 3 + 4)",
3847 "foo5(1,2,3,4,5) == (1 + 2 + 3 + 4 + 5)",
3848 "foo6(1,2,3,4,5,6) == (1 + 2 + 3 + 4 + 5 + 6)"
3849 };
3850
3851 const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
3852
3853 symbol_table_t symbol_table;
3854
3855 symbol_table.add_function("foo1",foo1);
3856 symbol_table.add_function("foo2",foo2);
3857 symbol_table.add_function("foo3",foo3);
3858 symbol_table.add_function("foo4",foo4);
3859 symbol_table.add_function("foo5",foo5);
3860 symbol_table.add_function("foo6",foo6);
3861
3862 for (std::size_t i = 0; i < expression_list_size; ++i)
3863 {
3864 expression_t expression;
3865 expression.register_symbol_table(symbol_table);
3866
3867 exprtk::parser<T> parser;
3868
3869 if (!parser.compile(expression_list[i],expression))
3870 {
3871 printf("run_test09() - Error: %s Expression: %s\n",
3872 parser.error().c_str(),
3873 expression_list[i].c_str());
3874
3875 result = false;
3876 }
3877 }
3878
3879 if (!result)
3880 return false;
3881 }
3882
3883 return true;
3884}
3885
3886template <typename T>
3888{
3889 typedef exprtk::expression<T> expression_t;
3890
3891 T x = T(1.1);
3892 T y = T(2.2);
3893 T xx = T(3.3);
3894 T yy = T(4.4);
3895
3896 std::string i_s = "A String";
3897 std::string j_s = "Another String";
3898 std::string ii_s = "A String";
3899 std::string jj_s = "Another String";
3900
3901 struct test
3902 {
3903 static inline bool variable(exprtk::symbol_table<T>& symbol_table, const std::string& variable_name, const T& value)
3904 {
3905 exprtk::details::variable_node<T>* var = symbol_table.get_variable(variable_name);
3906
3907 if (var)
3908 return (!not_equal(var->ref(),value));
3909 else
3910 return false;
3911 }
3912
3913 static inline bool string(exprtk::symbol_table<T>& symbol_table, const std::string& string_name, const std::string& str)
3914 {
3915 exprtk::details::stringvar_node<T>* str_node = symbol_table.get_stringvar(string_name);
3916
3917 if (str_node)
3918 return (str_node->ref() == str);
3919 else
3920 return false;
3921 }
3922 };
3923
3924 {
3925 static const std::size_t rounds = 10;
3926
3927 exprtk::symbol_table<T> symbol_table;
3928
3929 for (std::size_t r = 0; r < rounds; ++r)
3930 {
3931 symbol_table.add_variable("x" , x );
3932 symbol_table.add_variable("y" , y );
3933 symbol_table.add_variable("xx", xx);
3934 symbol_table.add_variable("yy", yy);
3935
3936 if (!symbol_table.symbol_exists("x"))
3937 {
3938 printf("run_test10() - Symbol 'x' does not exist!\n");
3939 return false;
3940 }
3941 else if (!symbol_table.symbol_exists("y"))
3942 {
3943 printf("run_test10() - Symbol 'y' does not exist!\n");
3944 return false;
3945 }
3946 else if (!symbol_table.symbol_exists("xx"))
3947 {
3948 printf("run_test10() - Symbol 'xx' does not exist!\n");
3949 return false;
3950 }
3951 else if (!symbol_table.symbol_exists("yy"))
3952 {
3953 printf("run_test10() - Symbol 'yy' does not exist!\n");
3954 return false;
3955 }
3956 else if (!test::variable(symbol_table, "x", x))
3957 {
3958 printf("run_test10() - Symbol 'x' value failure!\n");
3959 return false;
3960 }
3961 else if (!test::variable(symbol_table, "y", y))
3962 {
3963 printf("run_test10() - Symbol 'y' value failure!\n");
3964 return false;
3965 }
3966 else if (!test::variable(symbol_table, "xx", xx))
3967 {
3968 printf("run_test10() - Symbol 'xx' value failure!\n");
3969 return false;
3970 }
3971 else if (!test::variable(symbol_table, "yy", yy))
3972 {
3973 printf("run_test10() - Symbol 'yy' value failure!\n");
3974 return false;
3975 }
3976
3977 if (!symbol_table.remove_variable("x"))
3978 {
3979 printf("run_test10() - Failed to remove symbol 'x'!\n");
3980 return false;
3981 }
3982 else if (!symbol_table.remove_variable("y"))
3983 {
3984 printf("run_test10() - Failed to remove symbol 'y'!\n");
3985 return false;
3986 }
3987 else if (!symbol_table.remove_variable("xx"))
3988 {
3989 printf("run_test10() - Failed to remove symbol 'xx'!\n");
3990 return false;
3991 }
3992 else if (!symbol_table.remove_variable("yy"))
3993 {
3994 printf("run_test10() - Failed to remove symbol 'yy'!\n");
3995 return false;
3996 }
3997 }
3998
3999 for (std::size_t r = 0; r < rounds; ++r)
4000 {
4001 myfunc<T> mf;
4002
4003 symbol_table.add_function("f", mf);
4004 symbol_table.add_function("f1", mf);
4005
4006 if (!symbol_table.symbol_exists("f"))
4007 {
4008 printf("run_test10() - function 'f' does not exist!\n");
4009 return false;
4010 }
4011 else if (!symbol_table.symbol_exists("f1"))
4012 {
4013 printf("run_test10() - function 'f1' does not exist!\n");
4014 return false;
4015 }
4016
4017 if (!symbol_table.remove_function("f"))
4018 {
4019 printf("run_test10() - Failed to remove function 'f'!\n");
4020 return false;
4021 }
4022 else if (!symbol_table.remove_function("f1"))
4023 {
4024 printf("run_test10() - Failed to remove function 'f1'!\n");
4025 return false;
4026 }
4027 }
4028
4029 for (std::size_t r = 0; r < rounds; ++r)
4030 {
4031 symbol_table.add_stringvar("i", i_s);
4032 symbol_table.add_stringvar("j", j_s);
4033
4034 symbol_table.add_stringvar("ii", ii_s);
4035 symbol_table.add_stringvar("jj", jj_s);
4036
4037 if (!symbol_table.symbol_exists("i"))
4038 {
4039 printf("run_test10() - String 'i' does not exist!\n");
4040 return false;
4041 }
4042 else if (!symbol_table.symbol_exists("j"))
4043 {
4044 printf("run_test10() - String 'j' does not exist!\n");
4045 return false;
4046 }
4047 else if (!symbol_table.symbol_exists("ii"))
4048 {
4049 printf("run_test10() - String 'ii' does not exist!\n");
4050 return false;
4051 }
4052 else if (!symbol_table.symbol_exists("jj"))
4053 {
4054 printf("run_test10() - String 'jj' does not exist!\n");
4055 return false;
4056 }
4057 else if (!test::string(symbol_table, "i", i_s))
4058 {
4059 printf("run_test10() - String 'i' value failure!\n");
4060 return false;
4061 }
4062 else if (!test::string(symbol_table, "j", j_s))
4063 {
4064 printf("run_test10() - String 'j' value failure!\n");
4065 return false;
4066 }
4067 else if (!test::string(symbol_table, "ii", ii_s))
4068 {
4069 printf("run_test10() - String 'ii' value failure!\n");
4070 return false;
4071 }
4072 else if (!test::string(symbol_table, "jj", jj_s))
4073 {
4074 printf("run_test10() - String 'jj' value failure!\n");
4075 return false;
4076 }
4077 else if (!symbol_table.remove_stringvar("i"))
4078 {
4079 printf("run_test10() - Failed to remove String 'i'!\n");
4080 return false;
4081 }
4082 else if (!symbol_table.remove_stringvar("j"))
4083 {
4084 printf("run_test10() - Failed to remove String 'j'!\n");
4085 return false;
4086 }
4087 else if (!symbol_table.remove_stringvar("ii"))
4088 {
4089 printf("run_test10() - Failed to remove String 'ii'!\n");
4090 return false;
4091 }
4092 else if (!symbol_table.remove_stringvar("jj"))
4093 {
4094 printf("run_test10() - Failed to remove String 'jj'!\n");
4095 return false;
4096 }
4097 }
4098
4099 for (std::size_t r = 0; r < rounds; ++r)
4100 {
4101 symbol_table.add_variable("x" , x );
4102 symbol_table.add_variable("y" , y );
4103 symbol_table.add_variable("xx", xx);
4104 symbol_table.add_variable("yy", yy);
4105
4106 std::vector<std::string> expected_var_list;
4107
4108 expected_var_list.push_back("x" );
4109 expected_var_list.push_back("y" );
4110 expected_var_list.push_back("xx");
4111 expected_var_list.push_back("yy");
4112
4113 std::deque<std::pair<std::string, T> > variable_list;
4114
4115 symbol_table.get_variable_list(variable_list);
4116
4117 if (variable_list.size() != expected_var_list.size())
4118 {
4119 printf("run_test10() - Failed to get variable list (1)\n");
4120 return false;
4121 }
4122
4123 std::size_t found_count = 0;
4124
4125 for (std::size_t i = 0; i < variable_list.size(); ++i)
4126 {
4127 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4128 {
4129 if (variable_list[i].first == expected_var_list[j])
4130 {
4131 ++found_count;
4132 break;
4133 }
4134 }
4135 }
4136
4137 if (found_count != expected_var_list.size())
4138 {
4139 printf("run_test10() - Failed to get variable list (2)\n");
4140 return false;
4141 }
4142 }
4143
4144 for (std::size_t r = 0; r < rounds; ++r)
4145 {
4146 symbol_table.add_variable("x" , x );
4147 symbol_table.add_variable("y" , y );
4148 symbol_table.add_variable("xx", xx);
4149 symbol_table.add_variable("yy", yy);
4150
4151 std::vector<std::string> expected_var_list;
4152
4153 expected_var_list.push_back("x" );
4154 expected_var_list.push_back("y" );
4155 expected_var_list.push_back("xx");
4156 expected_var_list.push_back("yy");
4157
4158 std::deque<std::string> variable_list;
4159
4160 symbol_table.get_variable_list(variable_list);
4161
4162 if (variable_list.size() != expected_var_list.size())
4163 {
4164 printf("run_test10() - Failed to get variable list (3)\n");
4165 return false;
4166 }
4167
4168 std::size_t found_count = 0;
4169
4170 for (std::size_t i = 0; i < variable_list.size(); ++i)
4171 {
4172 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4173 {
4174 if (variable_list[i] == expected_var_list[j])
4175 {
4176 ++found_count;
4177 break;
4178 }
4179 }
4180 }
4181
4182 if (found_count != expected_var_list.size())
4183 {
4184 printf("run_test10() - Failed to get variable list (4)\n");
4185 return false;
4186 }
4187 }
4188
4189 for (std::size_t r = 0; r < rounds; ++r)
4190 {
4191 symbol_table.add_stringvar("i" , i_s );
4192 symbol_table.add_stringvar("j" , j_s );
4193 symbol_table.add_stringvar("ii", ii_s);
4194 symbol_table.add_stringvar("jj", jj_s);
4195
4196 std::vector<std::string> expected_var_list;
4197
4198 expected_var_list.push_back("i" );
4199 expected_var_list.push_back("j" );
4200 expected_var_list.push_back("ii");
4201 expected_var_list.push_back("jj");
4202
4203 std::deque<std::pair<std::string, std::string> > stringvar_list;
4204
4205 symbol_table.get_stringvar_list(stringvar_list);
4206
4207 if (stringvar_list.size() != expected_var_list.size())
4208 {
4209 printf("run_test10() - Failed to get stringvar list (1)\n");
4210 return false;
4211 }
4212
4213 std::size_t found_count = 0;
4214
4215 for (std::size_t i = 0; i < stringvar_list.size(); ++i)
4216 {
4217 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4218 {
4219 if (stringvar_list[i].first == expected_var_list[j])
4220 {
4221 ++found_count;
4222 break;
4223 }
4224 }
4225 }
4226
4227 if (found_count != expected_var_list.size())
4228 {
4229 printf("run_test10() - Failed to get stringvar list (2)\n");
4230 return false;
4231 }
4232 }
4233
4234 for (std::size_t r = 0; r < rounds; ++r)
4235 {
4236 symbol_table.add_stringvar("i" , i_s );
4237 symbol_table.add_stringvar("j" , j_s );
4238 symbol_table.add_stringvar("ii", ii_s);
4239 symbol_table.add_stringvar("jj", jj_s);
4240
4241 std::vector<std::string> expected_var_list;
4242
4243 expected_var_list.push_back("i" );
4244 expected_var_list.push_back("j" );
4245 expected_var_list.push_back("ii");
4246 expected_var_list.push_back("jj");
4247
4248 std::deque<std::string> stringvar_list;
4249
4250 symbol_table.get_stringvar_list(stringvar_list);
4251
4252 if (stringvar_list.size() != expected_var_list.size())
4253 {
4254 printf("run_test10() - Failed to get stringvar list (3.0)\n");
4255 return false;
4256 }
4257
4258 if (symbol_table.stringvar_count() != expected_var_list.size())
4259 {
4260 printf("run_test10() - Failed to get stringvar list (3.1)\n");
4261 return false;
4262 }
4263
4264 std::size_t found_count = 0;
4265
4266 for (std::size_t i = 0; i < stringvar_list.size(); ++i)
4267 {
4268 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4269 {
4270 if (stringvar_list[i] == expected_var_list[j])
4271 {
4272 ++found_count;
4273 break;
4274 }
4275 }
4276 }
4277
4278 if (found_count != expected_var_list.size())
4279 {
4280 printf("run_test10() - Failed to get stringvar list (4)\n");
4281 return false;
4282 }
4283 }
4284 }
4285
4286 {
4287 T x0 = T(0);
4288 T y0 = T(0);
4289 T z0 = T(0);
4290
4291 std::string expression_string = "(x0 + y0) / z0";
4292
4293 static const std::size_t rounds = 100;
4294
4295 for (std::size_t i = 0; i < rounds; ++i)
4296 {
4297 expression_t expression0;
4298
4299 x0 = T(i + 1.11);
4300 y0 = T(i + 2.22);
4301 z0 = T(i + 3.33);
4302
4304
4305 st0.add_variable("x0",x0);
4306 st0.add_variable("y0",y0);
4307 st0.add_variable("z0",z0);
4308
4309 expression0.register_symbol_table(st0);
4310
4311 {
4312 exprtk::parser<T> parser;
4313
4314 if (!parser.compile(expression_string,expression0))
4315 {
4316 printf("run_test10() - Error: %s Expression: %s\n",
4317 parser.error().c_str(),
4318 expression_string.c_str());
4319
4320 return false;
4321 }
4322 }
4323
4324 {
4325 expression_t expression1;
4326 exprtk::symbol_table<T> st1 = st0;
4327 expression1.register_symbol_table(st1);
4328
4329 {
4330 exprtk::parser<T> parser;
4331
4332 if (!parser.compile(expression_string,expression1))
4333 {
4334 printf("run_test10() - Error: %s Expression: %s\n",
4335 parser.error().c_str(),
4336 expression_string.c_str());
4337
4338 return false;
4339 }
4340 }
4341
4342 st1.remove_variable("x0");
4343 st1.remove_variable("y0");
4344 st1.remove_variable("z0");
4345 }
4346 }
4347 }
4348
4349 {
4350 T a = T(1);
4351 T b = T(2);
4352 T c = T(3);
4353 T d = T(4);
4354
4355 std::string e = "string";
4356
4357 exprtk::symbol_table<T> symbol_table;
4358
4359 symbol_table.add_variable ("a",a);
4360 symbol_table.add_variable ("b",b);
4361 symbol_table.add_variable ("c",c);
4362 symbol_table.add_variable ("d",d);
4363 symbol_table.add_stringvar("e",e);
4364
4365 expression_t expression;
4366 expression.register_symbol_table(symbol_table);
4367
4368 std::string expression_string = "(E == '1234') and (sin(a) + C) / b";
4369
4370 typedef exprtk::parser<T> parser_t;
4371 typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
4372
4373 std::deque<symbol_t> symbol_list;
4374
4375 {
4376 parser_t parser;
4377
4378 parser.dec().collect_variables() = true;
4379 parser.dec().collect_functions() = true;
4380
4381 if (!parser.compile(expression_string,expression))
4382 {
4383 printf("run_test10() - Error: %s Expression: %s\n",
4384 parser.error().c_str(),
4385 expression_string.c_str());
4386
4387 return false;
4388 }
4389
4390 parser.dec().symbols(symbol_list);
4391 }
4392
4393 std::deque<symbol_t> expected_symbol_list;
4394
4395 expected_symbol_list.push_back(symbol_t("a" ,parser_t::e_st_variable));
4396 expected_symbol_list.push_back(symbol_t("b" ,parser_t::e_st_variable));
4397 expected_symbol_list.push_back(symbol_t("c" ,parser_t::e_st_variable));
4398 expected_symbol_list.push_back(symbol_t("e" ,parser_t::e_st_string ));
4399 expected_symbol_list.push_back(symbol_t("sin",parser_t::e_st_function));
4400
4401 bool result = (symbol_list.size() == expected_symbol_list.size()) &&
4402 std::equal(symbol_list.begin(),
4403 symbol_list.end(),
4404 expected_symbol_list.begin());
4405 if (!result)
4406 {
4407 printf("run_test10() - Failed variable list comparison.(5)\n");
4408 return false;
4409 }
4410 }
4411
4412 {
4413 T a = T(1);
4414 T b = T(2);
4415 T c = T(3);
4416 T d = T(4);
4417
4418 std::string e = "string";
4419
4420 exprtk::symbol_table<T> symbol_table;
4421
4422 symbol_table.add_variable ("a",a);
4423 symbol_table.add_variable ("b",b);
4424 symbol_table.add_variable ("c",c);
4425 symbol_table.add_variable ("d",d);
4426 symbol_table.add_stringvar("e",e);
4427
4428 expression_t expression;
4429 expression.register_symbol_table(symbol_table);
4430
4431 const std::string expression_string =
4432 "a := b + c; "
4433 "b := c + d; "
4434 "c := d + 1; "
4435 "e := e + 'abc'; ";
4436
4437 typedef exprtk::parser<T> parser_t;
4438 typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
4439
4440 std::deque<symbol_t> variable_list;
4441
4442 {
4443 parser_t parser;
4444
4445 parser.dec().collect_assignments() = true;
4446
4447 if (!parser.compile(expression_string,expression))
4448 {
4449 printf("run_test10() - Error: %s Expression: %s\n",
4450 parser.error().c_str(),
4451 expression_string.c_str());
4452
4453 return false;
4454 }
4455
4456 parser.dec().assignment_symbols(variable_list);
4457 }
4458
4459 std::deque<symbol_t> expected_assignment_list;
4460
4461 expected_assignment_list.push_back(symbol_t("a",parser_t::e_st_variable));
4462 expected_assignment_list.push_back(symbol_t("b",parser_t::e_st_variable));
4463 expected_assignment_list.push_back(symbol_t("c",parser_t::e_st_variable));
4464 expected_assignment_list.push_back(symbol_t("e",parser_t::e_st_string ));
4465
4466 bool result = (variable_list.size() == expected_assignment_list.size()) &&
4467 std::equal(variable_list.begin(),
4468 variable_list.end(),
4469 expected_assignment_list.begin());
4470 if (!result)
4471 {
4472 printf("run_test10() - Failed variable list comparison.(6)\n");
4473 return false;
4474 }
4475 }
4476
4477 {
4478 exprtk::symbol_table<T> symbol_table0;
4479 exprtk::symbol_table<T> symbol_table1;
4480
4481 if (symbol_table0 == symbol_table1)
4482 {
4483 printf("run_test10() - Error symbol_table0 and symbol_table1 are equal\n");
4484 return false;
4485 }
4486
4487 symbol_table0 = symbol_table1;
4488 symbol_table1 = symbol_table0;
4489
4490 if (!(symbol_table0 == symbol_table1))
4491 {
4492 printf("run_test10() - Error symbol_table0 and symbol_table1 are not equal\n");
4493 return false;
4494 }
4495 }
4496
4497 {
4498 T a = T(1);
4499 T b = T(2);
4500 T c = T(3);
4501 T d = T(4);
4502
4503 std::string e = "a string";
4504
4505 exprtk::symbol_table<T> symbol_table0;
4506 exprtk::symbol_table<T> symbol_table1;
4507 expression_t expression;
4508
4509 for (std::size_t i = 0; i < 10000; ++i)
4510 {
4511 symbol_table0.clear();
4512 symbol_table1.clear();
4513
4514 symbol_table0.add_variable ("a",a);
4515 symbol_table0.add_variable ("b",b);
4516 symbol_table0.add_variable ("c",c);
4517 symbol_table0.add_variable ("d",d);
4518 symbol_table0.add_stringvar("e",e);
4519 symbol_table0.add_constants( );
4520
4521 symbol_table1.add_variable ("a",a);
4522 symbol_table1.add_variable ("b",b);
4523 symbol_table1.add_variable ("c",c);
4524 symbol_table1.add_variable ("d",d);
4525 symbol_table1.add_stringvar("e",e);
4526 symbol_table1.add_constants( );
4527
4528 expression.register_symbol_table(symbol_table0);
4529 expression.register_symbol_table(symbol_table1);
4530 }
4531 }
4532
4533 {
4534 const std::string expression =
4535 "for (var i := 0; i < min(x[],y[],z[]); i += 1)"
4536 "{ z[i] := 3sin(x[i]) + 2log(y[i]); }";
4537
4538 std::vector<std::string> var_symbol_list;
4539 std::vector<std::string> func_symbol_list;
4540
4541 if (!exprtk::collect_variables(expression, var_symbol_list))
4542 {
4543 printf("run_test10() - Failed to collect variables.\n");
4544 return false;
4545 }
4546
4547 if (!exprtk::collect_functions(expression, func_symbol_list))
4548 {
4549 printf("run_test10() - Failed to collect functions.\n");
4550 return false;
4551 }
4552
4553 std::sort(var_symbol_list .begin(), var_symbol_list .end());
4554 std::sort(func_symbol_list.begin(), func_symbol_list.end());
4555
4556 std::vector<std::string> expected_var_symbol_list;
4557 std::vector<std::string> expected_func_symbol_list;
4558
4559 expected_var_symbol_list.push_back("i");
4560 expected_var_symbol_list.push_back("x");
4561 expected_var_symbol_list.push_back("y");
4562 expected_var_symbol_list.push_back("z");
4563
4564 expected_func_symbol_list.push_back("log");
4565 expected_func_symbol_list.push_back("min");
4566 expected_func_symbol_list.push_back("sin");
4567
4568 const bool var_result = (var_symbol_list.size() == expected_var_symbol_list.size()) &&
4569 std::equal(var_symbol_list.begin(),
4570 var_symbol_list.end(),
4571 expected_var_symbol_list.begin());
4572 if (!var_result)
4573 {
4574 printf("run_test10() - Failed collected variable comparison between received and expected variables\n");
4575 return false;
4576 }
4577
4578 const bool func_result = (func_symbol_list.size() == expected_func_symbol_list.size()) &&
4579 std::equal(func_symbol_list.begin(),
4580 func_symbol_list.end(),
4581 expected_func_symbol_list.begin());
4582 if (!func_result)
4583 {
4584 printf("run_test10() - Failed collected functions comparison between received and expected functions\n");
4585 return false;
4586 }
4587 }
4588
4589 {
4590 const std::string expression_list[] =
4591 {
4592 "var x; 1",
4593 "var x := 1; x",
4594 "var x:= 1; x - -1 == 2",
4595 "var x:= 1; x --1 == 2",
4596 "var x:= 1; x-- 1 == 2",
4597 "var x:= 1; x--1 == 2",
4598 "var x:= 1; x -- -1== 0",
4599 "var x:= 1; x + -1 == 0",
4600 "var x:= 1; x +-1 == 0",
4601 "var x:= 1; x+- 1 == 0",
4602 "var x:= 1; x+-1 == 0",
4603 "var x:= 1; x +- -1== 2",
4604 "var x:= 1; x + +1 == 2",
4605 "var x:= 1; x ++1 == 2",
4606 "var x:= 1; 1 - -x == 2",
4607 "var x:= 1; 1 --x == 2",
4608 "var x:= 1; 1-- x == 2",
4609 "var x:= 1; 1--x == 2",
4610 "var x:= 1; 1 -- -x== 0",
4611 "var x:= 1; 1 + -x == 0",
4612 "var x:= 1; 1 +-x == 0",
4613 "var x:= 1; 1+- x == 0",
4614 "var x:= 1; 1+-x == 0",
4615 "var x:= 1; 1 +- -x== 2",
4616 "var x:= 1; 1 + +x == 2",
4617 "var x:= 1; 1 ++x == 2",
4618 "var x:= 1; (x - -1 + 1) == 3",
4619 "var x:= 1; (x --1 + 1) == 3",
4620 "var x:= 1; (x-- 1 + 1) == 3",
4621 "var x:= 1; (x--1 + 1) == 3",
4622 "var x:= 1; (x -- -1 + 1) == 1",
4623 "var x:= 1; (x + -1 + 1) == 1",
4624 "var x:= 1; (x +-1 + 1) == 1",
4625 "var x:= 1; (x+- 1 + 1) == 1",
4626 "var x:= 1; (x+-1 + 1) == 1",
4627 "var x:= 1; (x +- -1 + 1) == 3",
4628 "var x:= 1; (x + +1 + 1) == 3",
4629 "var x:= 1; (x ++1 + 1) == 3",
4630 "var x:= 1; (1 - -x + 1) == 3",
4631 "var x:= 1; (1 --x + 1) == 3",
4632 "var x:= 1; (1-- x + 1) == 3",
4633 "var x:= 1; (1--x + 1) == 3",
4634 "var x:= 1; (1 -- -x + 1) == 1",
4635 "var x:= 1; (1 + -x + 1) == 1",
4636 "var x:= 1; (1 +-x + 1) == 1",
4637 "var x:= 1; (1+- x + 1) == 1",
4638 "var x:= 1; (1+-x + 1) == 1",
4639 "var x:= 1; (1 +- -x + 1) == 3",
4640 "var x:= 1; (1 + +x + 1) == 3",
4641 "var x:= 1; (1 ++x + 1) == 3",
4642 "var x:= 1; (x - -1 - 1) == 1",
4643 "var x:= 1; (x --1 - 1) == 1",
4644 "var x:= 1; (x-- 1 - 1) == 1",
4645 "var x:= 1; (x--1 - 1) == 1",
4646 "var x:= 1; (x -- -1 - 1) == -1",
4647 "var x:= 1; (x + -1 - 1) == -1",
4648 "var x:= 1; (x +-1 - 1) == -1",
4649 "var x:= 1; (x+- 1 - 1) == -1",
4650 "var x:= 1; (x+-1 - 1) == -1",
4651 "var x:= 1; (x +- -1 - 1) == 1",
4652 "var x:= 1; (x + +1 - 1) == 1",
4653 "var x:= 1; (x ++1 - 1) == 1",
4654 "var x:= 1; (1 - -x - 1) == 1",
4655 "var x:= 1; (1 --x - 1) == 1",
4656 "var x:= 1; (1-- x - 1) == 1",
4657 "var x:= 1; (1--x - 1) == 1",
4658 "var x:= 1; (1 -- -x - 1) == -1",
4659 "var x:= 1; (1 + -x - 1) == -1",
4660 "var x:= 1; (1 +-x - 1) == -1",
4661 "var x:= 1; (1+- x - 1) == -1",
4662 "var x:= 1; (1+-x - 1) == -1",
4663 "var x:= 1; (1 +- -x - 1) == 1",
4664 "var x:= 1; (1 + +x - 1) == 1",
4665 "var x:= 1; (1 ++x - 1) == 1",
4666 "var x := 1; var y := 2; 1",
4667 "var x := 1; var y := 2; x",
4668 "var x:=6; var y:=4; x + -3 == 3",
4669 "var x:=6; var y:=4; x - -3 == 9",
4670 "var x:=6; var y:=4; x * -3 == -18",
4671 "var x:=6; var y:=4; x / -3 == -2",
4672 "var x:=6; var y:=4; -x + -3 == -9",
4673 "var x:=6; var y:=4; -x - -3 == -3",
4674 "var x:=6; var y:=4; -x * -3 == 18",
4675 "var x:=6; var y:=4; -x / -3 == 2",
4676 "var x:=6; var y:=4; -3 + -x == -9",
4677 "var x:=6; var y:=4; -3 - -x == 3",
4678 "var x:=6; var y:=4; -3 * -x == 18",
4679 "var x:=6; var y:=4; -3 / -x == 0.5",
4680 "var x:=6; var y:=4; 3 + -x == -3",
4681 "var x:=6; var y:=4; 3 - -x == 9",
4682 "var x:=6; var y:=4; 3 * -x == -18",
4683 "var x:=6; var y:=4; 3 / -x == -0.5",
4684 "var x := 3; var y := 6; x + -y == -3",
4685 "var x := 3; var y := 6; x - -y == 9",
4686 "var x := 3; var y := 6; -x + -y == -9",
4687 "var x := 3; var y := 6; -x - -y == 3",
4688 "var x := 3; var y := 6; -x * -y == 18",
4689 "var x := 6; var y := 3; -x / -y == 2",
4690 "var x := 3; var y := 6; -(-x * -y) == -18",
4691 "var x := 6; var y := 3; -(-x / -y) == -2",
4692 "var x:=1; 2+(3+abs(x)) == 6 ",
4693 "var x:=1; (3+abs(x))+2 == 6 ",
4694 "var x:=1; 2+(abs(x)+3) == 6 ",
4695 "var x:=1; (abs(x)+3)+2 == 6 ",
4696 "var x:=1; 2+(3-abs(x)) == 4 ",
4697 "var x:=1; (3-abs(x))+2 == 4 ",
4698 "var x:=1; 2+(abs(x)-3) == 0 ",
4699 "var x:=1; (abs(x)-3)+2 == 0 ",
4700 "var x:=1; 2-(3+abs(x)) == -2 ",
4701 "var x:=1; (3+abs(x))-2 == 2 ",
4702 "var x:=1; 2-(abs(x)+3) == -2 ",
4703 "var x:=1; (abs(x)+3)-2 == 2 ",
4704 "var x:=1; 2*(3*abs(x)) == 6 ",
4705 "var x:=1; (3*abs(x))*2 == 6 ",
4706 "var x:=1; 2*(abs(x)*3) == 6 ",
4707 "var x:=1; (abs(x)*3)*2 == 6 ",
4708 "var x:=1; 2*(3/abs(x)) == 6 ",
4709 "var x:=1; (3/abs(x))*2 == 6 ",
4710 "var x:=1; 2*(abs(x)/3) == (2/3)",
4711 "var x:=1; (abs(x)/3)*2 == (2/3)",
4712 "var x:=1; 2/(3*abs(x)) == (2/3)",
4713 "var x:=1; (3*abs(x))/2 == (3/2)",
4714 "var x:=1; 2/(abs(x)*3) == (2/3)",
4715 "var x:=1; (abs(x)*3)/2 == (3/2)",
4716 "var x:=1; 2/(3/abs(x)) == (2/3)",
4717 "var x:=1; (3/abs(x))/2 == (3/2)",
4718 "var x:=1; 2/(abs(x)/3) == 6 ",
4719 "var x:=1; (abs(x)/3)/2 == (1/6)",
4720 "var x:=3; var y:=6; -(-x)*-(-y) == 18",
4721 "var x:=3; var y:=6; -(-x)*-(-(-y)) == -18",
4722 "var x:=3; var y:=6; -(-(-x))*-(-y) == -18",
4723 "var x:=3; var y:=6; -(-(-x))*-(-(-y)) == 18",
4724 "var x:=3; var y:=6; -(-(x+y))*-(-(y+x)) == 81",
4725 "var x:=3; var y:=6; -(-(-(x+y)))*-(-(y+x)) == -81",
4726 "var x:=3; var y:=6; -(-(x+y))*-(-(-(y+x))) == -81",
4727 "var x:=3; var y:=6; -(-(-(x+y)))*-(-(-(y+x))) == 81",
4728 "var x:= 2; var y := 3; (-abs(x)+-abs(y)) == -5 ",
4729 "var x:= 2; var y := 3; (-abs(x)--abs(y)) == 1 ",
4730 "var x:= 2; var y := 3; (-abs(x)*-abs(y)) == 6 ",
4731 "var x:= 2; var y := 3; (-abs(x)/-abs(y)) == (2/3) ",
4732 "var x:= 2; var y := 3; (-abs(x)+abs(y)) == 1 ",
4733 "var x:= 2; var y := 3; (-abs(x)-abs(y)) == -5 ",
4734 "var x:= 2; var y := 3; (-abs(x)*abs(y)) == -6 ",
4735 "var x:= 2; var y := 3; (-abs(x)/abs(y)) == -(2/3) ",
4736 "var x:= 2; var y := 3; (abs(x)+-abs(y)) == -1 ",
4737 "var x:= 2; var y := 3; (abs(x)--abs(y)) == 5 ",
4738 "var x:= 2; var y := 3; (abs(x)*-abs(y)) == -6 ",
4739 "var x:= 2; var y := 3; (abs(x)/-abs(y)) == -(2/3) ",
4740 "var x:= 2; var y := 3; (-abs(x + 0)+-abs(y - 0)) == -5 ",
4741 "var x:= 2; var y := 3; (-abs(x + 0)--abs(y - 0)) == 1 ",
4742 "var x:= 2; var y := 3; (-abs(x + 0)*-abs(y - 0)) == 6 ",
4743 "var x:= 2; var y := 3; (-abs(x + 0)/-abs(y - 0)) == (2/3) ",
4744 "var x:= 2; var y := 3; (-abs(x + 0)+abs(y - 0)) == 1 ",
4745 "var x:= 2; var y := 3; (-abs(x + 0)-abs(y - 0)) == -5 ",
4746 "var x:= 2; var y := 3; (-abs(x + 0)*abs(y - 0)) == -6 ",
4747 "var x:= 2; var y := 3; (-abs(x + 0)/abs(y - 0)) == -(2/3) ",
4748 "var x:= 2; var y := 3; (abs(x + 0)+-abs(y - 0)) == -1 ",
4749 "var x:= 2; var y := 3; (abs(x + 0)--abs(y - 0)) == 5 ",
4750 "var x:= 2; var y := 3; (abs(x + 0)*-abs(y - 0)) == -6 ",
4751 "var x:= 2; var y := 3; (abs(x + 0)/-abs(y - 0)) == -(2/3) ",
4752 "var x := 1; var y := 2; swap(x,y); (x == 2) and (y == 1)",
4753 "var x := 1; var y := 2; x <=> y ; (x == 2) and (y == 1)",
4754 "var x := 'abc'; x == 'abc' ",
4755 "var x := 'abc'; var y := '123'; x != y ",
4756 "var x := 'abc'; var y := x + '123'; y == 'abc123' ",
4757 "var x := 'abc'; var y := '123' + x; y == '123abc' ",
4758 "~{var x := '123'; x[]} + ~{var x := '1234'; x[]} == 7",
4759 "~{var x := '123'; x[]} + ~{~{var x := '1234'; x[]}} == 7",
4760 "~{~{var x := '123'; x[]}} + ~{var x := '1234'; x[]} == 7",
4761 "~{var x := '123'; x[]} + ~{var x := 4} == 7",
4762 "~{var x := 3} + ~{var x := '1234'; x[]} == 7",
4763 "~{var x := '123'; x[]} + ~{~{var x := 4}} == 7",
4764 "~{~{var x := 3}} + ~{var x := '1234'; x[]} == 7",
4765 "var v[2] := {1,2}; swap(v[0],v[1]); (v[0] == 2) and (v[1] == 1)",
4766 "var v[2] := {1,2}; v[0] <=> v[1] ; (v[0] == 2) and (v[1] == 1)",
4767 "var x := 1; var y := 2; ~(swap(x,y),(x == 2) and (y == 1))",
4768 "var x := 1; var y := 2; ~(x <=> y , (x == 2) and (y == 1))",
4769 "var v[2] := {1,2}; ~(swap(v[0],v[1]), (v[0] == 2) and (v[1] == 1))",
4770 "var v[2] := {1,2}; ~(v[0] <=> v[1] , (v[0] == 2) and (v[1] == 1))",
4771 "var v[2] := {1,2}; swap(v[zero],v[one]); (v[zero] == 2) and (v[one] == 1)",
4772 "var v[2] := {1,2}; v[zero] <=> v[one] ; (v[zero] == 2) and (v[one] == 1)",
4773 "var v[2] := {1,2}; ~(swap(v[zero],v[one]), (v[zero] == 2) and (v[one] == 1))",
4774 "var v[2] := {1,2}; ~(v[zero] <=> v[one] , (v[zero] == 2) and (v[one] == 1))",
4775 "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)",
4776 "var v[2] := {1,2}; v[2 * zero] <=> v[(2*one)/(1+1)] ; (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1)",
4777 "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))",
4778 "var v[2] := {1,2}; ~(v[2 * zero] <=> v[(2 * one) / (1 + 1)] , (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1))",
4779 "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[0]); swap(v[1],y); (x == 3) and (y == 4)",
4780 "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[0]; v[1] <=> y; (x == 3) and (y == 4)",
4781 "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[zero]); swap(v[one],y); (x == 3) and (y == 4)",
4782 "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[zero]; v[one] <=> y; (x == 3) and (y == 4)",
4783 "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)",
4784 "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)",
4785 "~{ var x := 1 } + ~{ var x := 2 } == 3",
4786 "(~{ var x := 1 } + ~{ var x := 2 }) == (~{ var x := 2 } + ~{ var x := 1 })",
4787 "(~{ var x := 1 } + ~{ var x := 2 } + ~{~{ var x := 1 } + ~{ var x := 2 }}) == 6",
4788 "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4789 "(~{ var x := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4790 "(~{ var x[1] := [1] } + ~{ var x := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4791 "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x := [1] } + ~{ var x[1] := [2] }}) == 6",
4792 "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x := [2] }}) == 6",
4793 "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4794 "(~{~{ var x := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4795 "(~{~{ var x[1] := [1] } + ~{ var x := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4796 "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x := [1] } + ~{ var x[1] := [2] }) == 6",
4797 "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x := [2] }) == 6",
4798 "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4799 "(~{~{ var x := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4800 "(~{~{ var x[1] := [1] }} + ~{ var x := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4801 "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x := [2] } + ~{{ var x[1] := [2] }}) == 6",
4802 "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x := [2] }}) == 6",
4803 "(~{~{~{var x[1] := [1]}}} + ~{~{var x[1] := [2]}} + ~{var x[1] := [3]}) == 6",
4804 "(~{var x[1] := [1]} + ~{~{var x[1] := [2]}} + ~{~{~{var x[1] := [3]}}}) == 6",
4805 "(~{ var x[3] := [1] } + ~{ var x[6] := {6,5,4,3,2,1}}) == 7",
4806 "(~{ var x[6] := {6,5,4,3,2,1} } + ~{ var x := 1 }) == 7",
4807 "(~{ var x := 1 } + ~{ var x[6] := {6,5,4,3,2,1} }) == 7",
4808 "var x[3] := {}; (x[0] == 0) and (x[1] == 0) and (x[2] == 0)",
4809 "var x[3] := {1,2}; (x[0] == 1) and (x[1] == 2) and (x[2] == 0)",
4810 "var x[3] := {1,2,3}; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4811 "var x[3] := [1]; (x[0] == 1) and (x[1] == 1) and (x[2] == 1)",
4812 "var v[3] := [1]; v += 1; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 2)",
4813 "var v[3] := [1]; v -= 1; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 0)",
4814 "var v[3] := [1]; v *= 2; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 2)",
4815 "var v[3] := [3]; v /= 3; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 1)",
4816 "var v[3] := {1,2, 3}; v += 1; (v[0] == 2) and (v[1] == 3) and (v[2] == 4)",
4817 "var v[3] := {1,2, 3}; v -= 1; (v[0] == 0) and (v[1] == 1) and (v[2] == 2)",
4818 "var v[3] := {1,2, 3}; v *= 2; (v[0] == 2) and (v[1] == 4) and (v[2] == 6)",
4819 "var v[3] := {3,9,15}; v /= 3; (v[0] == 1) and (v[1] == 3) and (v[2] == 5)",
4820 "var v0[3] := [1]; var v1[3] := [1]; v0 += v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 2)",
4821 "var v0[3] := [1]; var v1[3] := [1]; v0 -= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 0)",
4822 "var v0[3] := [1]; var v1[3] := [2]; v0 *= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 2)",
4823 "var v0[3] := [3]; var v1[3] := [3]; v0 /= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 1)",
4824 "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)",
4825 "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)",
4826 "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)",
4827 "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)",
4828 "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])",
4829 "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])",
4830 "var x[3] := {}; var y[2] := {1,2}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4831 "var x[3] := {}; var y[1] := {1}; x := y; (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4832 "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])",
4833 "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])",
4834 "var x[3] := {}; var y[2] := {1,2}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4835 "var x[3] := {}; var y[1] := {1}; x := (y+=1); (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4836 "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])",
4837 "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])",
4838 "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) ",
4839 "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) ",
4840 "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4841 "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) ",
4842 "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) and (x[1] == 0) ",
4843 "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4844 "var x[3] := [9]; var y[4] := {1,2,3,4}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4845 "var x[3] := [9]; var y[3] := {1,2,3}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4846 "var x[3] := [9]; var y[2] := {1,2}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 9)",
4847 "var x[3] := [9]; var y[1] := {1}; x <=> y; (x[0] == 1) and (x[1] == 9) and (x[2] == 9)",
4848 "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)",
4849 "var x[3] := [9]; var y[3] := {1,2,3}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
4850 "var x[3] := [9]; var y[2] := {1,2}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 9)",
4851 "var x[3] := [9]; var y[1] := {1}; x <=> (y += 1); (x[0] == 2) and (x[1] == 9) and (x[2] == 9)",
4852 "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)",
4853 "var x[3] := [8]; var y[3] := {1,2,3}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4854 "var x[3] := [8]; var y[2] := {1,2}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 9)",
4855 "var x[3] := [8]; var y[1] := {1}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 9) and (x[2] == 9)",
4856 "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)",
4857 "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)",
4858 "var x[3] := [8]; var y[2] := {1,2}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 9)",
4859 "var x[3] := [8]; var y[1] := {1}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 9) and (x[2] == 9)",
4860 "var x[3] := [0]; var y[4] := {1,2,3,4}; X < y",
4861 "var x[3] := [0]; var y[3] := {1,2,3}; x < Y",
4862 "var x[3] := [0]; var y[2] := {1,2}; X < y",
4863 "var x[3] := [0]; var y[1] := {1}; x < Y",
4864 "var x[3] := [0]; var y[4] := {1,2,3,4}; x <= y",
4865 "var x[3] := [0]; var y[3] := {1,2,3}; x <= y",
4866 "var x[3] := [0]; var y[2] := {1,2}; x <= y",
4867 "var x[3] := [0]; var y[1] := {1}; x <= y",
4868 "var x[3] := [5]; var y[4] := {1,2,3,4}; x > y",
4869 "var x[3] := [5]; var y[3] := {1,2,3}; x > y",
4870 "var x[3] := [5]; var y[2] := {1,2}; x > y",
4871 "var x[3] := [5]; var y[1] := {1}; x > y",
4872 "var x[3] := [5]; var y[4] := {1,2,3,4}; x >= y",
4873 "var x[3] := [5]; var y[3] := {1,2,3}; x >= y",
4874 "var x[3] := [5]; var y[2] := {1,2}; x >= y",
4875 "var x[3] := [5]; var y[1] := {1}; x >= y",
4876 "var x[3] := [1]; var y[4] := [1]; x == y",
4877 "var x[3] := [1]; var y[3] := [1]; x == y",
4878 "var x[3] := [1]; var y[2] := [1]; x == y",
4879 "var x[3] := [1]; var y[1] := [1]; x == y",
4880 "var x[3] := [1]; var y[4] := [2]; x != y",
4881 "var x[3] := [1]; var y[3] := [2]; x != y",
4882 "var x[3] := [1]; var y[2] := [2]; x != y",
4883 "var x[3] := [1]; var y[1] := [2]; x != y",
4884 "var x[3] := [0]; var y[4] := {5,6,7,8}; (x += 1) < y",
4885 "var x[3] := [0]; var y[3] := {5,6,7}; (x += 1) < y",
4886 "var x[3] := [0]; var y[2] := {5,6}; (x += 1) < y",
4887 "var x[3] := [0]; var y[1] := {5}; (x += 1) < y",
4888 "var x[3] := [0]; var y[4] := {1,2,3,4}; x < (y += 1)",
4889 "var x[3] := [0]; var y[3] := {1,2,3}; x < (y += 1)",
4890 "var x[3] := [0]; var y[2] := {1,2}; x < (y += 1)",
4891 "var x[3] := [0]; var y[1] := {1}; x < (y += 1)",
4892 "var x[3] := [0]; var y[4] := {5,6,7,8}; (x += 1) < (y += 1)",
4893 "var x[3] := [0]; var y[3] := {5,6,7}; (x += 1) < (y += 1)",
4894 "var x[3] := [0]; var y[2] := {5,6}; (x += 1) < (y += 1)",
4895 "var x[3] := [0]; var y[1] := {5}; (x += 1) < (y += 1)",
4896 "var x[3] := {1,2,3}; var y := 5; x < y ",
4897 "var x[3] := {1,2,3}; var y := 3; x < y + 1 ",
4898 "var x[3] := {1,2,3}; var y := 5; x <= y ",
4899 "var x[3] := {1,2,3}; var y := 3; x <= y + 1",
4900 "var x[3] := {1,1,1}; var y := 1; x == y ",
4901 "var x[3] := {1,1,1}; var y := 2; x == y - 1",
4902 "var x[3] := {1,2,3}; var y := 5; y > x ",
4903 "var x[3] := {1,2,3}; var y := 3; y >= x ",
4904 "var x[3] := {1,2,3}; var y := 5; y + 1 > x ",
4905 "var x[3] := {1,1,1}; var y := 1; y == x ",
4906 "var x[3] := {1,1,1}; var y := 2; y - 1 == x",
4907 "var x[3] := {1,2,3}; var y := 5; equal(true,(x += 1) < y) ",
4908 "var x[3] := {1,2,3}; var y := 3; equal(true,(x -= 1) < y + 1)",
4909 "var x[3] := {1,2,3}; var y := 5; equal(true,(x -= 1) <= y) ",
4910 "var x[3] := {2,2,2}; var y := 1; (x -= 1) == y ",
4911 "var x[3] := {1,2,3}; var y := 5; y > (x += 1) ",
4912 "var x[3] := {1,2,3}; var y := 5; y + 1 > (x += 1) ",
4913 "var x[3] := {2,2,2}; var y := 1; y == (x -= 1) ",
4914 "var x[3] := {2,2,2}; var y := 0; y + 1 == (x -= 1)",
4915 "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := (x + y); z == (x + y)",
4916 "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := (x - y); z == (x - y)",
4917 "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := (x / y); z == (x / y)",
4918 "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := (x * y); z == (x * y)",
4919 "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := 2(x + y); z == (x + y)2",
4920 "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := 2(x - y); z == (x - y)2",
4921 "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := 2(x / y); z == (x / y)2",
4922 "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := 2(x * y); z == (x * y)2",
4923 "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",
4924 "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := 2(x - y)/3; z == 2(x - y)/3",
4925 "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := 2(x / y)/3; z == 2(x / y)/3",
4926 "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := 2(x * y)/3; z == 2(x * y)/3",
4927 "var x[6] := {1,2,3,4,5,6}; equal(sqrt(sum([x - avg(x)]^2) / x[]),1.70782512765993306387017)",
4928 "var x[3] := {-1,-2,-3}; sum(abs(x) ) == 6",
4929 "var x[3] := {0.1,0.2,0.3}; sum(trunc(x)) == 0",
4930
4931 "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)",
4932
4933 "var x := 2; (~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; "
4934 "j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } else "
4935 "break[i + j]; } } } + ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; "
4936 "j <= i; j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } "
4937 " else break[i + j]; } } }) == 18 ",
4938
4939 "var x := 2; var v0[3] := {1,2,3}; ( ~{ for (var i := 0; i < 10; i += 1) { "
4940 "for (var j := 0; j <= i; j += 1) { var y := 3; var v2[3] := {1,2,3}; if ( "
4941 "(i + j + y + x + abs(v0[i % v0[]] - v2[j % v2[]])) < 6) { var v3[3] := "
4942 "{1,2,3}; y += x / v3[j % v3[]]; continue; } else break[i + j]; } } } "
4943 "+ ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; j += 1) "
4944 " { var y := 3; var v2[3] := {1,2,3}; if ((i + j + y + x + abs(v0[i % v0[]] - "
4945 "v2[j % v2[]])) < 6) { var v3[3] := {1,2,3}; y += x / v3[j % v3[]]; "
4946 "continue; } else break[i + j]; } } } ) == 18 ",
4947
4948 "12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
4949 "12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
4950 "12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
4951 "12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
4952
4953 "21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; i += 1;"
4954 "i += 2; i += 3; }; })",
4955
4956 "21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; return "
4957 "[i * 8]; i += 1; i += 2; i += 3; }; })",
4958
4959 "2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; i += 1; i += 2;"
4960 "i += 3; } else i; }",
4961
4962 "2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; return [i * 8];"
4963 "i += 1; i += 2; i += 3; } else i; }",
4964
4965 "var x[10] := [-1]; var y[10] := [-1]; for (var i := 0; i < 10; i += 1) { x[i] := i; "
4966 "y[i] := 2 * x[i]; }; (sum(x) == 45) and (sum(y) == (2 * sum(x)));"
4967
4968 "7 == (for (var i := 0; i < 10; i += 1) { ~{break[7]; continue; i += i} })",
4969 "0 == (for (var i := 0; i < 10; i += 1) { ~{break[i]; continue; i += i} })",
4970 "0 == (for (var i := 0; i < 10; i += 1) { ~{continue; break[7]; i += i} })",
4971 "1 == (for (var i := 0; i < 10; i += 1) { ~{break[i += 1]; continue; i += i} })",
4972
4973 "var s := 'abc'; s == ~{'abc' } ",
4974 "var s := 'abc'; s == ~{s } ",
4975 "var s := 'abc'; s == ~{'ab' + 'c'} ",
4976 "var s := 'abc'; ~{'abc' } == s ",
4977 "var s := 'abc'; ~{s } == s ",
4978 "var s := 'abc'; ~{'ab' + 'c'} == s ",
4979 "var s := 'abc'; ~{1 + 2; 'abc' + s; s} == s ",
4980 "var s := 'abc'; ~{1 + 2; var x := 'ab'; x + 'c'} == s ",
4981
4982 "var x[10^6] := null; var y[10^7] := null; 0 * (min(x) + min(y)) + x[] + y[] == 10^7 + 10^6",
4983
4984 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0, v1) == v0",
4985 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0, v1) == v1",
4986 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)",
4987 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)",
4988 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x < y, v0, v1) == v0",
4989 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x > y, v0, v1) == v1",
4990 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x < y, v0 - v1, v1 - v0) == (v0 - v1)",
4991 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x > y, v0 - v1, v1 - v0) == (v1 - v0)",
4992
4993 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0, v1) == v0",
4994 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0, v1) == v1",
4995 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)",
4996 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)",
4997 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x < y, v0, v1) == v0",
4998 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x > y, v0, v1) == v1",
4999 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x < y, v0 - v1, v1 - v0) == (v0 - v1)",
5000 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; if (x > y, v0 - v1, v1 - v0) == (v1 - v0)",
5001
5002 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0; else v1;) == v0",
5003 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0; else v1;) == v1",
5004 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)",
5005 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)",
5006 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x < y) v0; else v1;) == v0",
5007 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x > y) v0; else v1;) == v1",
5008 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x < y) v0 - v1; else v1 - v0;) == (v0 - v1)",
5009 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; (if (x > y) v0 - v1; else v1 - v0;) == (v1 - v0)",
5010
5011 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0; else v1;) == v0",
5012 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0; else v1;) == v1",
5013 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)",
5014 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)",
5015 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x < y) v0; else v1;) == v0",
5016 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x > y) v0; else v1;) == v1",
5017 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x < y) v0 - v1; else v1 - v0;) == (v0 - v1)",
5018 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; var x := 1; var y := 2; (if (x > y) v0 - v1; else v1 - v0;) == (v1 - v0)",
5019
5020 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((-x * -y)); true;",
5021 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((-x + -y)); true;",
5022 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((-x - -y)); true;",
5023 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((-x / -y)); true;",
5024 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) + (1.123 * y)); true;",
5025 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) - (1.123 * y)); true;",
5026 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) + (y * 1.123)); true;",
5027 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) - (y * 1.123)); true;",
5028 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) * (y / z)); true;",
5029 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (y / z)); true;",
5030 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / y); true;",
5031 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) * 2.123); true;",
5032 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / 2.123); true;",
5033 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) * (2.123 * y)); true;",
5034 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) * (y * 2.123)); true;",
5035 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / (2.123 * y)); true;",
5036 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / (2.123 / y)); true;",
5037 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / (y * 2.123)); true;",
5038 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / (y / 2.123)); true;",
5039 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) + 2.123); true;",
5040 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) - 2.123); true;",
5041 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) + (2.123 + y)); true;",
5042 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) + (y + 2.123)); true;",
5043 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) - (2.123 + y)); true;",
5044 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) - (y + 2.123)); true;",
5045 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 - x) + 2.123); true;",
5046 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 - x) - 2.123); true;",
5047 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 - x) - (2.123 - y)); true;",
5048 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 - x) - (y - 2.123)); true;",
5049 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) * 2.123); true;",
5050 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / 2.123); true;",
5051 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) * (2.123 / y)); true;",
5052 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) * (y / 2.123)); true;",
5053 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (2.123 * y)); true;",
5054 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (2.123 / y)); true;",
5055 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (y * 2.123)); true;",
5056 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (y / 2.123)); true;",
5057 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) * (2.123 * x)); true;",
5058 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) * (2.123 / x)); true;",
5059 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) * (x * 2.123)); true;",
5060 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) * (x / 2.123)); true;",
5061 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) + (2.123 + x)); true;",
5062 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) + (2.123 - x)); true;",
5063 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) + (x + 2.123)); true;",
5064 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) + (x - 2.123)); true;",
5065 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) - (2.123 + x)); true;",
5066 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) - (2.123 - x)); true;",
5067 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) - (x + 2.123)); true;",
5068 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) - (x - 2.123)); true;",
5069 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) / (2.123 * x)); true;",
5070 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) / (2.123 / x)); true;",
5071 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) / (x * 2.123)); true;",
5072 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123) / (x / 2.123)); true;",
5073 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) * 2.123); true;",
5074 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / 2.123); true;",
5075 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) + 2.123); true;",
5076 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) - 2.123); true;",
5077 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - 1.123) + 2.123); true;",
5078 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - 1.123) - 2.123); true;",
5079 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * 2.123); true;",
5080 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / 2.123); true;",
5081 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x ^ 1.123) ^ 2.123); true;",
5082 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) + (1.123 * y)); true;",
5083 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) - (1.123 * y)); true;",
5084 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) + (y * 1.123)); true;",
5085 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) - (y * 1.123)); true;",
5086 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) * (2.123 * y)); true;",
5087 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) * (y * 2.123)); true;",
5088 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / (2.123 * y)); true;",
5089 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / (2.123 / y)); true;",
5090 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / (y * 2.123)); true;",
5091 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / (y / 2.123)); true;",
5092 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * y) / (z / w)); true;",
5093 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) + (2.123 + y)); true;",
5094 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) + (y + 2.123)); true;",
5095 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) - (2.123 + y)); true;",
5096 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) - (y + 2.123)); true;",
5097 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + y) / (z / w)); true;",
5098 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - 1.123) - (2.123 - y)); true;",
5099 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - 1.123) - (y - 2.123)); true;",
5100 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - y) / (z / w)); true;",
5101 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (y / z)); true;",
5102 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) + (y / 1.123)); true;",
5103 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) - (y / 1.123)); true;",
5104 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / (y / z)); true;",
5105 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / y); true;",
5106 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (2.123 / y)); true;",
5107 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (y + 2.123)); true;",
5108 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (y - 2.123)); true;",
5109 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (y / 2.123)); true;",
5110 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / (2.123 * y)); true;",
5111 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / (2.123 / y)); true;",
5112 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / (y * 2.123)); true;",
5113 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / (y / 2.123)); true;",
5114 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) * (1.123 / z)); true;",
5115 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) * (z / 1.123)); true;",
5116 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) * (z / w)); true;",
5117 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / (1.123 / z)); true;",
5118 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / (z / 1.123)); true;",
5119 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / (z / w)); true;",
5120 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / 1.123); true;",
5121 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / z); true;",
5122 };
5123
5124 const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
5125
5126 static const std::size_t rounds = 20;
5127
5128 exprtk::symbol_table<T> symbol_table;
5129
5130 T zero = T(0);
5131 T one = T(1);
5132
5133 symbol_table.add_variable("zero",zero);
5134 symbol_table.add_variable("one" , one);
5135 symbol_table.add_pi();
5136
5137 bool failed = false;
5138
5139 for (std::size_t r = 0; r < rounds; ++r)
5140 {
5141 for (std::size_t i = 0; i < expression_list_size; ++i)
5142 {
5143 expression_t expression;
5144 expression.register_symbol_table(symbol_table);
5145
5146 {
5147 exprtk::parser<T> parser;
5148
5149 if (!parser.compile(expression_list[i],expression))
5150 {
5151 printf("run_test10() - swaps[1] Error: %s Expression: %s\n",
5152 parser.error().c_str(),
5153 expression_list[i].c_str());
5154
5155 failed = true;
5156 continue;
5157 }
5158 }
5159
5160 const T result = expression.value();
5161
5162 if (T(1) != result)
5163 {
5164 printf("run_test10() - swaps[1] evaluation error Expression: %s\n",
5165 expression_list[i].c_str());
5166
5167 failed = true;
5168 }
5169
5170 expression.release();
5171 }
5172
5173 if (failed)
5174 {
5175 return false;
5176 }
5177 }
5178
5179 // reuse parser
5180 for (std::size_t r = 0; r < rounds; ++r)
5181 {
5182 exprtk::parser<T> parser;
5183
5184 for (std::size_t i = 0; i < expression_list_size; ++i)
5185 {
5186 expression_t expression;
5187 expression.register_symbol_table(symbol_table);
5188
5189 if (!parser.compile(expression_list[i],expression))
5190 {
5191 printf("run_test10() - swaps[2] Error: %s Expression: %s\n",
5192 parser.error().c_str(),
5193 expression_list[i].c_str());
5194
5195 failed = true;
5196 continue;
5197 }
5198
5199 const T result = expression.value();
5200
5201 if (T(1) != result)
5202 {
5203 printf("run_test10() - swaps[2] evaluation error Expression: %s\n",
5204 expression_list[i].c_str());
5205
5206 failed = true;
5207 }
5208 }
5209
5210 if (failed)
5211 {
5212 return false;
5213 }
5214 }
5215 }
5216
5217 return true;
5218}
5219
5220template <typename T>
5222{
5223 typedef exprtk::expression<T> expression_t;
5224
5225 std::string expression_string = "(x + y) / 3";
5226
5227 T x = T(1.0);
5228 T y = T(2.0);
5229
5230 exprtk::symbol_table<T> symbol_table;
5231 symbol_table.add_variable("x",x);
5232 symbol_table.add_variable("y",y);
5233
5234 expression_t expression;
5235 expression.register_symbol_table(symbol_table);
5236
5237 static const std::size_t rounds = 500;
5238
5239 for (std::size_t i = 0; i < rounds; ++i)
5240 {
5241 {
5242 exprtk::parser<T> parser;
5243
5244 if (!parser.compile(expression_string,expression))
5245 {
5246 printf("run_test11() - Error: %s Expression: %s\n",
5247 parser.error().c_str(),
5248 expression_string.c_str());
5249
5250 return false;
5251 }
5252 }
5253
5254 if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
5255 {
5256 printf("run_test11() - Error in evaluation!(1)\n");
5257 return false;
5258 }
5259
5260 expression.release();
5261
5262 if (false == (!expression))
5263 {
5264 printf("run_test11() - Error in evaluation!(2)\n");
5265 return false;
5266 }
5267
5268 {
5269 exprtk::parser<T> parser;
5270
5271 if (!parser.compile(expression_string,expression))
5272 {
5273 printf("run_test11() - Error: %s Expression: %s\n",
5274 parser.error().c_str(),
5275 expression_string.c_str());
5276
5277 return false;
5278 }
5279 }
5280
5281 expression.value();
5282
5283 if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
5284 {
5285 printf("run_test11() - Error in evaluation!(3)\n");
5286 return false;
5287 }
5288 }
5289
5290 return true;
5291}
5292
5293template <typename T>
5295{
5296 typedef exprtk::expression<T> expression_t;
5297
5298 static const std::string expression_string[] =
5299 {
5300 "equal(poly01(x,2.2,1.1),(2.2x^1+1.1))",
5301 "equal(poly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
5302 "equal(poly03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
5303 "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))",
5304 "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))",
5305 "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))",
5306 "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))",
5307 "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))",
5308 "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))",
5309 "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))",
5310 "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))",
5311 "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))",
5312 "EquaL(Poly01(x,2.2,1.1),(2.2x^1+1.1))",
5313 "eQuAl(pOly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
5314 "eqUal(poLy03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
5315 "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))",
5316 "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))",
5317 "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))",
5318 "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))",
5319 "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))",
5320 "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))",
5321 "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))",
5322 "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))",
5323 "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))"
5324 };
5325
5326 static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
5327
5328 T x = T(1.23456);
5329
5342
5343 exprtk::symbol_table<T> symbol_table;
5344
5345 symbol_table.add_variable("x",x);
5346 symbol_table.add_function("poly01", poly01);
5347 symbol_table.add_function("poly02", poly02);
5348 symbol_table.add_function("poly03", poly03);
5349 symbol_table.add_function("poly04", poly04);
5350 symbol_table.add_function("poly05", poly05);
5351 symbol_table.add_function("poly06", poly06);
5352 symbol_table.add_function("poly07", poly07);
5353 symbol_table.add_function("poly08", poly08);
5354 symbol_table.add_function("poly09", poly09);
5355 symbol_table.add_function("poly10", poly10);
5356 symbol_table.add_function("poly11", poly11);
5357 symbol_table.add_function("poly12", poly12);
5358
5359 expression_t expression;
5360 expression.register_symbol_table(symbol_table);
5361
5362 static const std::size_t rounds = 500;
5363
5364 for (std::size_t i = 0; i < rounds; ++i)
5365 {
5366 for (std::size_t j = 0; j < expression_string_size; ++j)
5367 {
5368 const std::string& expr_str = expression_string[j];
5369
5370 {
5371 exprtk::parser<T> parser;
5372
5373 if (!parser.compile(expr_str,expression))
5374 {
5375 printf("run_test12() - Error: %s Expression: %s\n",
5376 parser.error().c_str(),
5377 expr_str.c_str());
5378
5379 return false;
5380 }
5381 }
5382
5383 if (T(1) != expression.value())
5384 {
5385 printf("run_test12() - Error in evaluation! Expression: %s\n",expr_str.c_str());
5386 return false;
5387 }
5388 }
5389 }
5390
5391 return true;
5392}
5393
5394template <typename T>
5396{
5397 using exprtk::ifunction<T>::operator();
5398
5400
5402 {
5403 static const T _pi = exprtk::details::numeric::details::const_pi_impl<T>(exprtk::details::numeric::details::mpfrreal_type_tag());
5404 return mpfr::sin((v * _pi) / T(180));
5405 }
5406};
5407
5408template <typename T>
5410{
5411 using exprtk::ifunction<T>::operator();
5412
5414
5416 {
5417 static const T _pi = exprtk::details::numeric::details::const_pi_impl<T>(exprtk::details::numeric::details::mpfrreal_type_tag());
5418 return mpfr::cos((v * _pi) / T(180));
5419 }
5420};
5421
5422template <typename T>
5424{
5425 typedef exprtk::symbol_table<T> symbol_table_t;
5426 typedef exprtk::expression<T> expression_t;
5427 typedef exprtk::parser<T> parser_t;
5428
5429 static const std::string expression_string[] =
5430 {
5431 "equal(sin(30),0.5) ",
5432 "equal(cos(60),0.5) ",
5433 "equal(sin(60),sqrt(3)/2) ",
5434 "equal(cos(30),sqrt(3)/2) ",
5435 "equal(sin(x_deg),0.5) ",
5436 "equal(cos(y_deg),0.5) ",
5437 "equal(sin(y_deg),sqrt(3)/2) ",
5438 "equal(cos(x_deg),sqrt(3)/2) ",
5439 "equal(sin(30) + sin(30),1.0) ",
5440 "equal(cos(60) + cos(60),1.0) ",
5441 "equal(sin(60) + sin(60),sqrt(3)) ",
5442 "equal(cos(30) + cos(30),sqrt(3)) ",
5443 "equal(sin(x_deg) + sin(x_deg),1.0) ",
5444 "equal(cos(y_deg) + cos(y_deg),1.0) ",
5445 "equal(sin(y_deg) + sin(y_deg),sqrt(3))",
5446 "equal(cos(x_deg) + cos(x_deg),sqrt(3))"
5447 };
5448
5449 static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
5450
5451 {
5452 T x_deg = T(30);
5453 T y_deg = T(60);
5454
5455 sine_deg <T> sine;
5456 cosine_deg<T> cosine;
5457
5458 symbol_table_t symbol_table_0;
5459 symbol_table_t symbol_table_1;
5460
5461 symbol_table_0.add_variable("x_deg",x_deg);
5462 symbol_table_1.add_variable("y_deg",y_deg);
5463
5464 symbol_table_0.add_function( "sine_deg", sine);
5465 symbol_table_1.add_function("cosine_deg", cosine);
5466
5467 expression_t expression;
5468
5469 expression.register_symbol_table(symbol_table_0);
5470 expression.register_symbol_table(symbol_table_1);
5471
5472 static const std::size_t rounds = 100;
5473
5474 for (std::size_t i = 0; i < rounds; ++i)
5475 {
5476 for (std::size_t j = 0; j < expression_string_size; ++j)
5477 {
5478 const std::string& expr_str = expression_string[j];
5479
5480 {
5481 parser_t parser;
5482
5483 parser.replace_symbol("sin", "sine_deg");
5484 parser.replace_symbol("cos", "cosine_deg");
5485
5486 if (!parser.compile(expr_str,expression))
5487 {
5488 printf("run_test13() - Error: %s Expression: %s [1]\n",
5489 parser.error().c_str(),
5490 expr_str.c_str());
5491
5492 return false;
5493 }
5494 }
5495
5496 if (T(1) != expression.value())
5497 {
5498 printf("run_test13() - Error in evaluation! Expression: %s [1]\n",expr_str.c_str());
5499 return false;
5500 }
5501 }
5502 }
5503 }
5504
5505 {
5506 T x_deg = T(30);
5507 T y_deg = T(60);
5508
5509 sine_deg <T> sine;
5510 cosine_deg<T> cosine;
5511
5512 symbol_table_t symbol_table_0;
5513 symbol_table_t symbol_table_1;
5514
5515 symbol_table_0.add_variable("x_deg",x_deg);
5516 symbol_table_1.add_variable("y_deg",y_deg);
5517
5518 symbol_table_0.add_reserved_function("sin", sine);
5519 symbol_table_1.add_reserved_function("cos",cosine);
5520
5521 expression_t expression;
5522
5523 expression.register_symbol_table(symbol_table_0);
5524 expression.register_symbol_table(symbol_table_1);
5525
5526 static const std::size_t rounds = 100;
5527
5528 for (std::size_t i = 0; i < rounds; ++i)
5529 {
5530 for (std::size_t j = 0; j < expression_string_size; ++j)
5531 {
5532 const std::string& expr_str = expression_string[j];
5533
5534 {
5535 typedef typename parser_t::settings_store settings_t;
5536
5537 parser_t parser;
5538
5539 parser.settings()
5540 .disable_base_function(settings_t::e_bf_sin)
5541 .disable_base_function(settings_t::e_bf_cos);
5542
5543 if (!parser.compile(expr_str,expression))
5544 {
5545 printf("run_test13() - Error: %s Expression: %s [2]\n",
5546 parser.error().c_str(),
5547 expr_str.c_str());
5548
5549 return false;
5550 }
5551 }
5552
5553 if (T(1) != expression.value())
5554 {
5555 printf("run_test13() - Error in evaluation! Expression: %s [2]\n",expr_str.c_str());
5556 return false;
5557 }
5558 }
5559 }
5560 }
5561
5562 return true;
5563}
5564
5565template <typename Allocator,
5566 template <typename,typename> class Sequence>
5567inline std::size_t load_expressions(const std::string& file_name,
5568 Sequence<std::string,Allocator>& sequence)
5569{
5570 std::ifstream stream(file_name.c_str());
5571
5572 if (!stream) return 0;
5573
5574 std::string buffer;
5575 buffer.reserve(1024);
5576
5577 std::size_t line_count = 0;
5578
5579 while (std::getline(stream,(buffer)))
5580 {
5581 if (buffer.empty())
5582 continue;
5583 else if ('#' == buffer[0])
5584 continue;
5585
5586 ++line_count;
5587 sequence.push_back(buffer);
5588 }
5589
5590 return line_count;
5591}
5592
5593template <typename T>
5594inline T isnan(const T t)
5595{
5596 return mpfr::isnan(t) ? T(1) : T(0);
5597}
5598
5599template <typename T>
5601{
5602 typedef exprtk::expression<T> expression_t;
5603 typedef exprtk::parser<T> parser_t;
5604 typedef typename parser_t::settings_store settings_t;
5605
5606 T x = T(0);
5607 T y = T(0);
5608 T z = T(0);
5609 T w = T(0);
5610
5623
5624 exprtk::rtl::vecops::package<T> vector_package;
5625
5626 exprtk::symbol_table<T> symbol_table;
5627 symbol_table.add_constants();
5628 symbol_table.add_variable("x",x);
5629 symbol_table.add_variable("y",y);
5630 symbol_table.add_variable("z",z);
5631 symbol_table.add_variable("w",w);
5632 symbol_table.add_function("poly01", poly01);
5633 symbol_table.add_function("poly02", poly02);
5634 symbol_table.add_function("poly03", poly03);
5635 symbol_table.add_function("poly04", poly04);
5636 symbol_table.add_function("poly05", poly05);
5637 symbol_table.add_function("poly06", poly06);
5638 symbol_table.add_function("poly07", poly07);
5639 symbol_table.add_function("poly08", poly08);
5640 symbol_table.add_function("poly09", poly09);
5641 symbol_table.add_function("poly10", poly10);
5642 symbol_table.add_function("poly11", poly11);
5643 symbol_table.add_function("poly12", poly12);
5644 symbol_table.add_function("isnan" , isnan );
5645
5646 symbol_table.add_package(vector_package);
5647
5648 expression_t expression;
5649 expression.register_symbol_table(symbol_table);
5650
5651 exprtk::parser<T> parser;
5652
5653 static const std::size_t secondary_compile_options =
5654 settings_t::e_replacer +
5655 settings_t::e_joiner +
5656 settings_t::e_numeric_check +
5657 settings_t::e_bracket_check +
5658 settings_t::e_sequence_check +
5659 settings_t::e_strength_reduction;
5660
5661 const settings_t settings(secondary_compile_options);
5662 parser_t secondary_parser(settings);
5663
5664 std::deque<std::string> expr_str_list;
5665 std::deque<std::string> expr_noncomm_str_list;
5666
5667 load_expressions("exprtk_functional_test.txt" , expr_str_list);
5668 load_expressions("exprtk_functional_ext_test.txt" , expr_str_list);
5669
5670 if (expr_str_list.empty())
5671 {
5672 return true;
5673 }
5674
5675 load_expressions("exprtk_noncommutative_test.txt" , expr_noncomm_str_list);
5676
5677 std::deque<exprtk::expression<T> > expression_list;
5678 bool error_found = false;
5679
5680 static const std::size_t rounds = 5;
5681
5682 for (std::size_t r = 0; r < rounds; ++r)
5683 {
5684 for (std::size_t i = 0; i < expr_str_list.size(); ++i)
5685 {
5686 exprtk::expression<T> current_expression;
5687
5688 current_expression.register_symbol_table(symbol_table);
5689
5690 if (!parser.compile(expr_str_list[i],current_expression))
5691 {
5692 printf("run_test14() - Error: %s Expression: %s\n",
5693 parser.error().c_str(),
5694 expr_str_list[i].c_str());
5695
5696 error_found = true;
5697 }
5698 else
5699 {
5700 expression_list.push_back(current_expression);
5701 }
5702 }
5703
5704 for (std::size_t i = 0; i < expr_noncomm_str_list.size(); ++i)
5705 {
5706 exprtk::expression<T> current_expression;
5707
5708 current_expression.register_symbol_table(symbol_table);
5709
5710 if (!secondary_parser.compile(expr_noncomm_str_list[i],current_expression))
5711 {
5712 printf("run_test14() - Error: %s Expression: %s [secondary parser]\n",
5713 secondary_parser.error().c_str(),
5714 expr_noncomm_str_list[i].c_str());
5715
5716 error_found = true;
5717 }
5718 }
5719
5720 if (error_found)
5721 {
5722 break;
5723 }
5724
5725 for (std::size_t i = 0; i < expression_list.size(); ++i)
5726 {
5727 const T result = expression_list[i].value();
5728
5729 if (result != T(1))
5730 {
5731 error_found = true;
5732
5733 printf("run_test14() - Error with evaluation of expression: %s\n",
5734 expr_str_list[i].c_str());
5735 }
5736 }
5737
5738 expression_list.clear();
5739
5740 if (error_found)
5741 {
5742 break;
5743 }
5744 }
5745
5746 return !error_found;
5747}
5748
5749template <typename T>
5751{
5752 typedef exprtk::expression<T> expression_t;
5753
5754 T x = T(1.1);
5755 T y = T(2.2);
5756 T z = T(3.3);
5757
5758 exprtk::symbol_table<T> symbol_table;
5759 symbol_table.add_constants();
5760 symbol_table.add_variable("x",x);
5761 symbol_table.add_variable("y",y);
5762 symbol_table.add_variable("z",z);
5763
5764 static const std::string expr_str_list[] =
5765 {
5766 "2 - (x + y) / z//Comment 01 ",
5767 "2 - (x + y) / z#Comment 02 ",
5768 "2 - (x + y) / z //Comment 03 ",
5769 "2 - (x + y) / z #Comment 04 ",
5770 "2 - (x + y) / z//Comment 05 \n",
5771 "2 - (x + y) / z#Comment 06 \n",
5772 "2 - (x + y) / z //Comment 07\n",
5773 "2 - (x + y) / z #Comment 08 \n",
5774 "/* Comment 09*/2 - (x + y) / z",
5775 "/* Comment 10*/2 - (x + y) / z\n",
5776 "/* Comment 11*/2 - (x + y) / z/* Comment 12*/",
5777 "/* Comment 13*/2 - (x + y) / z/* Comment 14*/\n",
5778 "2 - /* Comment 15 */(x + y) / z",
5779 "2 - /* Comment 16 */(x + y) /* Comment 17 *// z \n",
5780 "2 - /* Comment 18 */(x + y) /* Comment 19 */ / z //Comment 20\n",
5781 "2 - /* Comment 21 */(x + y) /* Comment 22 */ / z #Comment 23\n",
5782 "2 - /* Comment 24 */(x + y) /* Comment 25 */ / z //Comment 26",
5783 "2 - /* Comment 27 */(x + y) /* Comment 28 */ / z #Comment 29"
5784 };
5785 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5786
5787 std::deque<expression_t> expression_list;
5788
5789 for (std::size_t i = 0; i < expr_str_list_size; ++i)
5790 {
5791 expression_t expression;
5792 expression.register_symbol_table(symbol_table);
5793
5794 exprtk::parser<T> parser;
5795
5796 if (!parser.compile(expr_str_list[i],expression))
5797 {
5798 printf("run_test15() - Error: %s Expression: %s\n",
5799 parser.error().c_str(),
5800 expr_str_list[i].c_str());
5801
5802 return false;
5803 }
5804 else
5805 expression_list.push_back(expression);
5806 }
5807
5808 expression_t base_expression;
5809 const std::string base_expr_str = "2 - (x + y) / z";
5810
5811 {
5812 base_expression.register_symbol_table(symbol_table);
5813
5814 exprtk::parser<T> parser;
5815
5816 if (!parser.compile(base_expr_str,base_expression))
5817 {
5818 printf("run_test15() - Error: %s Expression: %s\n",
5819 parser.error().c_str(),
5820 base_expr_str.c_str());
5821
5822 return false;
5823 }
5824 }
5825
5826 bool error_found = false;
5827
5828 for (std::size_t i = 0; i < expression_list.size(); ++i)
5829 {
5830 T base_result = base_expression.value();
5831 T result = expression_list[i].value();
5832
5833 if (not_equal(base_result,result))
5834 {
5835 printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
5836 base_result.toDouble(),
5837 result.toDouble(),
5838 expr_str_list[i].c_str());
5839
5840 error_found = true;
5841 }
5842 }
5843
5844 return !error_found;
5845}
5846
5847template <typename T>
5849{
5850 using exprtk::ifunction<T>::operator();
5851
5852 typedef const T& type;
5853 base_func(const std::size_t& n) : exprtk::ifunction<T>(n) {}
5854 inline T operator()(type v0, type v1, type v2, type v3, type v4) exprtk_test_override { return (v0 + v1 + v2 + v3 + v4); }
5855 inline T operator()(type v0, type v1, type v2, type v3) exprtk_test_override { return (v0 + v1 + v2 + v3); }
5856 inline T operator()(type v0, type v1, type v2) exprtk_test_override { return (v0 + v1 + v2); }
5857 inline T operator()(type v0, type v1) exprtk_test_override { return (v0 + v1); }
5858 inline T operator()(type v0) exprtk_test_override { return v0; }
5859 inline T operator()() exprtk_test_override { return T("1.1234"); }
5860};
5861
5862template <typename T> struct test_func5 exprtk_test_final : public base_func<T> { test_func5() : base_func<T>(5){} };
5863template <typename T> struct test_func4 exprtk_test_final : public base_func<T> { test_func4() : base_func<T>(4){} };
5864template <typename T> struct test_func3 exprtk_test_final : public base_func<T> { test_func3() : base_func<T>(3){} };
5865template <typename T> struct test_func2 exprtk_test_final : public base_func<T> { test_func2() : base_func<T>(2){} };
5866template <typename T> struct test_func1 exprtk_test_final : public base_func<T> { test_func1() : base_func<T>(1){} };
5867template <typename T> struct test_func0 exprtk_test_final : public base_func<T> { test_func0() : base_func<T>(0){} };
5868
5869template <typename T>
5871{
5872 typedef exprtk::expression<T> expression_t;
5873
5874 T x = T(1.1);
5875 T y = T(2.2);
5876 T z = T(3.3);
5877 T w = T(4.4);
5878 T u = T(5.5);
5879
5880 test_func0<T> test_func00;
5881 test_func1<T> test_func01;
5882 test_func2<T> test_func02;
5883 test_func3<T> test_func03;
5884 test_func4<T> test_func04;
5885 test_func5<T> test_func05;
5886
5887 exprtk::symbol_table<T> symbol_table;
5888 symbol_table.add_constants();
5889 symbol_table.add_variable("x",x);
5890 symbol_table.add_variable("y",y);
5891 symbol_table.add_variable("z",z);
5892 symbol_table.add_variable("w",w);
5893 symbol_table.add_variable("u",u);
5894
5895 symbol_table.add_function("test_func0",test_func00);
5896 symbol_table.add_function("test_func1",test_func01);
5897 symbol_table.add_function("test_func2",test_func02);
5898 symbol_table.add_function("test_func3",test_func03);
5899 symbol_table.add_function("test_func4",test_func04);
5900 symbol_table.add_function("test_func5",test_func05);
5901
5902 static const std::string expr_str_list[] =
5903 {
5904 "test_func0 = test_func0()",
5905 "test_func0 == test_func0()",
5906 "equal(1.1 + test_func0,test_func0() + 1.1)",
5907 "equal(test_func0 + 1.1,1.1 + test_func0())",
5908 "equal((1.1 + test_func0),(test_func0() + 1.1))",
5909 "equal((test_func0 + 1.1),(1.1 + test_func0()))",
5910 "equal(test_func0,test_func0())",
5911 "equal(test_func0,1.1234)",
5912 "equal(test_func0(),1.1234)",
5913 "equal(test_func0 + test_func0(),2 * 1.1234)",
5914 "equal((test_func0 + test_func0()),2 * 1.1234)",
5915 "equal((test_func0) + (test_func0()),2 * 1.1234)",
5916 "equal(test_func1(x),(x))",
5917 "equal(test_func2(x,y),(x + y))",
5918 "equal(test_func3(x,y,z),(x + y + z))",
5919 "equal(test_func4(x,y,z,w),(x + y + z + w))",
5920 "equal(test_func5(x,y,z,w,u),(x + y + z + w + u))",
5921 "equal(1.1 + test_func0,1.1234 + 1.1)",
5922 "equal(1.1 + test_func0(),1.1234 + 1.1)",
5923 "equal(1.1 + test_func1(x),(x + 1.1))",
5924 "equal(1.1 + test_func2(x,y),(x + y + 1.1))",
5925 "equal(1.1 + test_func3(x,y,z),(x + y + z + 1.1))",
5926 "equal(1.1 + test_func4(x,y,z,w),(x + y + z + w + 1.1))",
5927 "equal(1.1 + test_func5(x,y,z,w,u),(x + y + z + w + u + 1.1))",
5928 "equal(test_func0 + 2.2,1.1234 + 2.2)",
5929 "equal(test_func0() + 2.2,1.1234 + 2.2)",
5930 "equal(test_func1(x) + 2.2,(x + 2.2))",
5931 "equal(test_func2(x,y) + 2.2,(x + y + 2.2))",
5932 "equal(test_func3(x,y,z) + 2.2,(x + y + z + 2.2))",
5933 "equal(test_func4(x,y,z,w) + 2.2,(x + y + z + w + 2.2))",
5934 "equal(test_func5(x,y,z,w,u) + 2.2,(x + y + z + w + u + 2.2))",
5935 "equal({[test_func1(x)]},{[(x)]})",
5936 "equal({[test_func2(x,y)]},{[(x + y)]})",
5937 "equal({[test_func3(x,y,z)]},{[(x + y + z)]})",
5938 "equal({[test_func4(x,y,z,w)]},{[(x + y + z + w)]})",
5939 "equal({[test_func5(x,y,z,w,u)]},{[(x + y + z + w + u)]})",
5940 "equal(test_func1(2.12),(2.12))",
5941 "equal(test_func2(2.12,3.12),(2.12 + 3.12))",
5942 "equal(test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12))",
5943 "equal(test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12))",
5944 "equal(test_func5(2.12,3.12,4.12,5.12,6.12),(2.12 + 3.12 + 4.12 + 5.12 + 6.12))",
5945 "equal(1.1 + test_func1(2.12),(2.12 + 1.1))",
5946 "equal(1.1 + test_func2(2.12,3.12),(2.12 + 3.12 + 1.1))",
5947 "equal(1.1 + test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12 + 1.1))",
5948 "equal(1.1 + test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12 + 1.1))",
5949 "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))",
5950 "equal(test_func1(2.12) + 2.2,(2.12 + 2.2))",
5951 "equal(test_func2(2.12,3.12) + 2.2,(2.12 + 3.12 + 2.2))",
5952 "equal(test_func3(2.12,3.12,4.12) + 2.2,(2.12 + 3.12 + 4.12 + 2.2))",
5953 "equal(test_func4(2.12,3.12,4.12,5.12) + 2.2,(2.12 + 3.12 + 4.12 + 5.12 + 2.2))",
5954 "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))",
5955 "equal({[test_func1(2.12)]},{[(2.12)]})",
5956 "equal({[test_func2(2.12,3.12)]},{[(2.12 + 3.12)]})",
5957 "equal({[test_func3(2.12,3.12,4.12)]},{[(2.12 + 3.12 + 4.12)]})",
5958 "equal({[test_func4(2.12,3.12,4.12,5.12)]},{[(2.12 + 3.12 + 4.12 + 5.12)]})",
5959 "equal({[test_func5(2.12,3.12,4.12,5.12,6.12)]},{[(2.12 + 3.12 + 4.12 + 5.12 + 6.12)]})",
5960 "TeSt_FuNc0 = tEsT_fUnC0()",
5961 "TEst_fuNC0 == tESt_fUNc0()",
5962 "EquaL(tEsT_FuNC1(x),(x))",
5963 "eQuAl(teSt_fUnc2(x,y),(x + y))",
5964 "EqUaL(tEsT_fUNc3(x,y,z),(x + y + z))",
5965 "EQUal(TEst_FunC4(x,y,z,w),(x + y + z + w))",
5966 "eqUAL(tEsT_FuNc5(x,y,z,w,u),(x + y + z + w + u))"
5967 };
5968 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5969
5970 std::deque<expression_t> expression_list;
5971
5972 for (std::size_t i = 0; i < expr_str_list_size; ++i)
5973 {
5974 expression_t expression;
5975 expression.register_symbol_table(symbol_table);
5976
5977 exprtk::parser<T> parser;
5978
5979 if (!parser.compile(expr_str_list[i],expression))
5980 {
5981 printf("run_test16() - Error: %s Expression: %s\n",
5982 parser.error().c_str(),
5983 expr_str_list[i].c_str());
5984
5985 return false;
5986 }
5987 else
5988 expression_list.push_back(expression);
5989 }
5990
5991 bool error_found = false;
5992
5993 for (std::size_t i = 0; i < expression_list.size(); ++i)
5994 {
5995 if (T(1) != expression_list[i].value())
5996 {
5997 printf("run_test16() - Error in evaluation! (1) Expression: %s\n",
5998 expr_str_list[i].c_str());
5999
6000 error_found = true;
6001 }
6002 }
6003
6004 return !error_found;
6005}
6006
6007template <typename T>
6009{
6010 typedef exprtk::expression<T> expression_t;
6011
6012 T x = T(1.1);
6013 T y = T(2.2);
6014 T z = T(3.3);
6015 T w = T(4.4);
6016 T u = T(5.5);
6017 T v = T(6.6);
6018 T t = T(7.7);
6019
6020 T one = T(1);
6021 T zero = T(0);
6022
6023 exprtk::symbol_table<T> symbol_table;
6024 symbol_table.add_constants();
6025 symbol_table.add_variable("x",x);
6026 symbol_table.add_variable("y",y);
6027 symbol_table.add_variable("z",z);
6028 symbol_table.add_variable("w",w);
6029 symbol_table.add_variable("u",u);
6030 symbol_table.add_variable("v",v);
6031 symbol_table.add_variable("t",t);
6032
6033 symbol_table.add_variable("one",one);
6034 symbol_table.add_variable("zero",zero);
6035
6036 static const std::string expr_str_list[] =
6037 {
6038 "equal(mand(one,one),1.0)",
6039 "equal(mand(one,zero),0.0)",
6040 "equal(mand(zero,one),0.0)",
6041 "equal(mand(zero,zero),0.0)",
6042 "equal(mand(one,one),1.0)",
6043 "equal(mand(one,one,one),1.0)",
6044 "equal(mand(one,one,one,one),1.0)",
6045 "equal(mand(one,one,one,one,one),1.0)",
6046 "equal(mand(one,one,zero),0.0)",
6047 "equal(mand(one,one,one,zero),0.0)",
6048 "equal(mand(one,one,one,one,zero),0.0)",
6049 "equal(mand(one,one,one,one,one,zero),0.0)",
6050 "equal(mor(one,one),1.0)",
6051 "equal(mor(one,zero),1.0)",
6052 "equal(mor(zero,one),1.0)",
6053 "equal(mor(zero,zero),0.0)",
6054 "equal(mor(one,one),1.0)",
6055 "equal(mor(one,one,zero),1.0)",
6056 "equal(mor(one,zero,one),1.0)",
6057 "equal(mor(one,zero,one,zero),1.0)",
6058 "equal(mor(zero,one),1.0)",
6059 "equal(mor(zero,zero,one),1.0)",
6060 "equal(mor(zero,zero,zero,zero,one),1.0)",
6061 "equal(mor(zero,zero,zero,zero,zero,one),1.0)",
6062 "equal(mor(zero,zero,zero,zero,zero,zero,zero,zero),0.0)",
6063 "equal((one nand one),not(mand(one,one)))",
6064 "equal((one nand zero),not(mand(one,zero)))",
6065 "equal((zero nand one),not(mand(zero,one)))",
6066 "equal((zero nand zero),not(mand(zero,zero)))",
6067 "equal((one nor one),not(mor(one,one)))",
6068 "equal((one nor zero),not(mor(one,zero)))",
6069 "equal((zero nor one),not(mor(zero,one)))",
6070 "equal((zero nor zero),not(mor(zero,zero)))",
6071 "equal(sum(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
6072 "equal(sum(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
6073 "equal(mul(x,y,z,w,u,v,t),(x*y*z*w*u*v*t))",
6074 "equal(mul(x*t,y*v,z*u,w*w,u*z,v*y,t*x),(x*y*z*w*u*v*t)^2)",
6075 "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))",
6076 "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))",
6077 "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))",
6078 "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))",
6079 "equal(min(x,y,z,w,u,v,t,zero),zero)",
6080 "equal(min(x+y,z+w,u+v,t,zero),zero)",
6081 "equal(max(one,x,y,z,w,u,v,t),t)",
6082 "equal(max(x+y,z+w,u+v,t,one),u+v)",
6083 "equal(avg(x,y,z,w,u,v,t),(x+y+z+w+u+v+t)/7.0)",
6084 "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))"
6085 };
6086 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6087
6088 std::deque<expression_t> expression_list;
6089
6090 for (std::size_t i = 0; i < expr_str_list_size; ++i)
6091 {
6092 expression_t expression;
6093 expression.register_symbol_table(symbol_table);
6094
6095 exprtk::parser<T> parser;
6096
6097 if (!parser.compile(expr_str_list[i],expression))
6098 {
6099 printf("run_test17() - Error: %s Expression: %s\n",
6100 parser.error().c_str(),
6101 expr_str_list[i].c_str());
6102
6103 return false;
6104 }
6105 else
6106 expression_list.push_back(expression);
6107 }
6108
6109 bool error_found = false;
6110
6111 for (std::size_t i = 0; i < expression_list.size(); ++i)
6112 {
6113 if (T(1) != expression_list[i].value())
6114 {
6115 printf("run_test17() - Error in evaluation! (1) Expression: %s\n",
6116 expr_str_list[i].c_str());
6117
6118 error_found = true;
6119 }
6120 }
6121
6122 return !error_found;
6123}
6124
6125template <typename T>
6127{
6129 {
6131 exprtk::set_min_num_args(*this, 0);
6132 exprtk::set_max_num_args(*this, 20);
6133 }
6134
6135 inline T operator()(const std::vector<T>& arglist) exprtk_test_override
6136 {
6137 T result = T(0);
6138
6139 for (std::size_t i = 0; i < arglist.size(); ++i)
6140 {
6141 result += arglist[i];
6142 }
6143
6144 return result;
6145 }
6146};
6147
6148template <typename T>
6150{
6153
6157
6158 using exprtk::igeneric_function<T>::operator();
6159
6161 : scalar_count(0)
6162 , vector_count(0)
6163 , string_count(0)
6164 {}
6165
6167 {
6168 for (std::size_t i = 0; i < params.size(); ++i)
6169 {
6170 generic_type& gt = params[i];
6171
6172 switch (gt.type)
6173 {
6175 break;
6176
6178 break;
6179
6180 case generic_type::e_string : {
6181 if (
6182 ("CdEf" != exprtk::to_str(string_t(gt))) &&
6183 ("abc123" != exprtk::to_str(string_t(gt)))
6184 )
6185 {
6186 return std::numeric_limits<T>::quiet_NaN();
6187 }
6188 else
6189 string_count++;
6190 }
6191 break;
6192
6193 default : return std::numeric_limits<T>::quiet_NaN();
6194 }
6195 }
6196
6197 return T(0);
6198 }
6199
6200 std::size_t scalar_count;
6201 std::size_t vector_count;
6202 std::size_t string_count;
6203};
6204
6205template <typename T>
6207{
6209
6210 using exprtk::igeneric_function<T>::operator();
6211
6213 {}
6214
6216 {
6217 return T(0);
6218 }
6219
6220 inline T operator()(const std::size_t&, parameter_list_t params) exprtk_test_override
6221 {
6222 return this->operator()(params);
6223 }
6224};
6225
6226template <typename T>
6228{
6231
6235
6236 using exprtk::igeneric_function<T>::operator();
6237
6239 {}
6240
6242 {
6243 for (std::size_t i = 0; i < params.size(); ++i)
6244 {
6245 generic_type& gt = params[i];
6246
6247 switch (gt.type)
6248 {
6249 case generic_type::e_scalar : {
6250 scalar_t scalar(gt);
6251 scalar() += T(1);
6252 }
6253 break;
6254
6255 case generic_type::e_vector : {
6256 vector_t vector(gt);
6257
6258 for (std::size_t x = 0; x < vector.size(); ++x)
6259 {
6260 vector[x] += T(1);
6261 }
6262 }
6263 break;
6264
6265 case generic_type::e_string : {
6266 string_t string(gt);
6267
6268 for (std::size_t x = 0; x < string.size(); ++x)
6269 {
6270 string[x] += static_cast<typename string_t::value_t>(1);
6271 }
6272 }
6273 break;
6274
6275 default : return std::numeric_limits<T>::quiet_NaN();
6276 }
6277 }
6278
6279 return T(0);
6280 }
6281
6282 inline T operator()(const std::size_t&, parameter_list_t params) exprtk_test_override
6283 {
6284 return this->operator()(params);
6285 }
6286};
6287
6288template <typename T>
6290{
6295
6296 using exprtk::igeneric_function<T>::operator();
6297
6301
6302 inline T operator()(std::string& result, parameter_list_t params) exprtk_test_override
6303 {
6304 string_t string(params[0]);
6305
6306 result.reserve(string.size());
6307 result.clear();
6308
6309 char c;
6310
6311 for (std::size_t i = 0; i < string.size(); ++i)
6312 {
6313 if (' ' != (c = string[i]))
6314 result += static_cast<char>(std::toupper(c));
6315 }
6316
6317 return T(0);
6318 }
6319
6320 inline T operator()(const std::size_t& param_seq_index, std::string& result, parameter_list_t params) exprtk_test_override
6321 {
6322 if (1 == param_seq_index)
6323 return this->operator()(result,params);
6324 else
6325 return T(0);
6326 }
6327};
6328
6329template <typename T>
6331{
6334
6337
6340
6341 using exprtk::igeneric_function<T>::operator();
6342
6344 : exprtk::igeneric_function<T>("Z|T*|V")
6345 {}
6346
6347 inline T operator()(const std::size_t& ps_index, parameter_list_t /*arglist*/) exprtk_test_override
6348 {
6349 switch (ps_index)
6350 { // Overload resolution:
6351 case 0 : return T(0); // Z - Zero arguments
6352 case 1 : return T(1); // T* - One or more scalars
6353 case 2 : return T(2); // V - One vector
6354 default : return std::numeric_limits<T>::quiet_NaN();
6355 }
6356 }
6357};
6358
6359template <typename T>
6361{
6364
6367
6369
6370 using exprtk::igeneric_function<T>::operator();
6371
6373 : exprtk::igeneric_function<T>("V")
6374 {}
6375
6377 {
6378 vector_t v(params[0]);
6379 return std::accumulate(v.begin(), v.end(), T(0));
6380 }
6381};
6382
6383template <typename T>
6385{
6390
6391 using exprtk::igeneric_function<T>::operator();
6392
6393 overload_func(const std::string& param_seq_list)
6394 : exprtk::igeneric_function<T>(param_seq_list, igfun_t::e_rtrn_overload)
6395 , current_ps_index(std::numeric_limits<std::size_t>::max())
6396 {
6397 clear();
6398 }
6399
6400 void clear()
6401 {
6402 current_ps_index = std::numeric_limits<std::size_t>::max();
6403 current_param_seq = "";
6404 }
6405
6406 inline T operator()(const std::size_t& ps_index,
6408 {
6409 current_ps_index = ps_index;
6410 determine_param_seq(parameters);
6411 return T(1);
6412 }
6413
6414 inline T operator()(const std::size_t& ps_index,
6415 std::string& result,
6417 {
6418 current_ps_index = ps_index;
6419 determine_param_seq(parameters);
6420 result = "string result";
6421 return T(1);
6422 }
6423
6425 {
6426 current_param_seq = "";
6427
6428 for (std::size_t i = 0; i < parameters.size(); ++i)
6429 {
6430 generic_type& gt = parameters[i];
6431
6432 switch (gt.type)
6433 {
6435 break;
6436
6438 break;
6439
6441 break;
6442
6443 default : continue;
6444 }
6445 }
6446 }
6447
6448 std::size_t current_ps_index;
6450
6452 {
6453 test_result_t(const std::size_t psi, const std::string& ps)
6454 : ps_index(psi)
6455 , param_seq(ps)
6456 {}
6457
6458 std::size_t ps_index;
6459 std::string param_seq;
6460 };
6461};
6462
6473
6474template <typename T>
6476{
6477 {
6478 exprtk::symbol_table<T> symbol_table;
6479 symbol_table.remove_variable("x",true);
6480 symbol_table.remove_variable("x",false);
6481 symbol_table.remove_stringvar("x");
6482 symbol_table.remove_function("x");
6483 symbol_table.remove_vararg_function("x");
6484 symbol_table.remove_vector("x");
6485 }
6486
6487 {
6488 exprtk::symbol_table<T> symbol_table;
6489
6490 {
6491 T x;
6492 const bool result1 = symbol_table.add_variable("x", x);
6493 const bool result2 = symbol_table.remove_variable("x");
6494 const bool result3 = symbol_table.remove_variable("x");
6495
6496 if (!result1 || !result2 || result3)
6497 {
6498 printf("run_test18() - Failed sym_tab add/remove [1]\n");
6499 }
6500 }
6501
6502 {
6503 std::string x;
6504 const bool result1 = symbol_table.add_stringvar("x", x);
6505 const bool result2 = symbol_table.remove_stringvar("x");
6506 const bool result3 = symbol_table.remove_stringvar("x");
6507
6508 if (!result1 || !result2 || result3)
6509 {
6510 printf("run_test18() - Failed sym_tab add/remove [2]\n");
6511 }
6512 }
6513
6514 {
6515 std::vector<T> x(10,T(0));
6516 const bool result1 = symbol_table.add_vector("x", x);
6517 const bool result2 = symbol_table.remove_vector("x");
6518 const bool result3 = symbol_table.remove_vector("x");
6519
6520 if (!result1 || !result2 || result3)
6521 {
6522 printf("run_test18() - Failed sym_tab add/remove [3]\n");
6523 }
6524 }
6525
6526 {
6527 myfunc<T> x;
6528 const bool result1 = symbol_table.add_function("x", x);
6529 const bool result2 = symbol_table.remove_function("x");
6530 const bool result3 = symbol_table.remove_function("x");
6531
6532 if (!result1 || !result2 || result3)
6533 {
6534 printf("run_test18() - Failed sym_tab add/remove [4]\n");
6535 }
6536 }
6537
6538 {
6539 va_func<T> x;
6540 const bool result1 = symbol_table.add_function("x", x);
6541 const bool result2 = symbol_table.remove_vararg_function("x");
6542 const bool result3 = symbol_table.remove_vararg_function("x");
6543
6544 if (!result1 || !result2 || result3)
6545 {
6546 printf("run_test18() - Failed sym_tab add/remove [5]\n");
6547 }
6548 }
6549
6550 {
6551 symbol_table.add_function("foo1",foo1);
6552 symbol_table.add_function("foo2",foo2);
6553 symbol_table.add_function("foo3",foo3);
6554 symbol_table.add_function("foo4",foo4);
6555 symbol_table.add_function("foo5",foo5);
6556 symbol_table.add_function("foo6",foo6);
6557
6558 symbol_table.remove_function("foo1");
6559 symbol_table.remove_function("foo2");
6560 symbol_table.remove_function("foo3");
6561 symbol_table.remove_function("foo4");
6562 symbol_table.remove_function("foo5");
6563 symbol_table.remove_function("foo6");
6564 }
6565 }
6566
6567 {
6568 typedef exprtk::expression<T> expression_t;
6569
6570 T x = T(1.1);
6571 T y = T(2.2);
6572 T z = T(3.3);
6573 T w = T(4.4);
6574 T u = T(5.5);
6575 T v = T(6.6);
6576 T t = T(7.7);
6577
6578 va_func<T> vaf;
6579
6580 exprtk::symbol_table<T> symbol_table;
6581 symbol_table.add_constants();
6582 symbol_table.add_variable("x",x);
6583 symbol_table.add_variable("y",y);
6584 symbol_table.add_variable("z",z);
6585 symbol_table.add_variable("w",w);
6586 symbol_table.add_variable("u",u);
6587 symbol_table.add_variable("v",v);
6588 symbol_table.add_variable("t",t);
6589 symbol_table.add_function("va_func",vaf);
6590
6591 static const std::string expr_str_list[] =
6592 {
6593 "equal(va_func,(0))",
6594 "equal(va_func(),(0))",
6595 "equal(va_func(1,2,3,4,5,6,7,8,9),(1+2+3+4+5+6+7+8+9))",
6596 "equal(va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9))",
6597 "equal(va_func(x,2,y,4,z,6,w,8,u),(x+2+y+4+z+6+w+8+u))",
6598 "equal(va_func(x,y,z,w,u,v,t,1,2,3),(x+y+z+w+u+v+t+1+2+3))",
6599 "equal(va_func(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
6600 "equal(va_func(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
6601 "equal(1+va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9)+1)",
6602 "equal(va_func(va_func(x,y,z,w,u,v,t),va_func(x,y,z,w,u,v,t)),2*(x+y+z+w+u+v+t))",
6603 "equal(va_func(va_func(x),va_func(y),va_func(z)),va_func(x,y,z))",
6604 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x)))))))),x)",
6605 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(123.456)))))))),123.456)",
6606 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+1)))))))),x+1)",
6607 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+y)))))))),x+y)"
6608 };
6609 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6610
6611 std::deque<expression_t> expression_list;
6612
6613 for (std::size_t i = 0; i < expr_str_list_size; ++i)
6614 {
6615 expression_t expression;
6616 expression.register_symbol_table(symbol_table);
6617
6618 exprtk::parser<T> parser;
6619
6620 if (!parser.compile(expr_str_list[i],expression))
6621 {
6622 printf("run_test18() - [1] VarArg Error: %s Expression: %s\n",
6623 parser.error().c_str(),
6624 expr_str_list[i].c_str());
6625
6626 return false;
6627 }
6628 else
6629 expression_list.push_back(expression);
6630 }
6631
6632 bool error_found = false;
6633
6634 for (std::size_t i = 0; i < expression_list.size(); ++i)
6635 {
6636 if (T(1) != expression_list[i].value())
6637 {
6638 printf("run_test18() - Error in evaluation! (1) Expression: %s\n",
6639 expr_str_list[i].c_str());
6640
6641 error_found = true;
6642 }
6643 }
6644
6645 if (error_found)
6646 {
6647 return false;
6648 }
6649 }
6650
6651 {
6652 typedef exprtk::symbol_table<T> symbol_table_t;
6653 typedef exprtk::expression<T> expression_t;
6654 typedef exprtk::parser<T> parser_t;
6655
6656 T x = T(33);
6657 T y = T(77);
6658
6659 T v0[] = { T(1), T(1), T(1), T(1) };
6660 T v1[] = { T(1), T(2), T(3), T(4) };
6661
6662 std::vector<T> v2;
6663
6664 v2.push_back(T(5));
6665 v2.push_back(T(6));
6666 v2.push_back(T(7));
6667 v2.push_back(T(8));
6668
6669 std::string s0 = "AbCdEfGhIj";
6670
6671 gen_func<T> f;
6672
6673 symbol_table_t symbol_table;
6674
6675 symbol_table.add_constants();
6676
6677 symbol_table.add_variable ("x" , x);
6678 symbol_table.add_variable ("y" , y);
6679 symbol_table.add_vector ("v0" ,v0);
6680 symbol_table.add_vector ("v1" ,v1);
6681 symbol_table.add_vector ("v2" ,v2);
6682 symbol_table.add_stringvar("s0", s0);
6683 symbol_table.add_function ("gen_func", f);
6684
6685 const std::string expression_list[] =
6686 {
6687 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6]);",
6688 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6]);",
6689 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0);",
6690 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2);",
6691 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2]);",
6692 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x);",
6693 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y);",
6694 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z);",
6695 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func('abc123', s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3);",
6696 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; gen_func(s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');"
6697 };
6698
6699 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6700
6701 bool error_found = false;
6702
6703 for (std::size_t i = 0; i < expression_list_size; ++i)
6704 {
6705 const std::string& expression_str = expression_list[i];
6706 expression_t expression;
6707
6708 expression.register_symbol_table(symbol_table);
6709
6710 parser_t parser;
6711
6712 if (!parser.compile(expression_str,expression))
6713 {
6714 printf("run_test18() - [2] GenFunc Error: %s Expression: %s [2]\n",
6715 parser.error().c_str(),
6716 expression_str.c_str());
6717
6718 error_found = true;
6719 continue;
6720 }
6721
6722 f.scalar_count = 0;
6723 f.vector_count = 0;
6724 f.string_count = 0;
6725
6726 expression.value();
6727
6728 if (
6729 (4 != f.scalar_count) ||
6730 (3 != f.vector_count) ||
6731 (2 != f.string_count)
6732 )
6733 {
6734 printf("run_test18() - Error in evaluation! (2) Expression: %s "
6735 "sc_count = %d "
6736 "vr_count = %d "
6737 "st_count = %d\n",
6738 expression_list[i].c_str(),
6739 static_cast<int>(f.scalar_count),
6740 static_cast<int>(f.vector_count),
6741 static_cast<int>(f.string_count));
6742
6743 error_found = true;
6744 }
6745
6746 expression.release();
6747 }
6748
6749 if (error_found)
6750 {
6751 return false;
6752 }
6753 }
6754
6755 {
6756 typedef exprtk::symbol_table<T> symbol_table_t;
6757 typedef exprtk::expression<T> expression_t;
6758 typedef exprtk::parser<T> parser_t;
6759
6760 T x = T(33);
6761 T y = T(77);
6762
6763 T v0[] = { T(1), T(1), T(1), T(1) };
6764 T v1[] = { T(1), T(2), T(3), T(4) };
6765 T v2[] = { T(5), T(6), T(7), T(8) };
6766
6767 std::string s0 = "AbCdEfGhIj";
6768
6769 gen_func2<T> f;
6770
6771 symbol_table_t symbol_table;
6772
6773 symbol_table.add_constants();
6774
6775 symbol_table.add_variable ("x" , x);
6776 symbol_table.add_variable ("y" , y);
6777 symbol_table.add_vector ("v0" ,v0);
6778 symbol_table.add_vector ("v1" ,v1);
6779 symbol_table.add_vector ("v2" ,v2);
6780 symbol_table.add_stringvar("s0", s0);
6781 symbol_table.add_function ("foo", f);
6782
6783 const std::string expression_list[] =
6784 {
6785 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6]);",
6786 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0);",
6787 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2);",
6788 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x, 2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2]);",
6789 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(2x + y, z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x);",
6790 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(z, 2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y);",
6791 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(2w / 3, 'abc123',s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z);",
6792 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo('abc123', s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3);",
6793 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0[2:6],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');",
6794 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0[2:3]+s0[4:5],v0, v1 + v2, v0[2], x, 2x + y, z,2w / 3, 'abc123');",
6795 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6796 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6797 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6798 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6799 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6800 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6801 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6802 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6803 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6804 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6805 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6806 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6807 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6808 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6809 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6810 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6811 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6812 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6813 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6814 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6815 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6816 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6817 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6818 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6819 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6820 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6821 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6822 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6823 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6824 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6825 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);",
6826 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v1 + v2, v0[2], x, 2x + y, z, 2w / 3, 'abc123',s0[2:5]);"
6827 };
6828
6829 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6830
6831 const std::string parameter_type_list[] =
6832 {
6833 "VVTTTTVSS",
6834 "VTTTTVSSV",
6835 "TTTTVSSVV",
6836 "TTTVSSVVT",
6837 "TTVSSVVT*",
6838 "TVSSVVT*" ,
6839 "VSSVVT*" ,
6840 "SSVVTTTTV",
6841 "SVVTTTTVS",
6842 "SVVTTTTVS",
6843 "V*T*VS*" ,
6844 "V*TTTTVSS",
6845 "VVT*VSS" ,
6846 "VVTTTTVS*",
6847 "T*",
6848 "T*",
6849 "T*",
6850 "T*",
6851 "S*",
6852 "S*",
6853 "S*",
6854 "S*",
6855 "V*",
6856 "V*",
6857 "V*",
6858 "V*",
6859 "T",
6860 "TT",
6861 "TTT",
6862 "TTTT",
6863 "S",
6864 "SS",
6865 "SSS",
6866 "SSSS",
6867 "V",
6868 "VV",
6869 "VVV",
6870 "VVVV",
6871 "TTTTTTT|STSTSTS|V*T*VS*" ,
6872 "TTTTTTT|STSTSTS|V*TTTTVSS",
6873 "TTTTTTT|STSTSTS|VVT*VSS" ,
6874 "TTTTTTT|STSTSTS|VVTTTTVS*",
6875 };
6876
6877 bool error_found = false;
6878
6879 for (std::size_t i = 0; i < expression_list_size; ++i)
6880 {
6881 const std::string& expression_str = expression_list[i];
6882 expression_t expression;
6883
6884 expression.register_symbol_table(symbol_table);
6885
6886 parser_t parser;
6887
6888 f.parameter_sequence = parameter_type_list[i];
6889
6890 if (!parser.compile(expression_str,expression))
6891 {
6892 printf("run_test18() - [3] GenFunc2 Error: %s Expression: %s Parameter Sequence: %s [3]\n",
6893 parser.error().c_str(),
6894 expression_str.c_str(),
6895 parameter_type_list[i].c_str());
6896
6897 error_found = true;
6898 continue;
6899 }
6900
6901 expression.value();
6902 }
6903
6904 if (error_found)
6905 {
6906 return false;
6907 }
6908 }
6909
6910 {
6911 bool error_found = false;
6912
6913 const std::string expression_list[] =
6914 {
6915 "foo(v0,v1,v2,x,y,s0);",
6916 "foo(v1,v2,x,y,s0,v0);",
6917 "foo(v2,x,y,s0,v0,v1);",
6918 "foo(x,y,s0,v0,v1,v2);",
6919 "foo(y,s0,v0,v1,v2,x);",
6920 "foo(s0,v0,v1,v2,x,y);"
6921 };
6922
6923 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6924
6925 const std::string parameter_type_list[] =
6926 {
6927 "VVVTTS",
6928 "VVTTSV",
6929 "VTTSVV",
6930 "TTSVVV",
6931 "TSVVVT",
6932 "SVVVTT"
6933 };
6934
6935 for (std::size_t i = 0; i < expression_list_size; ++i)
6936 {
6937 typedef exprtk::symbol_table<T> symbol_table_t;
6938 typedef exprtk::expression<T> expression_t;
6939 typedef exprtk::parser<T> parser_t;
6940
6941 T x = T(33);
6942 T y = T(77);
6943
6944 T v0[] = { T(1), T(1), T(1), T(1) };
6945 T v1[] = { T(1), T(2), T(3), T(4) };
6946 T v2[] = { T(5), T(6), T(7), T(8) };
6947
6948 std::string s0 = "AbCdEfGhIj";
6949
6950 T x_inc = T(34);
6951 T y_inc = T(78);
6952
6953 T v0_inc[] = { T(2), T(2), T(2), T(2) };
6954 T v1_inc[] = { T(2), T(3), T(4), T(5) };
6955 T v2_inc[] = { T(6), T(7), T(8), T(9) };
6956
6957 std::size_t sizeof_vec = sizeof(v0) / sizeof(T);
6958
6959 std::string s0_inc = "BcDeFgHiJk";
6960
6961 inc_func<T> f;
6962
6963 symbol_table_t symbol_table;
6964
6965 symbol_table.add_constants();
6966
6967 symbol_table.add_variable ("x" , x );
6968 symbol_table.add_variable ("y" , y );
6969 symbol_table.add_vector ("v0" , v0);
6970 symbol_table.add_vector ("v1" , v1);
6971 symbol_table.add_vector ("v2" , v2);
6972 symbol_table.add_stringvar("s0", s0);
6973 symbol_table.add_function ("foo", f );
6974
6975 expression_t expression;
6976
6977 expression.register_symbol_table(symbol_table);
6978
6979 parser_t parser;
6980
6981 f.parameter_sequence = parameter_type_list[i];
6982
6983 if (!parser.compile(expression_list[i],expression))
6984 {
6985 printf("run_test18() - [4] IncFunc Error: %s Expression: %s Parameter Sequence: %s [4]\n",
6986 parser.error().c_str(),
6987 expression_list[i].c_str(),
6988 parameter_type_list[i].c_str());
6989
6990 error_found = true;
6991 continue;
6992 }
6993
6994 expression.value();
6995
6996 if (x != x_inc)
6997 {
6998 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: x\n",
6999 expression_list[i].c_str());
7000 error_found = true;
7001 }
7002
7003 if (y != y_inc)
7004 {
7005 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
7006 expression_list[i].c_str());
7007 error_found = true;
7008 }
7009
7010 if (s0 != s0_inc)
7011 {
7012 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
7013 expression_list[i].c_str());
7014 error_found = true;
7015 }
7016
7017 if (!std::equal(v0,v0 + sizeof_vec,v0_inc))
7018 {
7019 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v0\n",
7020 expression_list[i].c_str());
7021 error_found = true;
7022 }
7023
7024 if (!std::equal(v1,v1 + sizeof_vec,v1_inc))
7025 {
7026 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v1\n",
7027 expression_list[i].c_str());
7028 error_found = true;
7029 }
7030
7031 if (!std::equal(v2,v2 + sizeof_vec,v2_inc))
7032 {
7033 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v2\n",
7034 expression_list[i].c_str());
7035 error_found = true;
7036 }
7037 }
7038
7039 if (error_found)
7040 {
7041 return false;
7042 }
7043 }
7044
7045 {
7046 bool error_found = false;
7047
7049
7050 std::string s0 = "XXXXXXXXXXXXXXX";
7051 std::string s1 = "XXXXXXXXXXXXXXX";
7052 std::string s2 = "XXXXXXXXXXXXXXX";
7053 std::string s3 = "XXXXXXXXXXXXXXX";
7054 std::string s4 = "XXXXXXXXXXXXXXX";
7055
7056 typedef exprtk::symbol_table<T> symbol_table_t;
7057 typedef exprtk::expression<T> expression_t;
7058 typedef exprtk::parser<T> parser_t;
7059
7060 symbol_table_t symbol_table;
7061
7062 symbol_table.add_constants();
7063
7064 symbol_table.add_stringvar("s0", s0);
7065 symbol_table.add_stringvar("s1", s1);
7066 symbol_table.add_stringvar("s2", s2);
7067 symbol_table.add_stringvar("s3", s3);
7068 symbol_table.add_stringvar("s4", s4);
7069
7070 symbol_table.add_function("remspc_uc", rsauc);
7071
7072 const std::string program =
7073 " s0 := 'How now '; "
7074 " s1 := 'brown cow?'; "
7075 " s2 := remspc_uc(s0 + s1); "
7076 " s3 := remspc_uc(s0) + s1; "
7077 " s4 := s0 + remspc_uc(s1); "
7078 " remspc_uc(s0 + s1) == remspc_uc(s0) + remspc_uc(s1); ";
7079
7080 const std::string parameter_type_list[] =
7081 {
7082 "VVVTTT|S",
7083 "VVTTTV|S",
7084 "VTTTVV|S",
7085 "TTTVVV|S",
7086 "TTVVVT|S",
7087 "TVVVTT|S"
7088 };
7089
7090 std::size_t parameter_type_list_size = sizeof(parameter_type_list) / sizeof(std::string);
7091
7092 for (std::size_t i = 0; i < parameter_type_list_size; ++i)
7093 {
7094 expression_t expression;
7095
7096 expression.register_symbol_table(symbol_table);
7097
7098 parser_t parser;
7099
7100 rsauc.parameter_sequence = parameter_type_list[i];
7101
7102 if (!parser.compile(program,expression))
7103 {
7104 printf("run_test18() - [5] Error: %s\tExpression: %s\n",
7105 parser.error().c_str(),
7106 program.c_str());
7107
7108 return false;
7109 }
7110
7111 const T result = expression.value();
7112
7113 if (result != T(1))
7114 {
7115 printf("run_test18() - Error in evaluation! (4) Expression: %s Result <> 1\n",
7116 program.c_str());
7117 error_found = true;
7118 }
7119
7120 if (result != T(1))
7121 {
7122 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
7123 program.c_str());
7124 error_found = true;
7125 }
7126
7127 if ("How now " != s0)
7128 {
7129 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
7130 program.c_str());
7131 error_found = true;
7132 }
7133
7134 if ("brown cow?" != s1)
7135 {
7136 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s1\n",
7137 program.c_str());
7138 error_found = true;
7139 }
7140
7141 if ("HOWNOWBROWNCOW?" != s2)
7142 {
7143 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s2\n",
7144 program.c_str());
7145 error_found = true;
7146 }
7147
7148 if ("HOWNOWbrown cow?" != s3)
7149 {
7150 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s3\n",
7151 program.c_str());
7152 error_found = true;
7153 }
7154
7155 if ("How now BROWNCOW?" != s4)
7156 {
7157 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s4\n",
7158 program.c_str());
7159 error_found = true;
7160 }
7161 }
7162
7163 if (error_found)
7164 {
7165 return false;
7166 }
7167 }
7168
7169 {
7170 bool error_found = false;
7171
7172 typedef exprtk::symbol_table<T> symbol_table_t;
7173 typedef exprtk::expression<T> expression_t;
7174 typedef exprtk::parser<T> parser_t;
7175
7176 symbol_table_t symbol_table;
7177
7178 T v[4] = {T(5), T(6), T(7), T(8)};
7179
7180 symbol_table.add_vector("v",v);
7181
7182 vararg_func<T> vaf;
7183 symbol_table.add_function("vararg_func",vaf);
7184
7185 expression_t expression;
7186 expression.register_symbol_table(symbol_table);
7187
7188 parser_t parser;
7189
7190 const std::string programs[] =
7191 {
7192 "equal(0,vararg_func())",
7193 "equal(1,vararg_func() + 1)",
7194 "equal(1,1 + vararg_func())",
7195 "equal(1,vararg_func + 1)",
7196 "equal(1,1 + vararg_func)",
7197 "equal(0,vararg_func() + vararg_func)",
7198 "equal(0,vararg_func + vararg_func())",
7199 "equal(1,vararg_func + vararg_func(1))",
7200 "equal(1,vararg_func + vararg_func(1,2))",
7201 "equal(2,vararg_func + vararg_func(v))",
7202 "equal(1,vararg_func() + vararg_func(1))",
7203 "equal(1,vararg_func() + vararg_func(1,2))",
7204 "equal(2,vararg_func() + vararg_func(v))",
7205 "equal(2,vararg_func(v))",
7206 "equal(1,vararg_func(1))",
7207 "equal(1,vararg_func(1,2,3))",
7208 "equal(1,vararg_func(5,6,7,8))",
7209 "equal(5,vararg_func(v) + 3)",
7210 "equal(5,vararg_func(1) + 4)",
7211 "equal(6,vararg_func(1,2,3) + 5)",
7212 "equal(7,vararg_func(5,6,7,8) + 6)"
7213 };
7214
7215 static const std::size_t programs_size = sizeof(programs) / sizeof(std::string);
7216
7217 for (std::size_t i = 0; i < programs_size; ++i)
7218 {
7219 if (!parser.compile(programs[i],expression))
7220 {
7221 printf("run_test18() - [6] Error: %s\tExpression: %s\n",
7222 parser.error().c_str(),
7223 programs[i].c_str());
7224
7225 error_found = true;
7226 }
7227 else if (T(1) != expression.value())
7228 {
7229 printf("run_test18() - Error in evaluation! (5) Expression: %s\n",
7230 programs[i].c_str());
7231
7232 error_found = true;
7233 }
7234 }
7235
7236 if (error_found)
7237 {
7238 return false;
7239 }
7240 }
7241
7242 {
7243 bool error_found = false;
7244
7245 typedef exprtk::symbol_table<T> symbol_table_t;
7246 typedef exprtk::expression<T> expression_t;
7247 typedef exprtk::parser<T> parser_t;
7248
7249 std::vector<T> v0;
7250 std::vector<T> v1;
7251 std::vector<T> v2;
7252 std::vector<T> v3;
7253
7254 #define pb(v,N) \
7255 v.push_back(T(N)); \
7256
7257 pb(v0,0) pb(v0,0) pb(v0,0) pb(v0,0) pb(v0,0) pb(v0, 0) pb(v0, 0)
7258 pb(v1,0) pb(v1,2) pb(v1,4) pb(v1,6) pb(v1,8) pb(v1,10) pb(v1,12)
7259 pb(v2,1) pb(v2,3) pb(v2,5) pb(v2,7) pb(v2,9) pb(v2,11) pb(v2,13)
7260 pb(v3,0) pb(v3,1) pb(v3,2) pb(v3,3) pb(v3,4) pb(v3, 5) pb(v3, 6)
7261 #undef pb
7262
7263 const std::string expr_string = "sum(v + 1)";
7264
7266
7267 symbol_table_t symbol_table;
7268 symbol_table.add_vector("v",v);
7269
7270 expression_t expression;
7271 expression.register_symbol_table(symbol_table);
7272
7273 parser_t parser;
7274
7275 if (!parser.compile(expr_string,expression))
7276 {
7277 printf("run_test18() - [7] Error: %s\tExpression: %s\n",
7278 parser.error().c_str(),
7279 expr_string.c_str());
7280
7281 error_found = true;
7282 }
7283
7284 T sum = { T(0) };
7285
7286 sum = expression.value();
7287
7288 if (not_equal(sum,T(7)))
7289 {
7290 printf("run_test18() - Error in evaluation! (6) Expression: %s\n",
7291 expr_string.c_str());
7292
7293 error_found = true;
7294 }
7295
7296 v.rebase(v1.data());
7297 sum = expression.value();
7298
7299 if (not_equal(sum,T(49)))
7300 {
7301 printf("run_test18() - Error in evaluation! (7) Expression: %s\n",
7302 expr_string.c_str());
7303 error_found = true;
7304 }
7305
7306 v.rebase(v2.data());
7307 sum = expression.value();
7308
7309 if (not_equal(sum,T(56)))
7310 {
7311 printf("run_test18() - Error in evaluation! (8) Expression: %s\n",
7312 expr_string.c_str());
7313 error_found = true;
7314 }
7315
7316 v.rebase(v3.data());
7317 sum = expression.value();
7318
7319 if (not_equal(sum,T(28)))
7320 {
7321 printf("run_test18() - Error in evaluation! (9) Expression: %s\n",
7322 expr_string.c_str());
7323 error_found = true;
7324 }
7325
7326 if (error_found)
7327 {
7328 return false;
7329 }
7330 }
7331
7332 {
7333 bool error_found = false;
7334
7335 typedef exprtk::symbol_table<T> symbol_table_t;
7336 typedef exprtk::expression<T> expression_t;
7337 typedef exprtk::parser<T> parser_t;
7338
7339 std::vector<T> v0;
7340 std::vector<T> s;
7341
7342 #define pb(v,N) \
7343 v.push_back(T(N)); \
7344
7345 pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
7346 pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
7347
7348 pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
7349 pb(s,15) pb(s,18) pb(s,21)
7350 #undef pb
7351
7352 const std::string expr_string = "v[0] + v[1] + v[2]";
7353
7355
7356 symbol_table_t symbol_table;
7357 symbol_table.add_vector("v",v);
7358
7359 expression_t expression;
7360 expression.register_symbol_table(symbol_table);
7361
7362 parser_t parser;
7363
7364 if (!parser.compile(expr_string,expression))
7365 {
7366 printf("run_test18() - [8] Error: %s\tExpression: %s\n",
7367 parser.error().c_str(),
7368 expr_string.c_str());
7369
7370 error_found = true;
7371 }
7372
7373 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7374 {
7375 v.rebase(v0.data() + i);
7376
7377 T sum = expression.value();
7378
7379 if (not_equal(sum,s[i]))
7380 {
7381 printf("run_test18() - Error in evaluation! (7) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7382 expr_string.c_str(),
7383 s[i].toDouble(),
7384 sum.toDouble());
7385
7386 error_found = true;
7387 }
7388
7389 }
7390
7391 if (error_found)
7392 {
7393 return false;
7394 }
7395 }
7396
7397 {
7398 bool error_found = false;
7399
7400 typedef exprtk::symbol_table<T> symbol_table_t;
7401 typedef exprtk::expression<T> expression_t;
7402 typedef exprtk::parser<T> parser_t;
7403
7404 std::vector<T> v0;
7405 std::vector<T> s;
7406
7407 #define pb(v,N) \
7408 v.push_back(T(N)); \
7409
7410 pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
7411 pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
7412
7413 pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
7414 pb(s,15) pb(s,18) pb(s,21)
7415 #undef pb
7416
7417 const std::string expr_string = "var i := 0; var j := 1; var k := 2; v[i] + v[j] + v[k]";
7418
7420
7421 symbol_table_t symbol_table;
7422 symbol_table.add_vector("v",v);
7423
7424 expression_t expression;
7425 expression.register_symbol_table(symbol_table);
7426
7427 parser_t parser;
7428
7429 if (!parser.compile(expr_string,expression))
7430 {
7431 printf("run_test18() - [9] Error: %s\tExpression: %s\n",
7432 parser.error().c_str(),
7433 expr_string.c_str());
7434
7435 error_found = true;
7436 }
7437
7438 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7439 {
7440 v.rebase(v0.data() + i);
7441
7442 T sum = expression.value();
7443
7444 if (not_equal(sum,s[i]))
7445 {
7446 printf("run_test18() - Error in evaluation! (8) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7447 expr_string.c_str(),
7448 s[i].toDouble(),
7449 sum.toDouble());
7450
7451 error_found = true;
7452 }
7453
7454 }
7455
7456 if (error_found)
7457 {
7458 return false;
7459 }
7460 }
7461
7462 {
7463 typedef exprtk::symbol_table<T> symbol_table_t;
7464 typedef exprtk::expression<T> expression_t;
7465 typedef exprtk::parser<T> parser_t;
7466
7467 const std::string const_folded_expression_list[] =
7468 {
7469 "(0 * dot(2 * v0,v1 - 1))",
7470 "(0 * dot(2 * v0,v1 - 1)) + (dot(2 * v0,v1 - 1) * 0)",
7471 "(0 * dot(v0 - v1,v1 / v0))",
7472 "(0 * dot(v0 - v1,v1 / v0)) + (dot(v0 - v1,v1 / v0) * 0)",
7473 "(0 * dot(v0,v1))",
7474 "(0 * dot(v0,v1)) + (dot(v0,v1) * 0)",
7475 "(0 / dot(2 * v0,v1 - 1))",
7476 "(0 / dot(2 * v0,v1 - 1)) + (dot(2 * v0,v1 - 1) * 0)",
7477 "(0 / dot(v0 - v1,v1 / v0))",
7478 "(0 / dot(v0 - v1,v1 / v0)) + (dot(v0 - v1,v1 / v0) * 0)",
7479 "(0 / dot(v0,v1))",
7480 "(0 / dot(v0,v1)) + (dot(v0,v1) * 0)",
7481 "(dot(2 * v0,v1 - 1) * 0)",
7482 "(dot(2 * v0,v1 - 1) * 0) + (0 * dot(2 * v0,v1 - 1))",
7483 "(dot(2 * v0,v1 - 1) * 0) + (0 / dot(2 * v0,v1 - 1))",
7484 "(dot(v0 - v1,v1 / v0) * 0)",
7485 "(dot(v0 - v1,v1 / v0) * 0) + (0 * dot(v0 - v1,v1 / v0))",
7486 "(dot(v0 - v1,v1 / v0) * 0) + (0 / dot(v0 - v1,v1 / v0))",
7487 "(dot(v0,v1) * 0)",
7488 "(dot(v0,v1) * 0) + (0 * dot(v0,v1))",
7489 "(dot(v0,v1) * 0) + (0 / dot(v0,v1))"
7490 };
7491
7492 const std::size_t const_folded_expression_list_size = sizeof(const_folded_expression_list) / sizeof(std::string);
7493
7494 const std::size_t vector_size = 5;
7495 T v0[vector_size] = { 0, 2, 4, 6, 8 };
7496 T v1[vector_size] = { 1, 3, 5, 7, 9 };
7497
7498 exprtk::vector_view<T> vv0 = exprtk::make_vector_view(v0, vector_size);
7499 exprtk::vector_view<T> vv1 = exprtk::make_vector_view(v1, vector_size);
7500
7501 exprtk::rtl::vecops::package<T> vector_package;
7502 exprtk::rtl::io::package<T> io_package;
7503
7504 symbol_table_t symbol_table;
7505
7506 symbol_table.add_package( vector_package );
7507 symbol_table.add_package( io_package );
7508 symbol_table.add_vector ( "v0" , vv0 );
7509 symbol_table.add_vector ( "v1" , vv1 );
7510
7511 expression_t expression;
7512 expression.register_symbol_table(symbol_table);
7513
7514 parser_t parser;
7515
7516 for (std::size_t i = 0; i < const_folded_expression_list_size; ++i)
7517 {
7518 const std::string& expression_string = const_folded_expression_list[i];
7519
7520 if (!parser.compile(expression_string, expression))
7521 {
7522 printf("run_test18() - [10] Error: %s Expression: %s\n",
7523 parser.error().c_str(),
7524 expression_string.c_str());
7525
7526 return false;
7527 }
7528
7530 {
7531 printf("run_test18() - Error: Expression did not compile to a constant! [1] Expression: %s\n",
7532 expression_string.c_str());
7533
7534 return false;
7535 }
7536
7537 for (std::size_t j = 0; j < 100; ++j)
7538 {
7539 if ((j % 2) == 0)
7540 {
7541 vv0.rebase(v0);
7542 vv1.rebase(v1);
7543 }
7544 else
7545 {
7546 vv0.rebase(v1);
7547 vv1.rebase(v0);
7548 }
7549
7550 const T result = expression.value();
7551
7552 if (result != T(0))
7553 {
7554 printf("run_test18() - Error: Expected result of zero, result: %8.4f for Expression: %s\n",
7555 result.toDouble(),
7556 expression_string.c_str());
7557
7558 return false;
7559 }
7560 }
7561
7562 expression.release();
7563 }
7564 }
7565
7566 {
7567 typedef exprtk::symbol_table<T> symbol_table_t;
7568 typedef exprtk::expression<T> expression_t;
7569 typedef exprtk::parser<T> parser_t;
7570
7571 const std::string rebase_expression_list[] =
7572 {
7573 "dot(v0,v1)",
7574 "dot(2 * v0,v1 - 1) + dot(2 * v0,v1 - 1)",
7575 "dot(2 * v0,v1 - 1)",
7576 "dot(v0 - v1,v1 / v0) + dot(v0 - v1,v1 / v0)",
7577 "dot(v0 - v1,v1 / v0)",
7578 "dot(v0,v1) + dot(v0,v1)",
7579 "dot(v0,v1) + x",
7580 "dot(2 * v0,v1 - 1) * x + dot(2 * v0,v1 - 1) * y",
7581 "x / dot(2 * v0,v1 - 1)",
7582 "x / dot(v0 - v1,v1 / v0) + dot(v0 - v1,v1 / v0) / y",
7583 "x * dot(v0 - v1,v1 / v0) / y",
7584 "x - dot(v0,v1) + dot(v0,v1) + y",
7585 };
7586
7587 const std::size_t rebase_expression_list_size = sizeof(rebase_expression_list) / sizeof(std::string);
7588
7589 T x = T(1.234);
7590 T y = T(5.678);
7591
7592 const std::size_t vector_size = 5;
7593 T v0[vector_size] = { 0, 2, 4, 6, 8 };
7594 T v1[vector_size] = { 1, 3, 5, 7, 9 };
7595
7596 exprtk::vector_view<T> vv0 = exprtk::make_vector_view(v0, vector_size);
7597 exprtk::vector_view<T> vv1 = exprtk::make_vector_view(v1, vector_size);
7598
7599 exprtk::rtl::vecops::package<T> vector_package;
7600 exprtk::rtl::io::package<T> io_package;
7601
7602 symbol_table_t symbol_table;
7603
7604 symbol_table.add_package ( vector_package );
7605 symbol_table.add_package ( io_package );
7606 symbol_table.add_variable( "x" , x );
7607 symbol_table.add_variable( "y" , y );
7608 symbol_table.add_vector ( "v0" , vv0 );
7609 symbol_table.add_vector ( "v1" , vv1 );
7610
7611 expression_t expression;
7612 expression.register_symbol_table(symbol_table);
7613
7614 parser_t parser;
7615
7616 for (std::size_t i = 0; i < rebase_expression_list_size; ++i)
7617 {
7618 const std::string& expression_string = rebase_expression_list[i];
7619
7620 if (!parser.compile(expression_string, expression))
7621 {
7622 printf("run_test18() - [11] Error: %s Expression: %s\n",
7623 parser.error().c_str(),
7624 expression_string.c_str());
7625
7626 return false;
7627 }
7628
7629 for (std::size_t j = 0; j < 100; ++j)
7630 {
7631 if ((j % 2) == 0)
7632 {
7633 vv0.rebase(v0);
7634 vv1.rebase(v1);
7635 }
7636 else
7637 {
7638 vv0.rebase(v1);
7639 vv1.rebase(v0);
7640 }
7641
7642 expression.value();
7643 }
7644
7645 expression.release();
7646 }
7647 }
7648
7649 {
7650 bool error_found = false;
7651
7652 typedef exprtk::symbol_table<T> symbol_table_t;
7653 typedef exprtk::expression<T> expression_t;
7654 typedef exprtk::parser<T> parser_t;
7655
7656 std::vector<T> v0;
7657 std::vector<T> s;
7658
7659 #define pb(v,N) \
7660 v.push_back(T(N)); \
7661
7662 pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
7663 pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
7664
7665 pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
7666 pb(s,15) pb(s,18) pb(s,21)
7667 #undef pb
7668
7669 const std::string expr_string = "var i := 0; v[i + 0] + v[i + 1] + v[i + 2]";
7670
7672
7673 symbol_table_t symbol_table;
7674 symbol_table.add_vector("v",v);
7675
7676 expression_t expression;
7677 expression.register_symbol_table(symbol_table);
7678
7679 parser_t parser;
7680
7681 if (!parser.compile(expr_string,expression))
7682 {
7683 printf("run_test18() - [12] Error: %s\tExpression: %s\n",
7684 parser.error().c_str(),
7685 expr_string.c_str());
7686
7687 error_found = true;
7688 }
7689
7690 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7691 {
7692 v.rebase(v0.data() + i);
7693
7694 const T sum = expression.value();
7695
7696 if (not_equal(sum,s[i]))
7697 {
7698 printf("run_test18() - Error in evaluation! (9) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7699 expr_string.c_str(),
7700 s[i].toDouble(),
7701 sum.toDouble());
7702
7703 error_found = true;
7704 }
7705
7706 }
7707
7708 if (error_found)
7709 {
7710 return false;
7711 }
7712 }
7713
7714 {
7715 typedef exprtk::symbol_table<T> symbol_table_t;
7716 typedef exprtk::expression<T> expression_t;
7717 typedef exprtk::parser<T> parser_t;
7718
7719 T v0[] = { T(0), T(1), T(2), T(3), T(4) };
7720 T v1[] = { T(5), T(6), T(7), T(8), T(9) };
7721
7722 const std::size_t v0_size = sizeof(v0) / sizeof (T);
7723 const std::size_t v1_size = sizeof(v1) / sizeof (T);
7724
7726
7727 vecrebase_func<T> vec_sum;
7728
7729 symbol_table_t symbol_table;
7730 symbol_table.add_vector("v",v);
7731 symbol_table.add_function("vec_sum",vec_sum);
7732
7733 expression_t expression;
7734 expression.register_symbol_table(symbol_table);
7735
7736 parser_t parser;
7737
7738 const std::string expr_string = "vec_sum(v)";
7739
7740 if (!parser.compile(expr_string,expression))
7741 {
7742 printf("run_test18() - [13] Error: %s\tExpression: %s\n",
7743 parser.error().c_str(),
7744 expr_string.c_str());
7745
7746 return false;
7747 }
7748
7749 const T expected_result0 = std::accumulate(v0, v0 + v0_size, T(0));
7750
7751 if (expression.value() != expected_result0)
7752 {
7753 printf("run_test18() - Error in evaluation! (10.1) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7754 expr_string.c_str(),
7755 expected_result0.toDouble(),
7756 expression.value().toDouble());
7757
7758 return false;
7759 }
7760
7761 v.rebase(v1);
7762
7763 const T expected_result1 = std::accumulate(v1, v1 + v1_size, T(0));
7764
7765 if (expression.value() != expected_result1)
7766 {
7767 printf("run_test18() - Error in evaluation! (10.2) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7768 expr_string.c_str(),
7769 expected_result1.toDouble(),
7770 expression.value().toDouble());
7771
7772 return false;
7773 }
7774 }
7775
7776 {
7777 bool error_found = false;
7778
7779 typedef exprtk::symbol_table<T> symbol_table_t;
7780 typedef exprtk::expression<T> expression_t;
7781 typedef exprtk::parser<T> parser_t;
7782
7784
7785 symbol_table_t symbol_table;
7786 symbol_table.add_package(vecops_pkg);
7787
7788 const std::string expr_str_list[] =
7789 {
7790 "var v[9] := {1,2,3,4,5,6,7,8,9}; all_true(v) == true" ,
7791 "var v[6] := {-1,-2,-3,-4,-5,-6}; all_true(v) == true" ,
7792 "var v[8] := {1,2,3,0,0,0,0,0}; all_true(v) == false",
7793 "var v[8] := {-1,-2,-3,0,0,0,0,0}; all_true(v) == false",
7794 "var v[9] := {0,0,0,0,0,0,0,0,0}; all_true(v + 1) == true",
7795
7796 "var v[9] := {0,0,0,0,0,0,0,0,0}; all_false(v) == true" ,
7797 "var v[9] := {0,0,0,0,0,1,2,3,4}; all_false(v) == false" ,
7798 "var v[8] := {0,0,0,0,0,-1,-2,-3}; all_false(v) == false" ,
7799 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
7800
7801 "var v[9] := {0,0,0,0,0,0,0,0,1}; any_true(v) == true" ,
7802 "var v[9] := {0,0,0,0,1,0,0,0,0}; any_true(v) == true" ,
7803 "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v) == false" ,
7804 "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v + 1) == true",
7805
7806 "var v[9] := {1,1,1,1,1,1,1,1,0}; any_false(v) == true" ,
7807 "var v[9] := {1,1,1,1,0,1,1,1,1}; any_false(v) == true" ,
7808 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v) == false" ,
7809 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
7810
7811 "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v) == 0" ,
7812 "var v[9] := {0,0,0,0,0,0,0,0,1}; count(v) == 1" ,
7813 "var v[9] := {0,0,0,0,0,0,0,2,1}; count(v) == 2" ,
7814 "var v[9] := {0,0,0,0,0,0,3,2,1}; count(v) == 3" ,
7815 "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v + 1) == v[]",
7816 "var v[9] := {1,1,1,1,1,1,1,1,1}; count(v - 1) == 0",
7817
7818 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,r); sum(v == r) == v[]",
7819 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,0,8,r,0,8); sum(r) == 45",
7820 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,1,7,r,1,7); sum(r) == 35",
7821 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[5] := [0]; copy(v,0,4,r,0,4); sum(r) == 15",
7822
7823 "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; rol(v,3); sum(v == r) == v[]",
7824 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; ror(v,3); sum(v == r) == v[]",
7825
7826 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; rol(v,2); sum(v == r) == v[]",
7827 "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; ror(v,2); sum(v == r) == v[]",
7828
7829 "var v[5] := {1,2,3,4,5}; var r[5] := {1,3,4,2,5}; rol(v,1,1,3); sum(v == r) == v[]",
7830 "var v[5] := {1,2,3,4,5}; var r[5] := {1,4,2,3,5}; ror(v,1,1,3); sum(v == r) == v[]",
7831
7832 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,0,0}; shftl(v,2); sum(v == r) == v[]",
7833 "var v[5] := {1,2,3,4,5}; var r[5] := {5,0,0,0,0}; shftl(v,4); sum(v == r) == v[]",
7834 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftl(v,5); sum(v == r) == v[]",
7835
7836 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,1,2,3}; shftr(v,2); sum(v == r) == v[]",
7837 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,1}; shftr(v,4); sum(v == r) == v[]",
7838 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftr(v,5); sum(v == r) == v[]",
7839
7840 "var v[5] := {1,2,3,4,5}; var r[5] := {1,3,4,0,5}; shftl(v,1,1,3); sum(v == r) == v[]",
7841 "var v[5] := {1,2,3,4,5}; var r[5] := {1,0,2,3,5}; shftr(v,1,1,3); sum(v == r) == v[]",
7842
7843 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
7844 "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
7845 "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,1,3); sum(v == r) == v[]",
7846 "var v[5] := {5,4,2,3,1}; var r[5] := {5,2,3,4,1}; sort(v,1,3); sum(v == r) == v[]",
7847 "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,0,2); sum(v == r) == v[]",
7848 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,2,4); sum(v == r) == v[]",
7849
7850 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
7851 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'aScEnDiNg'); sum(v == r) == v[]",
7852 "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
7853 "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',1,3); sum(v == r) == v[]",
7854 "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',0,2); sum(v == r) == v[]",
7855 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending',2,4); sum(v == r) == v[]",
7856
7857 "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
7858 "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'DeScEnDiNg'); sum(v == r) == v[]",
7859 "var v[5] := {5,4,3,2,1}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
7860 "var v[5] := {1,4,2,3,5}; var r[5] := {1,4,3,2,5}; sort(v,'descending',1,3); sum(v == r) == v[]",
7861 "var v[5] := {3,1,2,4,5}; var r[5] := {3,2,1,4,5}; sort(v,'descending',0,2); sum(v == r) == v[]",
7862 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,5,4,3}; sort(v,'descending',2,4); sum(v == r) == v[]",
7863
7864 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); v[v[] / 2] == 5",
7865 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); v[v[] / 3] == 4",
7866
7867 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); sort(v,0,trunc(v[] / 2)); (v[v[] / 2] == 5) and (v[0] == 1)",
7868 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); sort(v,0,trunc(v[] / 3)); (v[v[] / 3] == 4) and (v[0] == 1)",
7869
7870 "var v[5]; iota(v, 0,1); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7871 "var v[5]; iota(v, 0,2); var r[5] := { 0, 2, 4, 6, 8}; sum(v == r) == v[]",
7872 "var v[5]; iota(v, 1,1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7873 "var v[5]; iota(v, 1,2); var r[5] := { 1, 3, 5, 7, 9}; sum(v == r) == v[]",
7874 "var v[5]; iota(v,-1,1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7875 "var v[5]; iota(v,-1,2); var r[5] := {-1, 1, 3, 5, 7}; sum(v == r) == v[]",
7876 "var v[5]; iota(v,-2,1); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7877 "var v[5]; iota(v,-2,2); var r[5] := {-2, 0, 2, 4, 6}; sum(v == r) == v[]",
7878 "var v[5]; iota(v, 0); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7879 "var v[5]; iota(v, 1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7880 "var v[5]; iota(v,-1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7881 "var v[5]; iota(v,-2); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7882 "var v[5]; iota(v, 0, 0); var r[5] := { 0, 0, 0, 0, 0}; sum(v == r) == v[]",
7883 "var v[5]; iota(v, 1, 0); var r[5] := { 1, 1, 1, 1, 1}; sum(v == r) == v[]",
7884
7885 "var v[5]; iota(v, 0, v[] - 1, 0,1); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7886 "var v[5]; iota(v, 0, v[] - 1, 0,2); var r[5] := { 0, 2, 4, 6, 8}; sum(v == r) == v[]",
7887 "var v[5]; iota(v, 0, v[] - 1, 1,1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7888 "var v[5]; iota(v, 0, v[] - 1, 1,2); var r[5] := { 1, 3, 5, 7, 9}; sum(v == r) == v[]",
7889 "var v[5]; iota(v, 0, v[] - 1,-1,1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7890 "var v[5]; iota(v, 0, v[] - 1,-1,2); var r[5] := {-1, 1, 3, 5, 7}; sum(v == r) == v[]",
7891 "var v[5]; iota(v, 0, v[] - 1,-2,1); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7892 "var v[5]; iota(v, 0, v[] - 1,-2,2); var r[5] := {-2, 0, 2, 4, 6}; sum(v == r) == v[]",
7893 "var v[5]; iota(v, 0, v[] - 1, 0 ); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7894 "var v[5]; iota(v, 0, v[] - 1, 1 ); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7895 "var v[5]; iota(v, 0, v[] - 1,-1 ); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7896 "var v[5]; iota(v, 0, v[] - 1,-2 ); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7897 "var v[5]; iota(v, 0, v[] - 1, 0,0); var r[5] := { 0, 0, 0, 0, 0}; sum(v == r) == v[]",
7898 "var v[5]; iota(v, 0, v[] - 1, 1,0); var r[5] := { 1, 1, 1, 1, 1}; sum(v == r) == v[]",
7899
7900 "var v[5]; iota(v, 1, v[] - 1, 0,1); var r[5] := { 0, 0, 1, 2, 3 }; sum(v == r) == v[]",
7901 "var v[5]; iota(v, 1, v[] - 1, 0,2); var r[5] := { 0, 0, 2, 4, 6 }; sum(v == r) == v[]",
7902 "var v[5]; iota(v, 1, v[] - 1, 1,1); var r[5] := { 0, 1, 2, 3, 4 }; sum(v == r) == v[]",
7903 "var v[5]; iota(v, 1, v[] - 1, 1,2); var r[5] := { 0, 1, 3, 5, 7 }; sum(v == r) == v[]",
7904 "var v[5]; iota(v, 1, v[] - 1,-1,1); var r[5] := { 0, -1, 0, 1, 2 }; sum(v == r) == v[]",
7905 "var v[5]; iota(v, 1, v[] - 1,-1,2); var r[5] := { 0, -1, 1, 3, 5 }; sum(v == r) == v[]",
7906 "var v[5]; iota(v, 1, v[] - 1,-2,1); var r[5] := { 0, -2,-1, 0, 1 }; sum(v == r) == v[]",
7907 "var v[5]; iota(v, 1, v[] - 1,-2,2); var r[5] := { 0, -2, 0, 2, 4 }; sum(v == r) == v[]",
7908 "var v[5]; iota(v, 1, v[] - 1, 0 ); var r[5] := { 0, 0, 1, 2, 3 }; sum(v == r) == v[]",
7909 "var v[5]; iota(v, 1, v[] - 1, 1 ); var r[5] := { 0, 1, 2, 3, 4 }; sum(v == r) == v[]",
7910 "var v[5]; iota(v, 1, v[] - 1,-1 ); var r[5] := { 0, -1, 0, 1, 2 }; sum(v == r) == v[]",
7911 "var v[5]; iota(v, 1, v[] - 1,-2 ); var r[5] := { 0, -2,-1, 0, 1 }; sum(v == r) == v[]",
7912
7913 "var v[5]; iota(v, 1, v[] - 2, 0,1); var r[5] := { 0, 0, 1, 2, 0 }; sum(v == r) == v[]",
7914 "var v[5]; iota(v, 1, v[] - 2, 0,2); var r[5] := { 0, 0, 2, 4, 0 }; sum(v == r) == v[]",
7915 "var v[5]; iota(v, 1, v[] - 2, 1,1); var r[5] := { 0, 1, 2, 3, 0 }; sum(v == r) == v[]",
7916 "var v[5]; iota(v, 1, v[] - 2, 1,2); var r[5] := { 0, 1, 3, 5, 0 }; sum(v == r) == v[]",
7917 "var v[5]; iota(v, 1, v[] - 2,-1,1); var r[5] := { 0, -1, 0, 1, 0 }; sum(v == r) == v[]",
7918 "var v[5]; iota(v, 1, v[] - 2,-1,2); var r[5] := { 0, -1, 1, 3, 0 }; sum(v == r) == v[]",
7919 "var v[5]; iota(v, 1, v[] - 2,-2,1); var r[5] := { 0, -2,-1, 0, 0 }; sum(v == r) == v[]",
7920 "var v[5]; iota(v, 1, v[] - 2,-2,2); var r[5] := { 0, -2, 0, 2, 0 }; sum(v == r) == v[]",
7921 "var v[5]; iota(v, 1, v[] - 2, 0 ); var r[5] := { 0, 0, 1, 2, 0 }; sum(v == r) == v[]",
7922 "var v[5]; iota(v, 1, v[] - 2, 1 ); var r[5] := { 0, 1, 2, 3, 0 }; sum(v == r) == v[]",
7923 "var v[5]; iota(v, 1, v[] - 2,-1 ); var r[5] := { 0, -1, 0, 1, 0 }; sum(v == r) == v[]",
7924 "var v[5]; iota(v, 1, v[] - 2,-2 ); var r[5] := { 0, -2,-1, 0, 0 }; sum(v == r) == v[]",
7925
7926 "var v[5]; iota(v, 0, v[] - 2, 0,1); var r[5] := { 0, 1, 2, 3, 0}; sum(v == r) == v[]",
7927 "var v[5]; iota(v, 0, v[] - 2, 0,2); var r[5] := { 0, 2, 4, 6, 0}; sum(v == r) == v[]",
7928 "var v[5]; iota(v, 0, v[] - 2, 1,1); var r[5] := { 1, 2, 3, 4, 0}; sum(v == r) == v[]",
7929 "var v[5]; iota(v, 0, v[] - 2, 1,2); var r[5] := { 1, 3, 5, 7, 0}; sum(v == r) == v[]",
7930 "var v[5]; iota(v, 0, v[] - 2,-1,1); var r[5] := {-1, 0, 1, 2, 0}; sum(v == r) == v[]",
7931 "var v[5]; iota(v, 0, v[] - 2,-1,2); var r[5] := {-1, 1, 3, 5, 0}; sum(v == r) == v[]",
7932 "var v[5]; iota(v, 0, v[] - 2,-2,1); var r[5] := {-2,-1, 0, 1, 0}; sum(v == r) == v[]",
7933 "var v[5]; iota(v, 0, v[] - 2,-2,2); var r[5] := {-2, 0, 2, 4, 0}; sum(v == r) == v[]",
7934 "var v[5]; iota(v, 0, v[] - 2, 0 ); var r[5] := { 0, 1, 2, 3, 0}; sum(v == r) == v[]",
7935 "var v[5]; iota(v, 0, v[] - 2, 1 ); var r[5] := { 1, 2, 3, 4, 0}; sum(v == r) == v[]",
7936 "var v[5]; iota(v, 0, v[] - 2,-1 ); var r[5] := {-1, 0, 1, 2, 0}; sum(v == r) == v[]",
7937 "var v[5]; iota(v, 0, v[] - 2,-2 ); var r[5] := {-2,-1, 0, 1, 0}; sum(v == r) == v[]",
7938
7939 "var v[5]; iota(v, 0, -1); var r[5] := { 0, -1, -2, -3, -4}; sum(v == r) == v[]",
7940 "var v[5]; iota(v, 0, -2); var r[5] := { 0, -2, -4, -6, -8}; sum(v == r) == v[]",
7941 "var v[5]; iota(v, -1, -2); var r[5] := { -1, -3, -5, -7, -9}; sum(v == r) == v[]",
7942
7943 "var v[5]; iota(v, 0, v[] -1, 0, -1); var r[5] := { 0, -1, -2, -3, -4}; sum(v == r) == v[]",
7944 "var v[5]; iota(v, 0, v[] -1, 0, -2); var r[5] := { 0, -2, -4, -6, -8}; sum(v == r) == v[]",
7945 "var v[5]; iota(v, 0, v[] -1, -1, -2); var r[5] := { -1, -3, -5, -7, -9}; sum(v == r) == v[]",
7946
7947 "var v[5]; iota(v, 0,1); threshold_below(v,2, 0); var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7948 "var v[5]; iota(v, 0,1); threshold_above(v,2, 0); var r[5] := { 0, 1, 2, 0, 0}; sum(v == r) == v[]",
7949
7950 "var v[5]; iota(v, 0,1); threshold_below(v,0,v[] - 1,2, 0); var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7951 "var v[5]; iota(v, 0,1); threshold_above(v,0,v[] - 1,2, 0); var r[5] := { 0, 1, 2, 0, 0}; sum(v == r) == v[]",
7952
7953 "var v[5]; iota(v, 1,1); threshold_below(v,1,v[] - 1,2, 0); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7954 "var v[5]; iota(v, 1,1); threshold_above(v,1,v[] - 1,2, 0); var r[5] := { 1, 2, 0, 0, 0}; sum(v == r) == v[]",
7955
7956 "var v[5]; iota(v, 0,1); threshold_below(v,0,v[] - 2,2, 0); var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7957 "var v[5]; iota(v, 0,1); threshold_above(v,0,v[] - 2,2, 0); var r[5] := { 0, 1, 2, 0, 4}; sum(v == r) == v[]",
7958
7959 " var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + y; axpy(a,x,y); sum(y == r) == y[]",
7960 " var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var r[3] := [0]; r := a * x + b * y; axpby(a,x,b,y); sum(y == r) == y[]",
7961
7962 " var a := 2; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + y; axpyz(a,x,y,z); sum(z == r) == z[]",
7963 " var a := 2; var b := 3; var x[3] := {1,2,3}; var y[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + b * y; axpbyz(a,x,b,y,z); sum(z == r) == z[]",
7964 " var a := 2; var b := 3; var x[3] := {1,2,3}; var z[3] := [0]; var r[3] := [0]; r := a * x + b; axpbz(a,x,b,z); sum(z == r) == z[]",
7965 };
7966
7967 const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
7968
7969 parser_t parser;
7970
7971 for (std::size_t i = 0; i < expr_str_list_size; ++i)
7972 {
7973 expression_t expression;
7974 expression.register_symbol_table(symbol_table);
7975
7976 if (!parser.compile(expr_str_list[i], expression))
7977 {
7978 printf("run_test18() - [14] Error: %s Expression: %s\n",
7979 parser.error().c_str(),
7980 expr_str_list[i].c_str());
7981
7982 error_found = true;
7983
7984 continue;
7985 }
7986
7987 const T result = expression.value();
7988
7989 if (result != T(1))
7990 {
7991 printf("run_test18() - Error in evaluation! (11) Expression: %s\n",
7992 expr_str_list[i].c_str());
7993
7994 error_found = true;
7995 }
7996 }
7997
7998 if (error_found)
7999 {
8000 return false;
8001 }
8002 }
8003
8004 {
8005 typedef exprtk::expression<T> expression_t;
8006
8007 std::string a = "a";
8008 std::string b = "b";
8009 std::string c = "c";
8010 std::string d = "d";
8011
8012 T x = T(1.1);
8013 T y = T(2.2);
8014 T z = T(3.3);
8015 T w = T(4.4);
8016
8017 overload_func<T> ovrld_func
8018 (
8019 "T:T|T:TT|T:TTT|T:TTTT|"
8020 "T:S|T:SS|T:SSS|T:SSSS|"
8021 "T:ST|T:STS|T:STST|"
8022 "T:TS|T:TST|T:TSTS|"
8023 "T:TTSS|T:SSTT|T:STTS|T:TSST"
8024 );
8025
8026 exprtk::symbol_table<T> symbol_table;
8027
8028 symbol_table.add_constants();
8029 symbol_table.add_variable ("x",x);
8030 symbol_table.add_variable ("y",y);
8031 symbol_table.add_variable ("z",z);
8032 symbol_table.add_variable ("w",w);
8033
8034 symbol_table.add_stringvar("a",a);
8035 symbol_table.add_stringvar("b",b);
8036 symbol_table.add_stringvar("c",c);
8037 symbol_table.add_stringvar("d",d);
8038
8039 symbol_table.add_function("foo",ovrld_func);
8040
8041 typedef typename overload_func<T>::test_result_t test_result_t;
8042 typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
8043
8044 static const test_pack_t test_pack_list[] =
8045 {
8046 test_pack_t("foo(x)" , test_result_t( 0, "T" )),
8047 test_pack_t("foo(x, y)" , test_result_t( 1, "TT" )),
8048 test_pack_t("foo(x, y, z)" , test_result_t( 2, "TTT" )),
8049 test_pack_t("foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
8050 test_pack_t("foo(x + y)" , test_result_t( 0, "T" )),
8051 test_pack_t("foo(x + y, y + z)" , test_result_t( 1, "TT" )),
8052 test_pack_t("foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
8053 test_pack_t("foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
8054 test_pack_t("foo(a)" , test_result_t( 4, "S" )),
8055 test_pack_t("foo(a, b)" , test_result_t( 5, "SS" )),
8056 test_pack_t("foo(a, b, c)" , test_result_t( 6, "SSS" )),
8057 test_pack_t("foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
8058 test_pack_t("foo(a + b)" , test_result_t( 4, "S" )),
8059 test_pack_t("foo(a + b, b + c)" , test_result_t( 5, "SS" )),
8060 test_pack_t("foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
8061 test_pack_t("foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
8062 test_pack_t("foo(a, x)" , test_result_t( 8, "ST" )),
8063 test_pack_t("foo(a, x, b)" , test_result_t( 9, "STS" )),
8064 test_pack_t("foo(a, x, b, y)" , test_result_t(10, "STST")),
8065 test_pack_t("foo(a + b, x + y)" , test_result_t( 8, "ST" )),
8066 test_pack_t("foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
8067 test_pack_t("foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
8068 test_pack_t("foo(x, a)" , test_result_t(11, "TS" )),
8069 test_pack_t("foo(x, a, y)" , test_result_t(12, "TST" )),
8070 test_pack_t("foo(x, a, y, b)" , test_result_t(13, "TSTS")),
8071 test_pack_t("foo(x + y, a + b)" , test_result_t(11, "TS" )),
8072 test_pack_t("foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
8073 test_pack_t("foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
8074 test_pack_t("foo(x, y, a, b)" , test_result_t(14, "TTSS")),
8075 test_pack_t("foo(a, b, x, y)" , test_result_t(15, "SSTT")),
8076 test_pack_t("foo(a, x, y, b)" , test_result_t(16, "STTS")),
8077 test_pack_t("foo(x, a, b, y)" , test_result_t(17, "TSST")),
8078 test_pack_t("foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
8079 test_pack_t("foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
8080 test_pack_t("foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
8081 test_pack_t("foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
8082 };
8083
8084 static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
8085
8086 std::deque<expression_t> expression_list;
8087
8088 for (std::size_t i = 0; i < test_pack_list_size; ++i)
8089 {
8090 expression_t expression;
8091 expression.register_symbol_table(symbol_table);
8092
8093 exprtk::parser<T> parser;
8094
8095 if (!parser.compile(test_pack_list[i].first, expression))
8096 {
8097 printf("run_test18() - [15] Overload VarArg Error: %s Expression: %s\n",
8098 parser.error().c_str(),
8099 test_pack_list[i].first.c_str());
8100
8101 return false;
8102 }
8103 else
8104 expression_list.push_back(expression);
8105 }
8106
8107 bool error_found = false;
8108
8109 for (std::size_t i = 0; i < expression_list.size(); ++i)
8110 {
8111 ovrld_func.clear();
8112
8113 if (T(1) != expression_list[i].value())
8114 {
8115 printf("run_test18() - Error in evaluation! (12) Expression: %s\n",
8116 test_pack_list[i].first.c_str());
8117
8118 error_found = true;
8119 }
8120
8121 if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
8122 {
8123 printf("run_test18() - Error with ps_index (12) Expression: %s Expected: %d Got: %d\n",
8124 test_pack_list[i].first.c_str(),
8125 static_cast<int>(test_pack_list[i].second.ps_index),
8126 static_cast<int>(ovrld_func.current_ps_index));
8127
8128 error_found = true;
8129 }
8130
8131 if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
8132 {
8133 printf("run_test18() - Error with parameter seq (12) Expression: %s Expected: %s Got: %s\n",
8134 test_pack_list[i].first.c_str(),
8135 test_pack_list[i].second.param_seq.c_str(),
8136 ovrld_func.current_param_seq.c_str());
8137
8138 error_found = true;
8139 }
8140 ::fflush(stdout);
8141 }
8142
8143 if (error_found)
8144 {
8145 return false;
8146 }
8147 }
8148
8149 {
8150 typedef exprtk::expression<T> expression_t;
8151
8152 std::string a = "a";
8153 std::string b = "b";
8154 std::string c = "c";
8155 std::string d = "d";
8156 std::string result = "";
8157
8158 T x = T(1.1);
8159 T y = T(2.2);
8160 T z = T(3.3);
8161 T w = T(4.4);
8162
8163 overload_func<T> ovrld_func
8164 (
8165 "S:T|S:TT|S:TTT|S:TTTT|"
8166 "S:S|S:SS|S:SSS|S:SSSS|"
8167 "S:ST|S:STS|S:STST|"
8168 "S:TS|S:TST|S:TSTS|"
8169 "S:TTSS|S:SSTT|S:STTS|S:TSST"
8170 );
8171
8172 exprtk::symbol_table<T> symbol_table;
8173
8174 symbol_table.add_constants();
8175 symbol_table.add_variable ("x",x);
8176 symbol_table.add_variable ("y",y);
8177 symbol_table.add_variable ("z",z);
8178 symbol_table.add_variable ("w",w);
8179
8180 symbol_table.add_stringvar("a",a);
8181 symbol_table.add_stringvar("b",b);
8182 symbol_table.add_stringvar("c",c);
8183 symbol_table.add_stringvar("d",d);
8184 symbol_table.add_stringvar("result",result);
8185
8186 symbol_table.add_function("foo",ovrld_func);
8187
8188 typedef typename overload_func<T>::test_result_t test_result_t;
8189 typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
8190
8191 static const test_pack_t test_pack_list[] =
8192 {
8193 test_pack_t("result := foo(x)" , test_result_t( 0, "T" )),
8194 test_pack_t("result := foo(x, y)" , test_result_t( 1, "TT" )),
8195 test_pack_t("result := foo(x, y, z)" , test_result_t( 2, "TTT" )),
8196 test_pack_t("result := foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
8197 test_pack_t("result := foo(x + y)" , test_result_t( 0, "T" )),
8198 test_pack_t("result := foo(x + y, y + z)" , test_result_t( 1, "TT" )),
8199 test_pack_t("result := foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
8200 test_pack_t("result := foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
8201 test_pack_t("result := foo(a)" , test_result_t( 4, "S" )),
8202 test_pack_t("result := foo(a, b)" , test_result_t( 5, "SS" )),
8203 test_pack_t("result := foo(a, b, c)" , test_result_t( 6, "SSS" )),
8204 test_pack_t("result := foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
8205 test_pack_t("result := foo(a + b)" , test_result_t( 4, "S" )),
8206 test_pack_t("result := foo(a + b, b + c)" , test_result_t( 5, "SS" )),
8207 test_pack_t("result := foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
8208 test_pack_t("result := foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
8209 test_pack_t("result := foo(a, x)" , test_result_t( 8, "ST" )),
8210 test_pack_t("result := foo(a, x, b)" , test_result_t( 9, "STS" )),
8211 test_pack_t("result := foo(a, x, b, y)" , test_result_t(10, "STST")),
8212 test_pack_t("result := foo(a + b, x + y)" , test_result_t( 8, "ST" )),
8213 test_pack_t("result := foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
8214 test_pack_t("result := foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
8215 test_pack_t("result := foo(x, a)" , test_result_t(11, "TS" )),
8216 test_pack_t("result := foo(x, a, y)" , test_result_t(12, "TST" )),
8217 test_pack_t("result := foo(x, a, y, b)" , test_result_t(13, "TSTS")),
8218 test_pack_t("result := foo(x + y, a + b)" , test_result_t(11, "TS" )),
8219 test_pack_t("result := foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
8220 test_pack_t("result := foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
8221 test_pack_t("result := foo(x, y, a, b)" , test_result_t(14, "TTSS")),
8222 test_pack_t("result := foo(a, b, x, y)" , test_result_t(15, "SSTT")),
8223 test_pack_t("result := foo(a, x, y, b)" , test_result_t(16, "STTS")),
8224 test_pack_t("result := foo(x, a, b, y)" , test_result_t(17, "TSST")),
8225 test_pack_t("result := foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
8226 test_pack_t("result := foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
8227 test_pack_t("result := foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
8228 test_pack_t("result := foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
8229 };
8230
8231 static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
8232
8233 std::deque<expression_t> expression_list;
8234
8235 for (std::size_t i = 0; i < test_pack_list_size; ++i)
8236 {
8237 expression_t expression;
8238 expression.register_symbol_table(symbol_table);
8239
8240 exprtk::parser<T> parser;
8241
8242 if (!parser.compile(test_pack_list[i].first, expression))
8243 {
8244 printf("run_test18() - [16] Overload VarArg Error: %s Expression: %s\n",
8245 parser.error().c_str(),
8246 test_pack_list[i].first.c_str());
8247
8248 return false;
8249 }
8250 else
8251 expression_list.push_back(expression);
8252 }
8253
8254 bool error_found = false;
8255
8256 for (std::size_t i = 0; i < expression_list.size(); ++i)
8257 {
8258 ovrld_func.clear();
8259 result = "";
8260 expression_list[i].value();
8261
8262 if (result != "string result")
8263 {
8264 printf("run_test18() - Error in evaluation! (13) Expression: %s\n",
8265 test_pack_list[i].first.c_str());
8266
8267 error_found = true;
8268 }
8269
8270 if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
8271 {
8272 printf("run_test18() - Error with ps_index (13) Expression: %s Expected: %d Got: %d\n",
8273 test_pack_list[i].first.c_str(),
8274 static_cast<int>(test_pack_list[i].second.ps_index),
8275 static_cast<int>(ovrld_func.current_ps_index));
8276
8277 error_found = true;
8278 }
8279
8280 if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
8281 {
8282 printf("run_test18() - Error with parameter seq (13) Expression: %s Expected: %s Got: %s\n",
8283 test_pack_list[i].first.c_str(),
8284 test_pack_list[i].second.param_seq.c_str(),
8285 ovrld_func.current_param_seq.c_str());
8286
8287 error_found = true;
8288 }
8289 }
8290
8291 if (error_found)
8292 {
8293 return false;
8294 }
8295 }
8296
8297 {
8298 typedef exprtk::symbol_table<T> symbol_table_t;
8299 typedef exprtk::expression<T> expression_t;
8300 typedef exprtk::parser<T> parser_t;
8301
8302 typedef std::pair<std::string,std::size_t> rtc_test_t;
8303 static const rtc_test_t rtc_tests[] =
8304 {
8305 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]]; } ", 5 ),
8306 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + 10]; } ", 5 ),
8307 std::make_pair(" x:= 0; for (var i := 0; i < (2 * v[]); i += 1) { x += (v[i] == vv[i]); } ", 10),
8308 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]] := i; } ", 5 ),
8309 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]] <=> v[i]; } ", 5 ),
8310 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i] <=> v[i + v[]]; } ", 10),
8311 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]]; } ", 5 ),
8312 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + 10]; } ", 5 ),
8313 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]] := i; } ", 5 ),
8314 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]] <=> z[i]; } ", 5 ),
8315 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*w)[i + v[]]; } ", 10),
8316 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*w)[i+w[]]; } ", 10),
8317 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+w)[i + v[]]; } ", 10),
8318 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+w)[i+w[]]; } ", 10),
8319 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*z)[i+v[]]; } ", 10),
8320 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*z)[i+w[]]; } ", 9 ),
8321 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+z)[i+v[]]; } ", 10),
8322 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+z)[i+z[]]; } ", 10),
8323 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; qq[i[0]] += xx ", 0 ),
8324 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[1] + xx) == (xx + qq[1])) ", 0 ),
8325 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] += xx) == xx) ", 0 ),
8326 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] += xx + yy) == (xx + yy)) ", 0 ),
8327 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] -= xx) == -xx) ", 0 ),
8328 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[0] -= (xx + yy)) == -(xx + yy)) ", 0 ),
8329 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[1] + qq[2]) == (qq[3 - 1] + qq[2 * 1/2]))", 0 ),
8330 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[qq[1]] == qq[1]) ", 0 ),
8331 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[1] += qq[1]) == qq[1 + 1] ", 0 ),
8332 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[1]] + xx) == (xx + qq[i[1]])) ", 0 ),
8333 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] += xx) == xx) ", 0 ),
8334 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] += xx + yy) == (xx + yy)) ", 0 ),
8335 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] -= xx) == -xx) ", 0 ),
8336 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[0]] -= (xx + yy)) == -(xx + yy))", 0 ),
8337 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; ((qq[i[1]] + qq[2]) == (qq[i[3] - i[1]] + qq[i[2] * 1/2]))", 0 ),
8338 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[qq[i[1]]] == qq[i[1]]) ", 0 ),
8339 std::make_pair(" var xx := 1; var yy := 1; var qq[5] := {0,1,2,3,4}; var i[5] := {0,1,2,3,4}; (qq[i[1]] += qq[i[1]]) == qq[i[1] + 1] ", 0 ),
8340 };
8341
8342 static const std::size_t rtc_tests_size = sizeof(rtc_tests) / sizeof(rtc_test_t);
8343
8344 bool error_found = false;
8345
8346 for (std::size_t i = 0; i < rtc_tests_size; ++i)
8347 {
8348 const std::string& expression_str = rtc_tests[i].first;
8349
8350 {
8351 T x = 6;
8352 T v[5] = { 0, 1, 2, 3, 4 };
8353 T w[3] = { 0, 1, 2 };
8356
8357 symbol_table_t symbol_table;
8358 expression_t expression;
8359 parser_t parser;
8360
8361 symbol_table.add_variable("x" , x );
8362 symbol_table.add_vector ("v" , v );
8363 symbol_table.add_vector ("w" , w );
8364 symbol_table.add_vector ("vv", vv);
8365 symbol_table.add_vector ("ww", ww);
8366
8368
8369 expression.register_symbol_table(symbol_table);
8370
8371 parser.register_vector_access_runtime_check(vartc);
8372
8373 if (!parser.compile(expression_str, expression))
8374 {
8375 printf("run_test18() - Error: %s\t [1] Expression: %s\n",
8376 parser.error().c_str(),
8377 expression_str.c_str());
8378
8379 error_found = true;
8380 return false;
8381 }
8382
8383 vartc.rtc_count = 0;
8384 expression.value();
8385
8386 if (vartc.rtc_count != rtc_tests[i].second)
8387 {
8388 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [0] Expression: %s\n",
8389 static_cast<unsigned int>(rtc_tests[i].second),
8390 static_cast<unsigned int>(vartc.rtc_count),
8391 expression_str.c_str());
8392 error_found = true;
8393 }
8394 }
8395
8396 {
8397 T x = 6;
8398 T v[5] = { 0, 1, 2, 3, 4 };
8399 T w[3] = { 0, 1, 2 };
8400 T v0[5] = { 0, 1, 2, 3, 4 };
8401 T v1[5] = { 0, 1, 2, 3, 4 };
8404
8405 symbol_table_t symbol_table;
8406 expression_t expression;
8407 parser_t parser;
8408
8409 symbol_table.add_variable("x" , x );
8410 symbol_table.add_vector ("v" , v );
8411 symbol_table.add_vector ("w" , w );
8412 symbol_table.add_vector ("vv", vv);
8413 symbol_table.add_vector ("ww", ww);
8414
8416
8417 expression.register_symbol_table(symbol_table);
8418
8419 parser.register_vector_access_runtime_check(vartc);
8420
8421 if (!parser.compile(expression_str, expression))
8422 {
8423 printf("run_test18() - Error: %s\t [2] Expression: %s\n",
8424 parser.error().c_str(),
8425 expression_str.c_str());
8426
8427 error_found = true;
8428 return false;
8429 }
8430
8431 vartc.rtc_count = 0;
8432 vv.rebase(v0);
8433 expression.value();
8434
8435 if (vartc.rtc_count != rtc_tests[i].second)
8436 {
8437 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [1] Expression: %s\n",
8438 static_cast<unsigned int>(rtc_tests[i].second),
8439 static_cast<unsigned int>(vartc.rtc_count),
8440 expression_str.c_str());
8441 error_found = true;
8442 }
8443
8444 vartc.rtc_count = 0;
8445 vv.rebase(v1);
8446 expression.value();
8447
8448 if (vartc.rtc_count != rtc_tests[i].second)
8449 {
8450 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [2] Expression: %s\n",
8451 static_cast<unsigned int>(rtc_tests[i].second),
8452 static_cast<unsigned int>(vartc.rtc_count),
8453 expression_str.c_str());
8454 error_found = true;
8455 }
8456 }
8457 }
8458
8459 if (error_found)
8460 {
8461 return false;
8462 }
8463 }
8464
8465 return true;
8466}
8467
8468template <typename T>
8470{
8475
8479
8480 using igenfunct_t::operator();
8481
8482 inline T operator()(std::string& result,
8484 {
8485
8486 result = "depth" + exprtk::details::to_str(static_cast<int>(scalar_t(parameters[0])()));
8487 return T(0);
8488 }
8489};
8490
8491template <typename T>
8493{
8494 typedef exprtk::symbol_table<T> symbol_table_t;
8495 typedef exprtk::expression<T> expression_t;
8496 typedef exprtk::parser<T> parser_t;
8497 typedef exprtk::function_compositor<T> compositor_t;
8498 typedef typename compositor_t::function function_t;
8499
8500 {
8501 T x = T(123.123);
8502
8503 compositor_t compositor;
8504
8505 // f(x) = x + 2
8506 compositor.add(function_t("f", "x + 2", "x"));
8507
8508 // g(x) = x^2-3
8509 compositor.add(function_t("g", "x^2 - 3", "x"));
8510
8511 // fof(x) = f(f(x))
8512 compositor.add(function_t("fof", "f(f(x))", "x"));
8513
8514 // gog(x) = g(g(x))
8515 compositor.add(function_t("gog", "g(g(x))", "x"));
8516
8517 // fog(x) = f(g(x))
8518 compositor.add(function_t("fog", "f(g(x))", "x"));
8519
8520 // gof(x) = g(f(x))
8521 compositor.add(function_t("gof", "g(f(x))", "x"));
8522
8523 // fogof(x) = f(g(f(x)))
8524 compositor.add(function_t("fogof", "f(g(f(x)))", "x"));
8525
8526 // gofog(x) = g(f(g(x)))
8527 compositor.add(function_t("gofog", "g(f(g(x)))", "x"));
8528
8529 symbol_table_t& symbol_table = compositor.symbol_table();
8530 symbol_table.add_constants();
8531 symbol_table.add_variable("x", x);
8532
8533 static const std::string expr_str_list[] =
8534 {
8535 "equal(f(x),(x + 2))",
8536 "equal(g(x),(x^2 - 3))",
8537 "equal(fof(x),(x + 4))",
8538 "equal(gog(x),(x^4 - 6x^2 + 6))",
8539 "equal(fog(x),(x^2 - 1))",
8540 "equal(gof(x),(x^2 + 4x + 1))",
8541 "equal(fogof(x),(x^2 + 4x + 3))",
8542 "equal(gofog(x),(x^4 - 2x^2 - 2))"
8543 };
8544 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
8545
8546 std::deque<expression_t> expression_list;
8547
8548 for (std::size_t i = 0; i < expr_str_list_size; ++i)
8549 {
8550 expression_t expression;
8551 expression.register_symbol_table(symbol_table);
8552
8553 parser_t parser;
8554
8555 if (!parser.compile(expr_str_list[i], expression))
8556 {
8557 printf("run_test19() - Error: %s Expression: %s\n",
8558 parser.error().c_str(),
8559 expr_str_list[i].c_str());
8560
8561 return false;
8562 }
8563 else
8564 expression_list.push_back(expression);
8565 }
8566
8567 bool error_found = false;
8568
8569 for (std::size_t i = 0; i < expression_list.size(); ++i)
8570 {
8571 if (T(1) != expression_list[i].value())
8572 {
8573 printf("run_test19() - Error in evaluation! (1) Expression: %s\n",
8574 expr_str_list[i].c_str());
8575
8576 error_found = true;
8577 }
8578 }
8579
8580 if (error_found)
8581 {
8582 return false;
8583 }
8584 }
8585
8586 {
8587 const std::size_t rounds = 100;
8588
8589 for (std::size_t r = 0; r < rounds; ++r)
8590 {
8591 T x = T(1);
8592 T y = T(2);
8593 T z = T(3);
8594 T w = T(4);
8595 T u = T(5);
8596 T v = T(6);
8597
8598 compositor_t compositor;
8599
8600 // f0() = 6
8601 compositor
8602 .add(
8603 function_t("f0")
8604 .expression("3 * 2"));
8605
8606 // f1(x) = 5 * (f0 + x)
8607 compositor
8608 .add(
8609 function_t("f1")
8610 .var("x")
8611 .expression("5 * (f0 + x)"));
8612
8613 // f2(x,y) = 7 * (f1(x) + f1(y))
8614 compositor
8615 .add(
8616 function_t("f2")
8617 .var("x").var("y")
8618 .expression("7 * (f1(x) + f1(y))"));
8619
8620 // f3(x,y,z) = 9 * (f2(x,y) + f2(y,z) + f2(x,z))
8621 compositor
8622 .add(
8623 function_t("f3")
8624 .var("x").var("y").var("z")
8625 .expression("9 * (f2(x,y) + f2(y,z) + f2(x,z))"));
8626
8627 // f4(x,y,z,w) = 11 * (f3(x,y,z) + f3(y,z,w) + f3(z,w,z))
8628 compositor
8629 .add(
8630 function_t("f4")
8631 .var("x").var("y").var("z").var("w")
8632 .expression("11 * (f3(x,y,z) + f3(y,z,w) + f3(z,w,x))"));
8633
8634 // 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))
8635 compositor
8636 .add(
8637 function_t("f5")
8638 .var("x").var("y").var("z").var("w").var("u")
8639 .expression("13 * (f4(x,y,z,w) + f4(y,z,w,u) + f4(z,w,u,x) + f4(w,u,x,y))"));
8640
8641 // 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))
8642 compositor
8643 .add(
8644 function_t("f6")
8645 .var("x").var("y").var("z")
8646 .var("w").var("u").var("v")
8647 .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))"));
8648
8649 symbol_table_t& symbol_table = compositor.symbol_table();
8650 symbol_table.add_constants();
8651 symbol_table.add_variable("x", x);
8652 symbol_table.add_variable("y", y);
8653 symbol_table.add_variable("z", z);
8654 symbol_table.add_variable("w", w);
8655 symbol_table.add_variable("u", u);
8656 symbol_table.add_variable("v", v);
8657
8658 parser_t parser;
8659
8660 const std::string expr_str_list[] =
8661 {
8662 "f0()",
8663 "f1(x)",
8664 "f2(x,x)",
8665 "f3(x,x,x)",
8666 "f4(x,x,x,x)",
8667 "f5(x,x,x,x,x)",
8668 "f6(x,x,x,x,x,x)",
8669 "f2(x,y)",
8670 "f3(x,y,z)",
8671 "f4(x,y,z,w)",
8672 "f5(x,y,z,w,u)",
8673 "f6(x,y,z,w,u,v)"
8674 };
8675
8676 const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
8677
8678 const T result_list[] =
8679 {
8680 T(6),
8681 T(35),
8682 T(490),
8683 T(13230),
8684 T(436590),
8685 T(22702680),
8686 T(1543782240),
8687 T(525),
8688 T(15120),
8689 T(533610),
8690 T(29459430),
8691 T(2122700580)
8692 };
8693
8694 bool error_found = false;
8695
8696 for (std::size_t i = 0; i < expr_str_list_size; ++i)
8697 {
8698 expression_t expression;
8699 expression.register_symbol_table(symbol_table);
8700
8701 if (!parser.compile(expr_str_list[i], expression))
8702 {
8703 printf("run_test19() - Error: %s Expression: %s\n",
8704 parser.error().c_str(),
8705 expr_str_list[i].c_str());
8706
8707 error_found = true;
8708 continue;
8709 }
8710
8711 const T result = expression.value();
8712
8713 if (result_list[i] != result)
8714 {
8715 printf("run_test19() - Error in evaluation! (2) Expression: %s Expected: %10.1f\tResult: %10.1f\n",
8716 expr_str_list[i].c_str(),
8717 result_list[i].toDouble(),
8718 result.toDouble());
8719
8720 error_found = true;
8721 continue;
8722 }
8723 }
8724
8725 if (error_found)
8726 {
8727 return false;
8728 }
8729 }
8730 }
8731
8732 {
8733 T x = T(0);
8734
8735 compositor_t compositor;
8736
8737 compositor
8738 .add(
8739 function_t(
8740 "is_prime_impl1",
8741 "if (y == 1,true, "
8742 " if (0 == (x % y),false, "
8743 " is_prime_impl1(x,y - 1))) ",
8744 "x","y"));
8745
8746 compositor
8747 .add(
8748 function_t(
8749 "is_prime1",
8750 "if (frac(x) != 0, false, "
8751 " if (x <= 0, false, "
8752 " is_prime_impl1(x,min(x - 1,trunc(sqrt(x)) + 1)))) ",
8753 "x"));
8754
8755 compositor
8756 .add(
8757 function_t(
8758 "is_prime_impl2",
8759 "switch "
8760 "{ "
8761 " case y == 1 : true; "
8762 " case (x % y) == 0 : false; "
8763 " default : is_prime_impl2(x,y - 1);"
8764 "} ",
8765 "x","y"));
8766
8767 compositor
8768 .add(
8769 function_t(
8770 "is_prime2",
8771 "switch "
8772 "{ "
8773 " case x <= 0 : false; "
8774 " case frac(x) != 0 : false; "
8775 " default : is_prime_impl2(x,min(x - 1,trunc(sqrt(x)) + 1));"
8776 "} ",
8777 "x"));
8778
8779 compositor
8780 .add(
8781 function_t(
8782 "is_prime_impl3",
8783 "while (y > 0) "
8784 "{ "
8785 " switch "
8786 " { "
8787 " case y == 1 : ~(y := 0, true);"
8788 " case (x % y) == 0 : ~(y := 0,false);"
8789 " default : y := y - 1; "
8790 " } "
8791 "} ",
8792 "x","y"));
8793
8794 compositor
8795 .add(
8796 function_t(
8797 "is_prime3",
8798 "switch "
8799 "{ "
8800 " case x <= 0 : false; "
8801 " case frac(x) != 0 : false; "
8802 " default : is_prime_impl3(x,min(x - 1,trunc(sqrt(x)) + 1));"
8803 "} ",
8804 "x"));
8805
8806 compositor
8807 .add(
8808 function_t(
8809 "is_prime_impl4",
8810 "switch "
8811 "{ "
8812 " case 1 == x : false; "
8813 " case 2 == x : true; "
8814 " case 3 == x : true; "
8815 " case 5 == x : true; "
8816 " case 7 == x : true; "
8817 " case 0 == x % 2 : false; "
8818 " default : "
8819 " { "
8820 " for (var i := 3; i < y; i += 2) "
8821 " { "
8822 " if ((x % i) == 0) "
8823 " break[false]; "
8824 " else "
8825 " true; "
8826 " } "
8827 " }; "
8828 "} ",
8829 "x","y"));
8830
8831 compositor
8832 .add(
8833 function_t(
8834 "is_prime4",
8835 "switch "
8836 "{ "
8837 " case x <= 0 : false; "
8838 " case frac(x) != 0 : false; "
8839 " default : is_prime_impl4(x,min(x - 1,trunc(sqrt(x)) + 1));"
8840 "} ",
8841 "x"));
8842
8843 symbol_table_t& symbol_table = compositor.symbol_table();
8844 symbol_table.add_constants();
8845 symbol_table.add_variable("x",x);
8846
8847 const std::string expression_str[] =
8848 {
8849 "is_prime1(x)",
8850 "is_prime2(x)",
8851 "is_prime3(x)",
8852 "is_prime4(x)"
8853 };
8854
8855 const std::size_t expression_count = sizeof(expression_str) / sizeof(std::string);
8856
8857 std::vector<expression_t> expression_list;
8858
8859 for (std::size_t i = 0; i < expression_count; ++i)
8860 {
8861 parser_t parser;
8862
8863 expression_t expression;
8864 expression.register_symbol_table(symbol_table);
8865
8866 if (!parser.compile(expression_str[i],expression))
8867 {
8868 printf("run_test19() - Error: %s Expression%d: %s\n",
8869 parser.error().c_str(),
8870 static_cast<unsigned int>(i),
8871 expression_str[i].c_str());
8872
8873 return false;
8874 }
8875 else
8876 expression_list.push_back(expression);
8877 }
8878
8879 bool error_found = false;
8880
8881 const std::size_t prime_list[] =
8882 {
8883 2, 3, 5, 7, 11, 13, 17, 19,
8884 877, 947, 1087, 1153, 1229, 1297, 1381, 1453,
8885 1523, 1597, 1663, 1741, 1823, 1901, 1993, 2063,
8886 2131, 2221, 2293, 2371, 2437, 2539, 2621, 2689,
8887 2749, 2833, 2909, 3001, 3083, 3187, 3259, 3343,
8888 3433, 3517, 3581, 3659, 3733, 3823, 3911, 4001,
8889 4073, 4153, 4241, 4327, 4421, 4507, 4591, 4663,
8890 4759, 4861, 4943, 5009, 5099, 5189, 5281, 5393,
8891 5449, 5527, 5641, 5701, 5801, 5861, 5953, 6067,
8892 6143, 6229, 6311, 6373, 6481, 6577, 6679, 6763,
8893 6841, 6947, 7001, 7109, 7211, 7307, 7417, 7507,
8894 104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383,
8895 104393, 104399, 104417, 104459, 104471, 104473, 104479, 104491,
8896 104513, 104527, 104537, 104543, 104549, 104551, 104561, 104579,
8897 104593, 104597, 104623, 104639, 104651, 104659, 104677, 104681,
8898 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729,
8899 1000621, 1000639, 1000651, 1000667, 1000669, 1001023, 1001027, 1001041
8900 };
8901
8902 const std::size_t prime_list_size = sizeof(prime_list) / sizeof(std::size_t);
8903
8904 for (std::size_t i = 0; (i < prime_list_size) && (!error_found); ++i)
8905 {
8906 x = static_cast<T>(prime_list[i]);
8907
8908 std::vector<T> result(expression_count,T(0));
8909
8910 for (std::size_t j = 0; j < expression_list.size(); ++j)
8911 {
8912 result[j] = expression_list[j].value();
8913 }
8914
8915 for (std::size_t j = 1; j < expression_list.size(); ++j)
8916 {
8917 if (result[j] != result[0])
8918 {
8919 error_found = true;
8920 break;
8921 }
8922 }
8923
8924 if (error_found)
8925 {
8926 printf("run_test19() - Error in evaluation! (3) Results don't match! Prime: %d\n",
8927 static_cast<unsigned int>(prime_list[i]));
8928
8929 for (std::size_t j = 0; j < expression_list.size(); ++j)
8930 {
8931 printf("Expression[%02d]: %s = %d\n",
8932 static_cast<unsigned int>(j),
8933 expression_str[j].c_str(),
8934 static_cast<unsigned int>(result[j].toDouble()));
8935 }
8936 }
8937 else if (T(1) != expression_list[0].value())
8938 {
8939 printf("run_test19() - Error in evaluation! (4) Results don't match! Prime: %d\n",
8940 static_cast<unsigned int>(prime_list[i]));
8941
8942 for (std::size_t j = 0; j < expression_list.size(); ++j)
8943 {
8944 printf("Expression[%02d]: %s = %d\n",
8945 static_cast<unsigned int>(j),
8946 expression_str[j].c_str(),
8947 static_cast<unsigned int>(result[j].toDouble()));
8948 }
8949 }
8950 }
8951
8952 if (error_found)
8953 {
8954 return false;
8955 }
8956 }
8957
8958 {
8959 T x = T(0);
8960
8961 compositor_t compositor;
8962
8963 compositor
8964 .add(
8965 function_t(
8966 "fibonacci1",
8967 "if (x == 0,0, "
8968 " if (x == 1,1, "
8969 " fibonacci1(x - 1) + fibonacci1(x - 2)))",
8970 "x"));
8971
8972 compositor
8973 .add(
8974 function_t(
8975 "fibonacci2",
8976 "switch "
8977 "{ "
8978 " case x == 0 : 0; "
8979 " case x == 1 : 1; "
8980 " default : fibonacci2(x - 1) + fibonacci2(x - 2);"
8981 "} ",
8982 "x"));
8983
8984 compositor
8985 .add(
8986 function_t(
8987 "fibonacci_impl3",
8988 "switch "
8989 "{ "
8990 " case x == 0 : 0; "
8991 " case x == 1 : 1; "
8992 " default : "
8993 " while ((x := (x - 1)) > 0) "
8994 " { "
8995 " w := z; "
8996 " z := z + y; "
8997 " y := w; "
8998 " z "
8999 " }; "
9000 "} ",
9001 "x","y","z","w"));
9002
9003 compositor
9004 .add(
9005 function_t(
9006 "fibonacci3",
9007 "fibonacci_impl3(x,0,1,0)",
9008 "x"));
9009
9010 compositor
9011 .add(
9012 function_t(
9013 "fibonacci_impl4",
9014 "switch "
9015 "{ "
9016 " case x == 0 : 0; "
9017 " case x == 1 : 1; "
9018 " default : "
9019 " repeat "
9020 " w := z; "
9021 " z := z + y; "
9022 " y := w; "
9023 " x := x - 1; "
9024 " z "
9025 " until (x <= 1); "
9026 "} ",
9027 "x","y","z","w"));
9028
9029 compositor
9030 .add(
9031 function_t(
9032 "fibonacci4",
9033 "fibonacci_impl4(x,0,1,0)",
9034 "x"));
9035
9036 compositor
9037 .add(
9038 function_t(
9039 "fibonacci5",
9040 "if ((x == 0) or (x == 1)) "
9041 " x; "
9042 "else "
9043 " fibonacci5(x - 1) + fibonacci5(x - 2); ",
9044 "x"));
9045
9046 symbol_table_t& symbol_table = compositor.symbol_table();
9047
9048 symbol_table.add_constants();
9049 symbol_table.add_variable("x",x);
9050
9051 const std::string expression_str[] =
9052 {
9053 "fibonacci1(x)",
9054 "fibonacci2(x)",
9055 "fibonacci3(x)",
9056 "fibonacci4(x)",
9057 "fibonacci5(x)"
9058 };
9059
9060 const std::size_t expression_count = sizeof(expression_str) / sizeof(std::string);
9061
9062 std::vector<expression_t> expression_list;
9063
9064 for (std::size_t i = 0; i < expression_count; ++i)
9065 {
9066 parser_t parser;
9067
9068 expression_t expression;
9069 expression.register_symbol_table(symbol_table);
9070
9071 if (!parser.compile(expression_str[i],expression))
9072 {
9073 printf("run_test19() - Error: %s Expression[%02d]: %s\n",
9074 parser.error().c_str(),
9075 static_cast<unsigned int>(i),
9076 expression_str[i].c_str());
9077
9078 return false;
9079 }
9080 else
9081 expression_list.push_back(expression);
9082 }
9083
9084 bool error_found = false;
9085
9086 const std::size_t fibonacci_list[] =
9087 {
9088 0, 1, 1, 2,
9089 3, 5, 8, 13,
9090 21, 34, 55, 89,
9091 144, 233, 377, 610,
9092 987, 1597, 2584, 4181,
9093 6765, 10946, 17711, 28657,
9094 46368, 75025, 121393, 196418,
9095 317811, 514229, 832040, 1346269
9096 };
9097
9098 const std::size_t fibonacci_list_size = sizeof(fibonacci_list) / sizeof(std::size_t);
9099
9100 for (std::size_t i = 0; (i < fibonacci_list_size) && (!error_found); ++i)
9101 {
9102 x = static_cast<T>(i);
9103
9104 std::vector<T> result(expression_count,T(0));
9105
9106 for (std::size_t j = 0; j < expression_list.size(); ++j)
9107 {
9108 result[j] = expression_list[j].value();
9109 }
9110
9111 for (std::size_t j = 1; j < expression_list.size(); ++j)
9112 {
9113 if (result[j] != result[0])
9114 {
9115 error_found = true;
9116 break;
9117 }
9118 }
9119
9120 if (error_found)
9121 {
9122 printf("run_test19() - Error in evaluation! (5) Results don't match! fibonacci(%d) = %d\n",
9123 static_cast<unsigned int>(i),
9124 static_cast<unsigned int>(fibonacci_list[i]));
9125
9126 for (std::size_t j = 0; j < expression_list.size(); ++j)
9127 {
9128 printf("Expression[%02d]: %s = %d\n",
9129 static_cast<unsigned int>(j),
9130 expression_str[j].c_str(),
9131 static_cast<unsigned int>(result[j].toDouble()));
9132 }
9133 }
9134 else if (fibonacci_list[i] != expression_list[0].value())
9135 {
9136 printf("run_test19() - Error in evaluation! (6) Results don't match! fibonacci(%d) = %d\n",
9137 static_cast<unsigned int>(i),
9138 static_cast<unsigned int>(fibonacci_list[i]));
9139
9140 for (std::size_t j = 0; j < expression_list.size(); ++j)
9141 {
9142 printf("Expression[%02d]: %s = %d\n",
9143 static_cast<unsigned int>(j),
9144 expression_str[j].c_str(),
9145 static_cast<unsigned int>(result[j].toDouble()));
9146 }
9147 }
9148 }
9149
9150 if (error_found)
9151 {
9152 return false;
9153 }
9154 }
9155
9156 {
9157 T x = T(0);
9158
9159 symbol_table_t symbol_table;
9160
9161 symbol_table.add_constants();
9162 symbol_table.add_variable("x",x);
9163
9164 compositor_t compositor(symbol_table);
9165
9166 compositor
9167 .add(
9168 function_t(
9169 "newton_sqrt_impl",
9170 "switch "
9171 "{ "
9172 " case x < 0 : -inf; "
9173 " case x == 0 : 0; "
9174 " case x == 1 : 1; "
9175 " default: "
9176 " ~{ "
9177 " z := 100; "
9178 " y := x / 2; "
9179 " repeat "
9180 " y := (1 / 2) * (y + (x / y)); "
9181 " if (equal(y * y,x)) "
9182 " break[y]; "
9183 " until ((z -= 1) <= 0); "
9184 " }; "
9185 "} ",
9186 "x","y","z"));
9187
9188 compositor
9189 .add(
9190 function_t(
9191 "newton_sqrt",
9192 "newton_sqrt_impl(x,0,0)","x"));
9193
9194 std::string expression_str = "newton_sqrt(x)";
9195
9196 expression_t expression;
9197
9198 expression.register_symbol_table(symbol_table);
9199
9200 parser_t parser;
9201
9202 if (!parser.compile(expression_str,expression))
9203 {
9204 printf("run_test19() - Error: %s Expression: %s\n",
9205 parser.error().c_str(),
9206 expression_str.c_str());
9207
9208 return false;
9209 }
9210
9211 bool error_found = false;
9212
9213 for (std::size_t i = 0; i < 100; ++i)
9214 {
9215 x = static_cast<T>(i);
9216
9217 const T result = expression.value();
9218
9219 if (not_equal(result,mpfr::sqrt(x),T(0.0000001)))
9220 {
9221 printf("run_test19() - Computation Error "
9222 "Expression: [%s]\tExpected: %12.8f\tResult: %12.8f\n",
9223 expression_str.c_str(),
9224 mpfr::sqrt(x).toDouble(),
9225 result.toDouble());
9226
9227 error_found = true;
9228 }
9229 }
9230
9231 if (error_found)
9232 {
9233 return false;
9234 }
9235 }
9236
9237 {
9238 symbol_table_t symbol_table;
9239
9240 symbol_table.add_constants();
9241
9242 compositor_t compositor(symbol_table);
9243
9244 compositor
9245 .add(
9246 function_t(
9247 "mandelbrot",
9248 " var width := 118; "
9249 " var height := 41; "
9250 " var imag_max := +1; "
9251 " var imag_min := -1; "
9252 " var real_max := +1; "
9253 " var real_min := -2.5; "
9254 " var x_step := (real_max - real_min) / width; "
9255 " var y_step := (imag_max - imag_min) / height; "
9256 " for (var y := 0; y < height; y += 1) "
9257 " { "
9258 " var imag := imag_min + (y_step * y); "
9259 " for (var x := 0; x < width; x += 1) "
9260 " { "
9261 " var real := real_min + x_step * x; "
9262 " var z_real := real; "
9263 " var z_imag := imag; "
9264 " var plot_value; "
9265 " for (var n := 0; n < 30; n += 1) "
9266 " { "
9267 " var a := z_real^2; "
9268 " var b := z_imag^2; "
9269 " plot_value := n; "
9270 " if ((a + b) < 4) "
9271 " { "
9272 " z_imag := 2 * z_real * z_imag + imag; "
9273 " z_real := a - b + real; "
9274 " } "
9275 " else "
9276 " break; "
9277 " }; "
9278 " }; "
9279 " } "));
9280
9281 std::string expression_str = "mandelbrot()";
9282
9283 expression_t expression;
9284
9285 expression.register_symbol_table(symbol_table);
9286
9287 parser_t parser;
9288
9289 if (!parser.compile(expression_str,expression))
9290 {
9291 printf("run_test19() - Error: %s Expression: %s\n",
9292 parser.error().c_str(),
9293 expression_str.c_str());
9294
9295 return false;
9296 }
9297
9298 for (std::size_t i = 0; i < 100; ++i)
9299 {
9300 expression.value();
9301 }
9302 }
9303
9304 {
9305 T x = T(0);
9306
9307 symbol_table_t symbol_table;
9308
9309 symbol_table.add_variable("x",x);
9310
9311 compositor_t compositor(symbol_table);
9312
9313 compositor
9314 .add(
9315 function_t(
9316 "fooboo",
9317 " var x := input; "
9318 " if (x > 0) "
9319 " fooboo(x - 1) + x; "
9320 " else "
9321 " 0; ",
9322 "input"));
9323
9324 std::string expression_str = "fOoBoO(x)";
9325
9326 expression_t expression;
9327
9328 expression.register_symbol_table(symbol_table);
9329
9330 parser_t parser;
9331
9332 if (!parser.compile(expression_str,expression))
9333 {
9334 printf("run_test19() - Error: %s Expression: %s\n",
9335 parser.error().c_str(),
9336 expression_str.c_str());
9337
9338 return false;
9339 }
9340
9341 T sum = T(0);
9342
9343 for (std::size_t i = 0; i < 100; ++i)
9344 {
9345 x = T(i);
9346
9347 sum += x;
9348
9349 const T result = expression.value();
9350
9351 if (result != sum)
9352 {
9353 printf("run_test19() - FooBoo(%5.2f) Expected: %5.2f\tResult: %5.2f\n",
9354 static_cast<double>(x.toDouble()),
9355 static_cast<double>(sum.toDouble()),
9356 static_cast<double>(result.toDouble()));
9357
9358 return false;
9359 }
9360 }
9361 }
9362
9363 {
9364 const std::pair<std::string,std::string> test_funcprog[] =
9365 {
9366 std::make_pair
9367 (
9368 " var s := depth_to_str(depth); "
9369 " "
9370 " if (depth > 0) "
9371 " { "
9372 " if (recursive(depth - 1) == false) "
9373 " { "
9374 " return [false]; "
9375 " } "
9376 " }; "
9377 " "
9378 " s == depth_to_str(depth); ",
9379
9380 " recursive(1000) "
9381 ),
9382
9383 std::make_pair
9384 (
9385 " var v[7] := [ depth ]; "
9386 " "
9387 " if (depth > 0) "
9388 " { "
9389 " if (recursive(depth - 1) == false) "
9390 " { "
9391 " return [false]; "
9392 " } "
9393 " }; "
9394 " "
9395 " return [sum(v == depth) == v[]]; ",
9396
9397 " recursive(1000) "
9398 ),
9399
9400 std::make_pair
9401 (
9402 " var v1[ 7] := [ depth ]; "
9403 " var v2[21] := [ depth ]; "
9404 " "
9405 " if (depth > 0) "
9406 " { "
9407 " if (recursive(depth - 1) == false) "
9408 " { "
9409 " return [false]; "
9410 " } "
9411 " }; "
9412 " "
9413 " (sum(v1 == depth) == v1[]) and "
9414 " (sum(v2 == depth) == v2[]) ; "
9415 " ",
9416
9417 " recursive(1000) "
9418 ),
9419
9420 std::make_pair
9421 (
9422 " var s := depth_to_str(depth); "
9423 " "
9424 " for (var i := 0; i < 2; i += 1) "
9425 " { "
9426 " if (depth > 0) "
9427 " { "
9428 " if (recursive(depth - 1) == false) "
9429 " { "
9430 " return [false]; "
9431 " } "
9432 " }; "
9433 " }; "
9434 " "
9435 " s == depth_to_str(depth); ",
9436
9437 " recursive(20) "
9438 ),
9439
9440 std::make_pair
9441 (
9442 " var s := depth_to_str(depth); "
9443 " "
9444 " for (var i := 0; i < 2; i += 1) "
9445 " { "
9446 " for (var j := 0; j < 2; j += 1) "
9447 " { "
9448 " if (depth > 0) "
9449 " { "
9450 " if (recursive(depth - 1) == false) "
9451 " { "
9452 " return [false]; "
9453 " } "
9454 " }; "
9455 " }; "
9456 " }; "
9457 " "
9458 " s == depth_to_str(depth); ",
9459
9460 " recursive(10) "
9461 ),
9462
9463 std::make_pair
9464 (
9465 " var v[7] := [ depth ]; "
9466 " "
9467 " for (var i := 0; i < 2; i += 1) "
9468 " { "
9469 " var w[21] := [ depth + 1 ]; "
9470 " "
9471 " if (depth > 0) "
9472 " { "
9473 " if (recursive(depth - 1) == false) "
9474 " { "
9475 " return [false]; "
9476 " } "
9477 " }; "
9478 " "
9479 " if (sum(w == (depth + 1)) != w[]) "
9480 " { "
9481 " return [false]; "
9482 " }; "
9483 " }; "
9484 " "
9485 " return [sum(v == depth) == v[]]; ",
9486
9487 " recursive(5) "
9488 ),
9489
9490 std::make_pair
9491 (
9492 " var v[7] := [ depth ]; "
9493 " "
9494 " for (var i := 0; i < 2; i += 1) "
9495 " { "
9496 " var u[21] := [ depth + 1 ]; "
9497 " "
9498 " for (var j := 0; j < 2; j += 1) "
9499 " { "
9500 " var w[35] := [ depth + 2 ]; "
9501 " "
9502 " if (depth > 0) "
9503 " { "
9504 " if (recursive(depth - 1) == false) "
9505 " { "
9506 " return [false]; "
9507 " } "
9508 " }; "
9509 " "
9510 " if (sum(w == (depth + 2)) != w[]) "
9511 " { "
9512 " return [false]; "
9513 " }; "
9514 " }; "
9515 " "
9516 " if (sum(u == (depth + 1)) != u[]) "
9517 " { "
9518 " return [false]; "
9519 " }; "
9520 " }; "
9521 " "
9522 " return [sum(v == depth) == v[]]; ",
9523
9524 " recursive(5) "
9525 ),
9526
9527 std::make_pair
9528 (
9529 " var s := depth_to_str(depth); "
9530 " var v[7] := [ depth ]; "
9531 " "
9532 " if (depth > 0) "
9533 " { "
9534 " if (recursive(depth - 1) == false) "
9535 " { "
9536 " return [false]; "
9537 " } "
9538 " }; "
9539 " "
9540 " return "
9541 " [ "
9542 " (s == depth_to_str(depth)) and "
9543 " (sum(v == depth) == v[]) "
9544 " ]; ",
9545
9546 " recursive(1000) "
9547 ),
9548
9549 std::make_pair
9550 (
9551 " var s0 := depth_to_str(depth); "
9552 " var v0[7] := [ depth ]; "
9553 " var s1 := depth_to_str(depth); "
9554 " var v1[42] := [ depth ]; "
9555 " "
9556 " if (depth > 0) "
9557 " { "
9558 " if (recursive(depth - 1) == false) "
9559 " { "
9560 " return [false]; "
9561 " } "
9562 " }; "
9563 " "
9564 " return "
9565 " [ "
9566 " (s0 == depth_to_str(depth)) and "
9567 " (sum(v0 == depth) == v0[]) and "
9568 " (s1 == depth_to_str(depth)) and "
9569 " (sum(v1 == depth) == v1[]) "
9570 " ]; ",
9571
9572 " recursive(1000) "
9573 ),
9574
9575 std::make_pair
9576 (
9577 " var s := depth_to_str(depth); "
9578 " var v[7] := [ depth ]; "
9579 " "
9580 " for (var i := 0; i < 2; i += 1) "
9581 " { "
9582 " if (depth > 0) "
9583 " { "
9584 " if (recursive(depth - 1) == false) "
9585 " { "
9586 " return [false]; "
9587 " } "
9588 " }; "
9589 " }; "
9590 " "
9591 " return "
9592 " [ "
9593 " (s == depth_to_str(depth)) and "
9594 " (sum(v == depth) == v[]) "
9595 " ]; ",
9596
9597 " recursive(15) "
9598 ),
9599
9600 std::make_pair
9601 (
9602 " var s0 := depth_to_str(depth); "
9603 " var v0[7] := [ depth ]; "
9604 " var s1 := depth_to_str(depth); "
9605 " var v1[42] := [ depth ]; "
9606 " "
9607 " for (var i := 0; i < 2; i += 1) "
9608 " { "
9609 " if (depth > 0) "
9610 " { "
9611 " if (recursive(depth - 1) == false) "
9612 " { "
9613 " return [false]; "
9614 " } "
9615 " }; "
9616 " }; "
9617 " "
9618 " return "
9619 " [ "
9620 " (s0 == depth_to_str(depth)) and "
9621 " (sum(v0 == depth) == v0[]) and "
9622 " (s1 == depth_to_str(depth)) and "
9623 " (sum(v1 == depth) == v1[]) "
9624 " ]; ",
9625
9626 " recursive(15) "
9627 ),
9628
9629 std::make_pair
9630 (
9631 " var s0 := depth_to_str(depth); "
9632 " var v0[7] := [ depth ]; "
9633 " "
9634 " for (var i := 0; i < 2; i += 1) "
9635 " { "
9636 " var s1 := depth_to_str(depth); "
9637 " var v1[21] := [ depth + 1 ]; "
9638 " "
9639 " if (depth > 0) "
9640 " { "
9641 " if (recursive(depth - 1) == false) "
9642 " { "
9643 " return [false]; "
9644 " } "
9645 " }; "
9646 " "
9647 " if (s1 != depth_to_str(depth)) "
9648 " { "
9649 " return [false]; "
9650 " }; "
9651 " "
9652 " if (sum(v1 == (depth + 1)) != v1[]) "
9653 " { "
9654 " return [false]; "
9655 " }; "
9656 " }; "
9657 " "
9658 " return "
9659 " [ "
9660 " (s0 == depth_to_str(depth)) and "
9661 " (sum(v0 == depth) == v0[]) "
9662 " ]; ",
9663
9664 " recursive(15) "
9665 ),
9666
9667 std::make_pair
9668 (
9669 " if (depth < 2) "
9670 " depth; "
9671 " else "
9672 " recursive(depth - 1) + "
9673 " recursive(depth - 2) ; ",
9674
9675 " var n := 20; "
9676 " var total := 0; "
9677 " "
9678 " for (var i := 0; i < n; i += 1) "
9679 " { "
9680 " total += recursive(i); "
9681 " }; "
9682 " "
9683 " total == 10945; "
9684 )
9685 };
9686
9687 const std::size_t test_funcprog_size = sizeof(test_funcprog) / sizeof(std::pair<std::string,std::string>);
9688 const std::size_t rounds = 5;
9689
9690 bool result = true;
9691
9692 for (std::size_t r = 0; r < rounds; ++r)
9693 {
9694 for (std::size_t i = 0; i < test_funcprog_size; ++i)
9695 {
9696 depth_to_str<T> dts;
9697
9698 symbol_table_t symbol_table;
9699 symbol_table.add_function("depth_to_str",dts);
9700
9701 compositor_t compositor(symbol_table);
9702
9703 const bool comp_result = compositor.add(
9704 function_t("recursive")
9705 .var("depth")
9706 .expression
9707 ( test_funcprog[i].first ));
9708
9709 if (!comp_result)
9710 {
9711 printf("run_test19() - Compositor Error: %s\nfunction: %s\n",
9712 compositor.error().c_str(),
9713 test_funcprog[i].first.c_str());
9714
9715 result = false;
9716 continue;
9717 }
9718
9719 expression_t expression;
9720 expression.register_symbol_table(symbol_table);
9721
9722 parser_t parser;
9723
9724 if (!parser.compile(test_funcprog[i].second, expression))
9725 {
9726 printf("run_test19() - Error: %s Expression: %s\n",
9727 parser.error().c_str(),
9728 test_funcprog[i].second.c_str());
9729
9730 result = false;
9731 continue;
9732 }
9733
9734 if (T(1) != expression.value())
9735 {
9736 printf("run_test19() - Evaluation Error: test_funcprog %d function: %s\n",
9737 static_cast<int>(i),
9738 test_funcprog[i].second.c_str());
9739
9740 result = false;
9741 continue;
9742 }
9743 }
9744
9745 if (!result)
9746 {
9747 return false;
9748 }
9749 }
9750 }
9751
9752 {
9753 symbol_table_t symbol_table;
9754
9755 symbol_table.add_constants();
9756
9757 const std::string expression_string =
9758 " var sieve[10^7] := [false]; "
9759 " var m := trunc(sqrt(sieve[])); "
9760 " "
9761 " sieve[0] := true; "
9762 " sieve[1] := true; "
9763 " "
9764 " for (var i := 0; i <= m; i += 1) "
9765 " { "
9766 " if (false == sieve[i]) "
9767 " { "
9768 " for (var j := (i * i); j < sieve[]; j += i) "
9769 " { "
9770 " sieve[j] := true; "
9771 " } "
9772 " } "
9773 " }; "
9774 " "
9775 " var prime_count := 0; "
9776 " for (var i := 0; i < sieve[]; i += 1) "
9777 " { "
9778 " if (false == sieve[i]) "
9779 " { "
9780 " prime_count += 1; "
9781 " }; "
9782 " }; "
9783 " "
9784 " prime_count == 664579; ";
9785
9786 expression_t expression;
9787
9788 expression.register_symbol_table(symbol_table);
9789
9790 parser_t parser;
9791
9792 if (!parser.compile(expression_string,expression))
9793 {
9794 printf("run_test19() - Error: %s Expression: %s\n",
9795 parser.error().c_str(),
9796 expression_string.c_str());
9797
9798 return false;
9799 }
9800
9801 if (T(1) != expression.value())
9802 {
9803 printf("run_test19() - Prime Sieve Computation Error");
9804
9805 return false;
9806 }
9807 }
9808
9809 {
9810 symbol_table_t symbol_table;
9811
9812 symbol_table.add_constants();
9813
9814 const std::string expression_str[] =
9815 {
9816 "var delta := 10^-7; var total := 0; for (var i := 0; i <= 3; i += delta) { total += "
9817 "erf(i) }; abs((delta * total) - (3 * erf(3) + (1 / exp(9) - 1) / sqrt(pi))) < 0.000001",
9818
9819 "var delta := 10^-7; var total := 0; for (var i := 0; i <= 3; i += delta) { total += "
9820 "erfc(i) }; abs((delta * total) - (3 * erfc(3) + ((1 - 1 / exp(9)) / sqrt(pi)))) < 0.000001"
9821 };
9822
9823 expression_t e[2];
9824
9825 parser_t parser;
9826
9827 for (std::size_t i = 0; i < 2; ++i)
9828 {
9829 e[i].register_symbol_table(symbol_table);
9830
9831 if (!parser.compile(expression_str[i],e[i]))
9832 {
9833 printf("run_test19() - Error: %s Expression: %s\n",
9834 parser.error().c_str(),
9835 expression_str[i].c_str());
9836
9837 return false;
9838 }
9839
9840 if (T(1) != e[i].value())
9841 {
9842 printf("run_test19() - erf/erfc computation error %d",
9843 static_cast<unsigned int>(i));
9844
9845 return false;
9846 }
9847 }
9848 }
9849
9850 return true;
9851}
9852
9853template <typename T>
9855{
9858
9859 using usr_t::process;
9860
9861 bool process(const std::string& unknown_symbol,
9862 usr_symbol_type& st,
9863 T& default_value,
9864 std::string& error_message) exprtk_test_override
9865 {
9866 if (unknown_symbol[0] == 'v')
9867 {
9869 default_value = next_value();
9870 error_message.clear();
9871
9872 return true;
9873 }
9874 else if (unknown_symbol[0] == 'c')
9875 {
9877 default_value = next_value();
9878 error_message.clear();
9879
9880 return true;
9881 }
9882 else
9883 {
9884 error_message = "Unknown symbol...";
9885 return false;
9886 }
9887 }
9888
9889 T next_value(const bool reset = false)
9890 {
9891 static T value = 0;
9892
9893 if (reset)
9894 return (value = 0);
9895 else
9896 return ++value;
9897 }
9898};
9899
9900template <typename T>
9902{
9905
9906 using usr_t::process;
9907
9911
9912 bool process(const std::string& unknown_symbol,
9913 symbol_table_t& symbol_table,
9914 std::string& error_message) exprtk_test_override
9915 {
9916 bool result = false;
9917
9918 if (unknown_symbol[0] == 'v')
9919 {
9920 static T var_default_value = 1.0;
9921
9922 if ((result = symbol_table.create_variable(unknown_symbol, var_default_value++)) == false)
9923 {
9924 error_message = "Failed to create variable(" + unknown_symbol + ") in primary symbol table";
9925 }
9926 }
9927 else if (unknown_symbol[0] == 'c')
9928 {
9929 static T cvar_default_value = 1.0;
9930
9931 if ((result = symbol_table.add_constant(unknown_symbol, cvar_default_value++)) == false)
9932 {
9933 error_message = "Failed to create const variable(" + unknown_symbol + ") in primary symbol table";
9934 }
9935 }
9936 else if (0 == unknown_symbol.find("foo"))
9937 {
9938 //functions of form: fooXX
9939 if (4 >= unknown_symbol.size())
9940 {
9941 switch(unknown_symbol[3])
9942 {
9943 case '1' : result = symbol_table.add_function(unknown_symbol,foo1);
9944 break;
9945
9946 case '2' : result = symbol_table.add_function(unknown_symbol,foo2);
9947 break;
9948
9949 case '3' : result = symbol_table.add_function(unknown_symbol,foo3);
9950 break;
9951
9952 case '4' : result = symbol_table.add_function(unknown_symbol,foo4);
9953 break;
9954
9955 case '5' : result = symbol_table.add_function(unknown_symbol,foo5);
9956 break;
9957
9958 case '6' : result = symbol_table.add_function(unknown_symbol,foo6);
9959 break;
9960 }
9961 }
9962
9963 if (!result)
9964 {
9965 error_message = "Failed to add function(" + unknown_symbol + ") in primary symbol table";
9966 }
9967 }
9968 else
9969 error_message = "Indeterminable symbol type.";
9970
9971 return result;
9972 }
9973};
9974
9975template <typename T>
9977{
9978 typedef exprtk::expression<T> expression_t;
9979
9980 {
9981 for (std::size_t i = 0; i < 100; ++i)
9982 {
9983 exprtk::symbol_table<T> symbol_table0; // primary symbol_table
9984 exprtk::symbol_table<T> symbol_table1;
9985 exprtk::symbol_table<T> symbol_table2;
9986 exprtk::symbol_table<T> symbol_table3;
9987
9988 symbol_table0.add_constants();
9989
9990 expression_t expression;
9991 expression.register_symbol_table(symbol_table0);
9992 expression.register_symbol_table(symbol_table1);
9993 expression.register_symbol_table(symbol_table2);
9994 expression.register_symbol_table(symbol_table3);
9995
9996 exprtk::parser<T> parser;
9997
9998 my_usr<T> musr;
9999 musr.next_value(true);
10000 parser.enable_unknown_symbol_resolver(&musr);
10001
10002 std::string expr_str = "v01+c02+v03+c04+v05+c06+v07+c08+v09+c10+"
10003 "v11+c12+v13+c14+v15+c16+v17+c18+v19+c20+"
10004 "v21+c22+v23+c24+v25+c26+v27+c28+v29+c30 ";
10005
10006 if (!parser.compile(expr_str,expression))
10007 {
10008 printf("run_test20() - [1] Error: %s Expression: %s\n",
10009 parser.error().c_str(),
10010 expr_str.c_str());
10011
10012 return false;
10013 }
10014
10015 T sum_1_30 = T((1 + 30) * 15);
10016 T result = expression.value();
10017
10018 if (sum_1_30 != result)
10019 {
10020 printf("run_test20() - [1] Error in evaluation! (1) Expression: %s\n",
10021 expr_str.c_str());
10022
10023 return false;
10024 }
10025 }
10026 }
10027
10028 {
10029 for (std::size_t i = 0; i < 100; ++i)
10030 {
10031 exprtk::symbol_table<T> symbol_table0; // primary symbol_table
10032 exprtk::symbol_table<T> symbol_table1;
10033 exprtk::symbol_table<T> symbol_table2;
10034 exprtk::symbol_table<T> symbol_table3;
10035
10036 symbol_table0.add_constants();
10037
10038 expression_t expression;
10039 expression.register_symbol_table(symbol_table0);
10040 expression.register_symbol_table(symbol_table1);
10041 expression.register_symbol_table(symbol_table2);
10042 expression.register_symbol_table(symbol_table3);
10043
10044 exprtk::parser<T> parser;
10045
10046 my_usr_ext<T> musr;
10047 parser.enable_unknown_symbol_resolver(&musr);
10048
10049 std::string expr_str = "foo6(foo1(v0),foo2(c1,foo4(v2,c3,v4,c5)),foo3"
10050 "(v6,c7,foo5(v8,c9,v10,c11,v12)),c13,v14,c15) ";
10051
10052 if (!parser.compile(expr_str,expression))
10053 {
10054 printf("run_test20() - [2] Error: %s Expression: %s\n",
10055 parser.error().c_str(),
10056 expr_str.c_str());
10057
10058 return false;
10059 }
10060 }
10061 }
10062
10063 {
10064 T var;
10065 std::string str;
10066 std::vector<T> vec(10,0.0);
10067
10068 typedef exprtk::symbol_table<T> symbol_table_t;
10069 typedef exprtk::expression<T> expression_t;
10070
10071 bool result = true;
10072
10073 {
10074 symbol_table_t symbol_table;
10075
10076 symbol_table.add_variable ("val",var);
10077 symbol_table.add_stringvar("str",str);
10078 symbol_table.add_vector ("vec",vec);
10079
10080 if (symbol_table.get_variable(std::string("val")) == 0 || !symbol_table.symbol_exists("val"))
10081 {
10082 printf("run_test20() - [3] Failed to get 'val' from symbol_table\n");
10083 result = false;
10084 }
10085
10086 if (symbol_table.get_stringvar("str") == 0 || !symbol_table.symbol_exists("str"))
10087 {
10088 printf("run_test20() - [3] Failed to get 'str' from symbol_table\n");
10089 result = false;
10090 }
10091
10092 if (symbol_table.get_vector("vec") == 0 || !symbol_table.symbol_exists("vec"))
10093 {
10094 printf("run_test20() - [3] Failed to get 'vec' from symbol_table\n");
10095 result = false;
10096 }
10097 }
10098
10099 if (!result)
10100 return result;
10101
10102 {
10103 symbol_table_t symbol_table;
10104
10105 symbol_table.add_variable("val",var);
10106
10107 if (symbol_table.get_variable(std::string("val")) == 0 || !symbol_table.symbol_exists("val"))
10108 {
10109 printf("run_test20() - [4] Failed to get 'val' from symbol_table\n");
10110 result = false;
10111 }
10112
10113 if (symbol_table.get_stringvar("str") != 0 || symbol_table.symbol_exists("str"))
10114 {
10115 printf("run_test20() - [4] Failed to get 'str' from symbol_table\n");
10116 result = false;
10117 }
10118
10119 if (symbol_table.get_vector("vec") != 0 || symbol_table.symbol_exists("vec"))
10120 {
10121 printf("run_test20() - [4] Failed to get 'vec' from symbol_table\n");
10122 result = false;
10123 }
10124 }
10125
10126 if (!result)
10127 return result;
10128
10129 {
10130 symbol_table_t symbol_table;
10131
10132 symbol_table.add_stringvar("str",str);
10133
10134 if (symbol_table.get_stringvar("str") == 0 || !symbol_table.symbol_exists("str"))
10135 {
10136 printf("run_test20() - [5] Failed to get 'str' from symbol_table\n");
10137 result = false;
10138 }
10139
10140 if (symbol_table.get_variable(std::string("val")) != 0 || symbol_table.symbol_exists("val"))
10141 {
10142 printf("run_test20() - [5] Failed to get 'val' from symbol_table\n");
10143 result = false;
10144 }
10145
10146 if (symbol_table.get_vector("vec") != 0 || symbol_table.symbol_exists("vec"))
10147 {
10148 printf("run_test20() - [5] Failed to get 'vec' from symbol_table\n");
10149 result = false;
10150 }
10151 }
10152
10153 if (!result)
10154 return result;
10155
10156 {
10157 symbol_table_t symbol_table;
10158
10159 symbol_table.add_vector("vec",vec);
10160
10161 if (symbol_table.get_vector("vec") == 0 || !symbol_table.symbol_exists("vec"))
10162 {
10163 printf("run_test20() - [6] Failed to get 'vec' from symbol_table\n");
10164 result = false;
10165 }
10166
10167 if (symbol_table.get_variable(std::string("val")) != 0 || symbol_table.symbol_exists("val"))
10168 {
10169 printf("run_test20() - [6] Failed to get 'val' from symbol_table\n");
10170 result = false;
10171 }
10172
10173 if (symbol_table.get_stringvar("str") != 0 || symbol_table.symbol_exists("str"))
10174 {
10175 printf("run_test20() - [6] Failed to get 'str' from symbol_table\n");
10176 result = false;
10177 }
10178 }
10179
10180 if (!result)
10181 return result;
10182
10183 {
10184 symbol_table_t symbol_table1;
10185 symbol_table_t symbol_table2;
10186 expression_t expression;
10187
10188 if (!expression.register_symbol_table(symbol_table1))
10189 {
10190 printf("run_test20() - Failed to register symbol_table1 with expression\n");
10191 result = false;
10192 }
10193
10194 if (!expression.register_symbol_table(symbol_table2))
10195 {
10196 printf("run_test20() - Failed to register symbol_table2 with expression\n");
10197 result = false;
10198 }
10199
10200 if (expression.num_symbol_tables() != 2)
10201 {
10202 printf("run_test20() - Invalid number of symbol tables in expression [1]\n");
10203 result = false;
10204 }
10205
10206 if (expression.register_symbol_table(symbol_table1))
10207 {
10208 printf("run_test20() - Error: was able to register symbol_table1 with expression\n");
10209 result = false;
10210 }
10211
10212 if (expression.register_symbol_table(symbol_table2))
10213 {
10214 printf("run_test20() - Error: was able to register symbol_table2 with expression\n");
10215 result = false;
10216 }
10217
10218 if (expression.num_symbol_tables() != 2)
10219 {
10220 printf("run_test20() - Invalid number of symbol tables in expression [2]\n");
10221 result = false;
10222 }
10223
10224 symbol_table_t symbol_table12 = symbol_table1;
10225 symbol_table_t symbol_table22 = symbol_table2;
10226
10227 if (expression.register_symbol_table(symbol_table12))
10228 {
10229 printf("run_test20() - Error: was able to register symbol_table12 with expression\n");
10230 result = false;
10231 }
10232
10233 if (expression.register_symbol_table(symbol_table22))
10234 {
10235 printf("run_test20() - Error: was able to register symbol_table22 with expression\n");
10236 result = false;
10237 }
10238
10239 if (expression.num_symbol_tables() != 2)
10240 {
10241 printf("run_test20() - Invalid number of symbol tables in expression [3]\n");
10242 result = false;
10243 }
10244
10245 symbol_table12 = symbol_table_t();
10246 symbol_table22 = symbol_table_t();
10247
10248 if (!expression.register_symbol_table(symbol_table12))
10249 {
10250 printf("run_test20() - Failed to register symbol_table12 with expression [2]\n");
10251 result = false;
10252 }
10253
10254 if (!expression.register_symbol_table(symbol_table22))
10255 {
10256 printf("run_test20() - Failed to register symbol_table22 with expression [2]\n");
10257 result = false;
10258 }
10259
10260 if (expression.num_symbol_tables() != 4)
10261 {
10262 printf("run_test20() - Invalid number of symbol tables in expression [4]\n");
10263 result = false;
10264 }
10265 }
10266
10267 if (!result)
10268 return result;
10269
10270 }
10271
10272 return true;
10273}
10274
10275template <typename T>
10276inline std::string results_to_string(const exprtk::results_context<T>& results)
10277{
10278 typedef exprtk::results_context<T> results_context_t;
10279 typedef typename results_context_t::type_store_t type_t;
10280
10281 std::string res_str;
10282
10283 for (std::size_t i = 0; i < results.count(); ++i)
10284 {
10285 type_t t = results[i];
10286
10287 switch (t.type)
10288 {
10289 case type_t::e_scalar : res_str += 'T';
10290 break;
10291
10292 case type_t::e_vector : res_str += 'V';
10293 break;
10294
10295 case type_t::e_string : res_str += 'S';
10296 break;
10297
10298 default : continue;
10299 }
10300 }
10301
10302 return res_str;
10303}
10304
10305template <typename T>
10306inline bool result_equal(const exprtk::results_context<T>& results, const T& value)
10307{
10308 typedef exprtk::results_context<T> results_context_t;
10309 typedef typename results_context_t::type_store_t type_t;
10310 typedef typename type_t::scalar_view scalar_t;
10311
10312 if (1 != results.count())
10313 return false;
10314 else if (type_t::e_scalar != results[0].type)
10315 return false;
10316 else
10317 return (value == scalar_t(results[0])());
10318}
10319
10320template <typename T>
10322{
10323public:
10324
10331 typedef std::map<void*,vv_ptr_t> map_t;
10332
10333 using exprtk::igeneric_function<T>::operator();
10334
10336 : exprtk::igeneric_function<T>("VT")
10337 {}
10338
10339 inline T operator()(parameter_list_t parameters)
10340 {
10341 vector_t vector(parameters[0]);
10342 size_t new_size = static_cast<std::size_t>(scalar_t(parameters[1])());
10343 void* key = static_cast<void*>(&vector[0]);
10344
10345 typename map_t::iterator itr = vector_map_.find(key);
10346
10347 if (itr == vector_map_.end())
10348 {
10349 return T(0);
10350 }
10351
10352 exprtk::vector_view<T>& vv = *itr->second;
10353
10354 if (vv.base_size() < new_size)
10355 {
10356 return T(0);
10357 }
10358
10359 return vv.set_size(new_size) ? T(1) : T(0);
10360 }
10361
10363 {
10364 vector_map_[vec_view.data()] = &vec_view;
10365 }
10366
10367private:
10368
10370};
10371
10372
10373template <typename T>
10375{
10376 typedef exprtk::symbol_table<T> symbol_table_t;
10377 typedef exprtk::expression<T> expression_t;
10378 typedef exprtk::parser<T> parser_t;
10379 typedef exprtk::parser_error::type error_type;
10380
10381 {
10382 T x = T(1.1);
10383 T y = T(2.2);
10384 T z = T(3.3);
10385
10386 symbol_table_t symbol_table;
10387 symbol_table.add_constants();
10388 symbol_table.add_variable("x",x);
10389 symbol_table.add_variable("y",y);
10390 symbol_table.add_variable("z",z);
10391
10392 static const std::string expression_list[] =
10393 {
10394 "return[]; x;",
10395 "return[x]; x;",
10396 "return[x,y]; x;",
10397 "return[x + y,y - x]; x;",
10398 "return[x + y,y - x,'abc']; x;",
10399 "if (x < y) return [1,'abc1']; else return [2,'abc2',x];" ,
10400 "if (x > y) return [1,'abc1']; else return [2,'abc2',x];" ,
10401 "if (x < y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
10402 "if (x > y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
10403 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1]; } ",
10404 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc']; } ",
10405 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x]; }",
10406 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y]; }",
10407 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y,z]; }",
10408 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [2,'abc2',x]; else x += 1; }",
10409 "for(var i := 0; i < 10; i += 1) { if (i == 5) { return [1,'abc1'];} else x += 1; }"
10410 };
10411
10412 static const std::string result_list[] =
10413 {
10414 "" ,
10415 "T" ,
10416 "TT" ,
10417 "TT" ,
10418 "TTS" ,
10419 "TS" ,
10420 "TST" ,
10421 "TS" ,
10422 "TST" ,
10423 "T" ,
10424 "TS" ,
10425 "TST" ,
10426 "TSTT" ,
10427 "TSTTT",
10428 "TST" ,
10429 "TS"
10430 };
10431
10432 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
10433
10434 bool error_found = false;
10435
10436 for (std::size_t i = 0; i < expression_list_size; ++i)
10437 {
10438 expression_t expression;
10439 expression.register_symbol_table(symbol_table);
10440
10441 parser_t parser;
10442
10443 if (!parser.compile(expression_list[i],expression))
10444 {
10445 printf("run_test21() - Error: %s Expression: %s [1]\n",
10446 parser.error().c_str(),
10447 expression_list[i].c_str());
10448
10449 error_found = true;
10450 continue;
10451 }
10452 else if (!parser.dec().return_present())
10453 {
10454 printf("run_test21() - Expected a return statement Expression: %s [1]\n",
10455 expression_list[i].c_str());
10456
10457 error_found = true;
10458 continue;
10459 }
10460
10461 expression.value();
10462
10463 std::string pattern = results_to_string<T>(expression.results());
10464
10465 if (!expression.return_invoked())
10466 {
10467 printf("run_test21() - Invalid return invoke state [1] Expression: %s\n",
10468 expression_list[i].c_str());
10469
10470 error_found = true;
10471 continue;
10472 }
10473 else if (result_list[i] != pattern)
10474 {
10475 printf("run_test21() - Invalid return results [1] Expected %s Got: %s Expression: %s\n",
10476 result_list[i].c_str(),
10477 pattern.c_str(),
10478 expression_list[i].c_str());
10479
10480 error_found = true;
10481 continue;
10482 }
10483 }
10484
10485 if (error_found)
10486 {
10487 return false;
10488 }
10489 }
10490
10491 {
10492 T x = T(1.1);
10493 T y = T(2.2);
10494 T z = T(3.3);
10495
10496 symbol_table_t symbol_table;
10497 symbol_table.add_constants();
10498 symbol_table.add_variable("x",x);
10499 symbol_table.add_variable("y",y);
10500 symbol_table.add_variable("z",z);
10501
10502 static const std::string expression_list[] =
10503 {
10504 "x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]; ",
10505 "x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7; ",
10506 "x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7; ",
10507 "x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7; ",
10508 "x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7; ",
10509 "x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7; ",
10510 "return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7; ",
10511 "~{x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]}",
10512 "~{x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7}",
10513 "~{x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7}",
10514 "~{x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7}",
10515 "~{x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7}",
10516 "~{x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7}",
10517 "~{return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7}"
10518 };
10519
10520 static const std::string result_list[] =
10521 {
10522 "T", "T", "T", "T", "T", "T", "T",
10523 "T", "T", "T", "T", "T", "T", "T",
10524 };
10525
10526 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
10527
10528 bool error_found = false;
10529
10530 for (std::size_t i = 0; i < expression_list_size; ++i)
10531 {
10532 expression_t expression;
10533 expression.register_symbol_table(symbol_table);
10534
10535 parser_t parser;
10536
10537 if (!parser.compile(expression_list[i],expression))
10538 {
10539 printf("run_test21() - Error: %s Expression: %s [2]\n",
10540 parser.error().c_str(),
10541 expression_list[i].c_str());
10542
10543 error_found = true;
10544 continue;
10545 }
10546 else if (!parser.dec().return_present())
10547 {
10548 printf("run_test21() - Expected a return statement Expression: %s [2]\n",
10549 expression_list[i].c_str());
10550
10551 error_found = true;
10552 continue;
10553 }
10554
10555 expression.value();
10556
10557 std::string pattern = results_to_string<T>(expression.results());
10558
10559 if (!expression.return_invoked())
10560 {
10561 printf("run_test21() - Invalid return invoke state [2] Expression: %s\n",
10562 expression_list[i].c_str());
10563
10564 error_found = true;
10565 continue;
10566 }
10567 else if (result_list[i] != pattern)
10568 {
10569 printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
10570 result_list[i].c_str(),
10571 pattern.c_str(),
10572 expression_list[i].c_str());
10573
10574 error_found = true;
10575 continue;
10576 }
10577 else if (!result_equal(expression.results(), x + T(1)))
10578 {
10579 printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
10580 result_list[i].c_str(),
10581 pattern.c_str(),
10582 expression_list[i].c_str());
10583
10584 error_found = true;
10585 continue;
10586 }
10587 }
10588
10589 if (error_found)
10590 {
10591 return false;
10592 }
10593 }
10594
10595 {
10596 T x = 1.0;
10597 T y = 2.0;
10598 T z = 3.0;
10599
10600 T v[] = {0 , 1, 2, 3 };
10601 std::string s = "Hello ";
10602
10603 myfunc<T> mf;
10604
10605 symbol_table_t symbol_table;
10606 expression_t expression;
10607 parser_t parser;
10608
10609 symbol_table.add_variable ("x", x);
10610 symbol_table.add_variable ("y", y);
10611 symbol_table.add_variable ("z", z);
10612 symbol_table.add_vector ("v", v);
10613 symbol_table.add_stringvar("s", s);
10614
10615 expression.register_symbol_table(symbol_table);
10616
10617 const std::string expression_str =
10618 " if (x > y) "
10619 " return [1]; "
10620 " else "
10621 " return [ x, x + y, 2 * v, s + 'world' ]; ";
10622
10623 if (!parser.compile(expression_str, expression))
10624 {
10625 printf("run_test21() - ERROR: %s\tExpression: %s\n",
10626 parser.error().c_str(),
10627 expression_str.c_str());
10628 return false;
10629 }
10630
10631 expression.value();
10632
10633 typedef exprtk::results_context<T> results_context_t;
10634 const results_context_t& results = expression.results();
10635
10636 if (results.count() != 4)
10637 {
10638 printf("run_test21() - ERROR Expected 4 return results, instead got: %d\n",
10639 static_cast<unsigned int>(results.count()));
10640 return false;
10641 }
10642
10643 T result_x0;
10644 T result_x1;
10645 std::string result_s;
10646 std::vector<T> result_v;
10647
10648 const T expected_result_v[] = {0 , 2, 4, 6 };
10649 const std::string expected_result_s = "Hello world";
10650
10651 if (!results.get_scalar(0,result_x0))
10652 {
10653 printf("run_test21() - ERROR Failed to get scalar index0 from return result!\n");
10654 return false;
10655 }
10656 else if (result_x0 != T(1))
10657 {
10658 printf("run_test21() - ERROR result_x0 is not expected value!\n");
10659 return false;
10660 }
10661 else if (!results.get_scalar(1,result_x1))
10662 {
10663 printf("run_test21() - ERROR Failed to get scalar index1 from return result!\n");
10664 return false;
10665 }
10666 else if (result_x1 != T(3))
10667 {
10668 printf("run_test21() - ERROR result_x1 is not expected value!\n");
10669 return false;
10670 }
10671 else if (!results.get_vector(2,result_v))
10672 {
10673 printf("run_test21() - ERROR Failed to get vector from return result!\n");
10674 return false;
10675 }
10676 else if (
10677 (result_v.size() != (sizeof(expected_result_v) / sizeof(T))) ||
10678 !std::equal(result_v.begin(),result_v.end(),expected_result_v)
10679 )
10680 {
10681 printf("run_test21() - ERROR result_v is not expected value!\n");
10682 return false;
10683 }
10684 else if (!results.get_string(3,result_s))
10685 {
10686 printf("run_test21() - ERROR Failed to get string from return result!\n");
10687 return false;
10688 }
10689 else if (result_s != expected_result_s)
10690 {
10691 printf("run_test21() - ERROR result_s is not expected value!\n");
10692 return false;
10693 }
10694 }
10695
10696 {
10697 const std::string invalid_expressions[] =
10698 {
10699 "x := 1",
10700 "x += 1",
10701 "v := 1 + v",
10702 "v += 1",
10703 "v += x + 1",
10704 "v += v",
10705 "v[0] += x",
10706 "v[1] += x",
10707 "v[2] += x",
10708 "v[3] += x",
10709 "v[4] += x",
10710 "var i := 2; v[i] := x",
10711 "var i := 2; v[i] += x",
10712 "s := 'abc' + s",
10713 "s[0:2] := 'abc'",
10714 "s[1:3] := 'abc'",
10715 "aa[4:4] := bb",
10716 "aa[1:3] := bb",
10717 "var i := 2; aa[i:3] := bb",
10718 "var i := 2; aa[i+1:3] := bb",
10719 "var i := 2; aa[0:i] := bb",
10720 "var i := 2; aa[0:i+1] := bb",
10721 "var i := 1; var j := 3; aa[i:j] := bb",
10722 "var i := 1; var j := 3; aa[i+1:j] := bb",
10723 "var i := 1; var j := 3; aa[i:j+1] := bb",
10724 "var i := 1; var j := 3; aa[i+1:j+1] := bb",
10725 };
10726
10727 const std::size_t invalid_expressions_size = sizeof(invalid_expressions) / sizeof(std::string);
10728
10729 for (std::size_t i = 0; i < invalid_expressions_size; ++i)
10730 {
10731 symbol_table_t mutable_symbol_table;
10732 symbol_table_t immutable_symbol_table(symbol_table_t::e_immutable);
10733
10734 T x = 0.0;
10735 T v[5];
10736 std::string s = "xyz";
10737 std::string aa = "0123456789";
10738 std::string bb = "A";
10739
10740 T x_ = 0.0;
10741 T v_[5];
10742 std::string s_ = "xyz";
10743
10744 std::string a_ = "0123456789";
10745 std::string b_ = "A";
10746
10747 immutable_symbol_table.add_variable ("x" , x );
10748 immutable_symbol_table.add_vector ("v" , v );
10749 immutable_symbol_table.add_stringvar("s" , s );
10750 immutable_symbol_table.add_stringvar("aa", aa);
10751 immutable_symbol_table.add_stringvar("bb", bb);
10752
10753 mutable_symbol_table.add_variable ("x_", x_);
10754 mutable_symbol_table.add_vector ("v_", v_);
10755 mutable_symbol_table.add_stringvar ("s_", s_);
10756 mutable_symbol_table.add_stringvar ("a_", a_);
10757 mutable_symbol_table.add_stringvar ("b_", b_);
10758
10759 const std::string& expression_str = invalid_expressions[i];
10760 expression_t expression;
10761 expression.register_symbol_table(immutable_symbol_table);
10762 expression.register_symbol_table(mutable_symbol_table );
10763
10764 parser_t parser;
10765 const bool compile_result = parser.compile(expression_str, expression);
10766
10767 if (compile_result)
10768 {
10769 expression.value();
10770 printf("run_test21() - Invalid expression due to immutability was successfully compiled. Expression: %s\n",
10771 expression_str.c_str());
10772 }
10773 }
10774 }
10775
10776 {
10777 T x = 1.1;
10778 T y = 2.2;
10779 T z = 3.3;
10780 T w = 4.4;
10781
10782 symbol_table_t mutable_symbol_table;
10783 symbol_table_t immutable_symbol_table(symbol_table_t::e_immutable);
10784
10785 mutable_symbol_table.add_variable("x", x);
10786 mutable_symbol_table.add_variable("y", y);
10787
10788 immutable_symbol_table.add_variable("w", w);
10789 immutable_symbol_table.add_variable("z", z);
10790
10791 expression_t expression;
10792 expression.register_symbol_table(mutable_symbol_table );
10793 expression.register_symbol_table(immutable_symbol_table);
10794
10795 parser_t parser;
10796
10797 typedef std::pair<std::string,bool> local_test_t;
10798
10799 const local_test_t expressions[] =
10800 {
10801 std::make_pair<std::string,bool>("x := y + (z / w)" , true ),
10802 std::make_pair<std::string,bool>("y := y / x + (z / w)" , true ),
10803 std::make_pair<std::string,bool>("z := y + x - w" , false),
10804 std::make_pair<std::string,bool>("z == (w += y / x)" , false)
10805 };
10806
10807 const std::size_t expressions_size = sizeof(expressions) / sizeof(local_test_t);
10808
10809 bool error_found = false;
10810
10811 for (std::size_t i = 0; i < expressions_size; ++i)
10812 {
10813 const std::string expression_str = expressions[i].first;
10814 const bool expected_compile_result = expressions[i].second;
10815
10816 if (expected_compile_result != parser.compile(expression_str, expression))
10817 {
10818 printf("run_test21() - Invalid compilation of expression. Expected compile result: %c Expression: %s\n",
10819 expected_compile_result ? 'T' : 'F',
10820 expression_str.c_str());
10821
10822 error_found = true;
10823 }
10824
10825 x += 1.1;
10826 y += 2.2;
10827 z += 3.3;
10828 w += 4.4;
10829
10830 expression.value();
10831 }
10832
10833 if (error_found)
10834 {
10835 return false;
10836 }
10837 }
10838
10839 {
10840 typedef typename parser_t::settings_store settings_t;
10841
10842 const std::string invalid_expressions[] =
10843 {
10844 "var result := 0; if (true) { result := 2 } if (true) { result := 3 }; result",
10845 "var result := 0; if (true) { result := 2 }; if (true) { result := 3 } result",
10846 "var result := 0; if (true) { result := 2 } if (true) { result := 3 } result",
10847 "var result := 0; var x:=1; if (x > 0) { result := 2 } else if (x > 0) { result := 3 } result",
10848 "var result := 0; var x := 1; if (x > 0) { result := 2 } if (x > 0) { result := 3 }; result",
10849 "var result := 0; var x := 1; if (x > 0) { result := 2 }; if (x > 0) { result := 3 } result",
10850 "var result := 0; var x := 1; if (x > 0) { result := 2 } if (x > 0) { result := 3 } result",
10851 "var result := 0; var x := 1; if (x > 0) { result := 2 } else if (x > 0) { result := 3 } result",
10852 "var result := 0; var x := 1; if (x > 0) result := 2 else if (x > 0) { result := 3 } result",
10853 "var result := 0; var x := 1; if (x > 0) {result := 2 } else if (x > 0) result := 3 result",
10854 "var x := 2; var y := 0; x y ",
10855 "var x := 2; x var y := 0; ",
10856 "var x := 2; var y := 0; while (y < 3) { x := x * x; y += 1; } x ",
10857 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } x ",
10858 "var x := 2; var y := 0; while (y < 3) { x := x * x; y += 1; } 1 ",
10859 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } 1 ",
10860 "var x := 2; var y := 0; x while (y < 3) { x := x * x; y += 1; } ",
10861 "var x := 2; var y := 0; x for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } ",
10862 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } (1 + x)",
10863 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } (x + 1)",
10864 "var x := 2; var y := 0; (1 + x) for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; }",
10865 "var x := 2; var y := 0; (x + 1) for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; }",
10866 "var x := 2; var y := 0; (x + y) for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; }",
10867 "'hello' 1",
10868 "1 'hello'",
10869 "'hel' + 'lo' 1",
10870 "1 'hel' + 'lo'",
10871 "1 2",
10872 "a b",
10873 "a b c",
10874 "var x := 2; 1 2 ",
10875 "var x := 2; 1 x ",
10876 "var x := 2; x 1 ",
10877 "var x := 2; a 1 ",
10878 "var x := 2; x a ",
10879 "var x := 2; x a b ",
10880 "var x := 2; x a b c ",
10881 "var x := 2; a x ",
10882 "var x := 2; a x b ",
10883 "var x := 2; a x b c ",
10884 "var x := 2; 'hello' 1",
10885 "var x := 2; 1 'hello'",
10886 "var x := 2; 'hello' x",
10887 "var x := 2; x 'hello'",
10888 "var x := 2; (x 1) ",
10889 "var x := 2; (1 x) ",
10890 "var x := 2; 2 + (x 1) ",
10891 "var x := 2; 2 + (1 x) ",
10892 "var x := 2; x + (x 1) ",
10893 "var x := 2; x + (1 x) ",
10894 "var x := 2; (x 1) + 2 ",
10895 "var x := 2; (1 x) + 2 ",
10896 "var x := 2; (x 1) + x ",
10897 "var x := 2; (1 x) + x ",
10898 "var x := 2; var y := 3; (x y) ",
10899 "var x := 2; var y := 3; (y x) ",
10900 "var x := 2; var y := 3; 2 + (x y) ",
10901 "var x := 2; var y := 3; 2 + (y x) ",
10902 "var x := 2; var y := 3; x + (x y) ",
10903 "var x := 2; var y := 3; x + (y x) ",
10904 "var x := 2; var y := 3; (x y) + 2 ",
10905 "var x := 2; var y := 3; (y x) + 2 ",
10906 "var x := 2; var y := 3; (x y) + x ",
10907 "var x := 2; var y := 3; (y x) + x ",
10908 "var x := 2; 2 + x 1 ",
10909 "var x := 2; 2 + 1 x ",
10910 "var x := 2; x + x 1 ",
10911 "var x := 2; x + 1 x ",
10912 "var x := 2; var y := 3; 2 + x y ",
10913 "var x := 2; var y := 3; 2 + y x ",
10914 "var x := 2; var y := 3; x + x y ",
10915 "var x := 2; var y := 3; x + y x ",
10916 "~{1; 2; 3} 1 ",
10917 "1 ~{1; 2; 3} ",
10918 "var x := 2; x ~{x; 1; 2} ",
10919 "var x := 2; 1 ~{x; 1; 2} ",
10920 "var x := 2; ~{x; 1; 2} x ",
10921 "var x := 2; ~{x; 1; 2} 1 ",
10922 "~(1; 2; 3) 1 ",
10923 "1 ~(1; 2; 3) ",
10924 "var x := 2; x ~(x; 1; 2) ",
10925 "var x := 2; 1 ~(x; 1; 2) ",
10926 "var x := 2; ~(x; 1; 2) x ",
10927 "var x := 2; ~(x; 1; 2) 1 ",
10928 "var x := 2; (x + 1) ~{x; 1; 2} ",
10929 "var x := 2; (1 + x) ~{x; 1; 2} ",
10930 "var x := 2; ~{x; 1; 2} (x + 1) ",
10931 "var x := 2; ~{x; 1; 2} (1 + x) ",
10932 "var x := 2; x + 1 ~{x; 1; 2} ",
10933 "var x := 2; 1 + x ~{x; 1; 2} ",
10934 "var x := 2; ~{x; 1; 2} x + 1 ",
10935 "var x := 2; ~{x; 1; 2} 1 + x ",
10936 "~(1, 2, 3) 1 ",
10937 "1 ~(1, 2, 3) ",
10938 "var x := 2; x ~(x, 1, 2) ",
10939 "var x := 2; 1 ~(x, 1, 2) ",
10940 "var x := 2; ~(x, 1, 2) x ",
10941 "var x := 2; ~(x, 1, 2) 1 ",
10942 "var x := 2; 1 switch { case x > 1 : 1; case x < 3 : 2; default : 3; } ",
10943 "var x := 2; x switch { case x > 1 : 1; case x < 3 : 2; default : 3; } ",
10944 "var x := 2; switch { case x > 1 : 1; case x < 3 : 2; default : 3; } x ",
10945 "var x := 2; 1 [*] { case x > 1 : 1; case x < 3 : 2; } ",
10946 "var x := 2; x [*] { case x > 1 : 1; case x < 3 : 2; } ",
10947 "var x := 2; [*] { case x > 1 : 1; case x < 3 : 2; } x ",
10948 "var x := 2; (x + 1) switch { case x > 1 : 1; case x < 3 : 2; default : 3; } ",
10949 "var x := 2; switch { case x > 1 : 1; case x < 3 : 2; default : 3; } (x + 1) ",
10950 "var x := 2; (x + 1) [*] { case x > 1 : 1; case x < 3 : 2; } ",
10951 "var x := 2; [*] { case x > 1 : 1; case x < 3 : 2; } (x + 1) ",
10952 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] 1; } ",
10953 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 return [i]; } ",
10954 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] i; } ",
10955 "var x := 2; for (var i := 0; i < 2; i += 1) { i return [i]; } ",
10956 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] 1 + i; } ",
10957 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 + i return [i]; } ",
10958 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] i + 1; } ",
10959 "var x := 2; for (var i := 0; i < 2; i += 1) { i + 1 return [i]; } ",
10960 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 if (i > 3) return [i]; } ",
10961 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] 1; } ",
10962 "var x := 2; for (var i := 0; i < 2; i += 1) { x if (i > 3) return [i]; } ",
10963 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] x; } ",
10964 "var x := 2; for (var i := 0; i < 2; i += 1) { x + 1 if (i > 3) return [i]; }",
10965 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] x + 1; }",
10966 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 + x if (i > 3) return [i]; }",
10967 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] 1 + x; }",
10968 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 for (var j := 0; j < 2; j += 1){} } ",
10969 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} 1 } ",
10970 "var x := 2; for (var i := 0; i < 2; i += 1) { x for (var j := 0; j < 2; j += 1){} } ",
10971 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} x } ",
10972 "var x := 2; for (var i := 0; i < 2; i += 1) { x + 1 for (var j := 0; j < 2; j += 1){} } ",
10973 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} x + 1 } ",
10974 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 + x for (var j := 0; j < 2; j += 1){} } ",
10975 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} 1 + x } "
10976 };
10977
10978 const std::size_t expressions_size = sizeof(invalid_expressions) / sizeof(std::string);
10979
10980 static const std::size_t compile_options =
10981 settings_t::e_replacer +
10982 settings_t::e_joiner +
10983 settings_t::e_numeric_check +
10984 settings_t::e_bracket_check +
10985 settings_t::e_sequence_check +
10986 settings_t::e_strength_reduction;
10987
10988 const settings_t settings(compile_options);
10989 parser_t parser(settings);
10990
10991 T a = T(2222);
10992 T b = T(3333);
10993 T c = T(4444);
10994
10995 symbol_table_t symbol_table;
10996 symbol_table.add_variable("a", a);
10997 symbol_table.add_variable("b", b);
10998 symbol_table.add_variable("c", c);
10999
11000 bool error_found = false;
11001
11002 for (std::size_t e = 0; e < expressions_size; ++e)
11003 {
11004 const std::string& expression_string = invalid_expressions[e];
11005
11006 expression_t expression;
11007 expression.register_symbol_table(symbol_table);
11008
11009 if (parser.compile(expression_string,expression))
11010 {
11011 printf("run_test21() - Expected compilation error for expression: %s\n",
11012 expression_string.c_str());
11013 error_found = true;
11014 continue;
11015 }
11016
11017 expression.value();
11018 }
11019
11020 if (error_found)
11021 {
11022 return false;
11023 }
11024 }
11025
11026 {
11027 const std::string expressions[] =
11028 {
11029 // conditional_vector_node
11030 "var x := 2; sum(if (x > 1) { vv8 } else { vv7 }) == sum(vv8)",
11031 "var x := 2; sum(if (x > 1) { vv8 + 1 } else { vv8 + 2 }) == sum(vv8 + 1)",
11032
11033 // unary_vector_node
11034 "var v[8] := {1,1,1,1,1,1,1,1}; vv8 += 1; sgn(vv8) == v",
11035 "abs(-1 * vv8) == vv8",
11036 "abs(vv8 * -1) == vv8",
11037 "var x := -1; abs(x * vv8) == vv8",
11038 "var x := -1; abs(vv8 * x) == vv8",
11039 "var x := 1; abs(-x * vv8) == vv8",
11040 "var x := 1; abs(vv8 * -x) == vv8",
11041 "var x := -2; abs(x * vv8) == 2vv8",
11042 "var x := -2; abs(vv8 * x) == 2vv8",
11043 "var x := 2; abs(-x * vv8) == 2vv8",
11044 "var x := 2; abs(vv8 * -x) == 2vv8",
11045 "var x := -2; abs(x * vv8) == -x * vv8",
11046 "var x := -2; abs(vv8 * x) == -x * vv8",
11047 "var x := 2; abs(-x * vv8) == x * vv8",
11048 "var x := 2; abs(vv8 * -x) == x * vv8",
11049 "var x := -2; abs(x * vv8) == vv8 * -x",
11050 "var x := -2; abs(vv8 * x) == vv8 * -x",
11051 "var x := 2; abs(-x * vv8) == vv8 * x",
11052 "var x := 2; abs(vv8 * -x) == vv8 * x",
11053 "var x := -2; abs(x * vv8) == abs(x) * vv8",
11054 "var x := -2; abs(vv8 * x) == abs(x) * vv8",
11055 "var x := -2; abs(x * vv8) == vv8 * abs(x)",
11056 "var x := -2; abs(vv8 * x) == vv8 * abs(x)",
11057
11058 // vec_binop_vecval_node and vec_binop_valvec_node
11059 "var v[8] := {1,2,3,4,5,6,7,8}; var x := 1; (vv8 + x) == v",
11060 "var v[7] := {1,2,3,4,5,6,7}; var x := 1; (vv8 + x) == v",
11061 "var v[6] := {1,2,3,4,5,6}; var x := 1; (vv8 + x) == v",
11062 "var v[5] := {1,2,3,4,5}; var x := 1; (vv8 + x) == v",
11063 "var v[4] := {1,2,3,4}; var x := 1; (vv8 + x) == v",
11064 "var v[3] := {1,2,3}; var x := 1; (vv8 + x) == v",
11065 "var v[2] := {1,2}; var x := 1; (vv8 + x) == v",
11066 "var v[1] := {1}; var x := 1; (vv8 + x) == v",
11067 "var v[8] := {1,2,3,4,5,6,7,8}; var x := 1; (x + vv8) == v",
11068 "var v[7] := {1,2,3,4,5,6,7}; var x := 1; (x + vv8) == v",
11069 "var v[6] := {1,2,3,4,5,6}; var x := 1; (x + vv8) == v",
11070 "var v[5] := {1,2,3,4,5}; var x := 1; (x + vv8) == v",
11071 "var v[4] := {1,2,3,4}; var x := 1; (x + vv8) == v",
11072 "var v[3] := {1,2,3}; var x := 1; (x + vv8) == v",
11073 "var v[2] := {1,2}; var x := 1; (x + vv8) == v",
11074 "var v[1] := {1}; var x := 1; (x + vv8) == v",
11075
11076 // vec_binop_vecvec_node
11077 "var v[8] := [-1]; v < vv8",
11078 "var v[7] := [-1]; v < vv8",
11079 "var v[3] := [-1]; v < vv8",
11080 "var v[2] := [-1]; v < vv8",
11081 "var v[1] := [-1]; v < vv8",
11082
11083 // assignment_vecvec_op_node
11084 "var vv8sum := sum(vv8); vv8 += (vv8 + 1); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1)",
11085 "var vv8sum := sum(vv8); vv8 += (vv8 - 1); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1)",
11086 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + x); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1)",
11087 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 - x); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1)",
11088 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 + x)); sum(vv8) == (3 * sum(vv8sum) + vv8[] * 1)",
11089 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 - x)); sum(vv8) == (3 * sum(vv8sum) - vv8[] * 1)",
11090 "var vv8sum := sum(vv8); vv8 += (vv8 += 1); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * 1))",
11091 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 += x); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * x))",
11092 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 -= x); sum(vv8) == (2 * vv8sum - 2 * (vv8[] * x))",
11093 "var vv8sum := sum(vv8); vv8 += (vv8 + 1); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1);",
11094 "var vv8sum := sum(vv8); vv8 += (vv8 - 1); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1);",
11095 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + x); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1);",
11096 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 - x); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1);",
11097 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 + x)); sum(vv8) == (3 * sum(vv8sum) + vv8[] * 1);",
11098 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 - x)); sum(vv8) == (3 * sum(vv8sum) - vv8[] * 1);",
11099 "var vv8sum := sum(vv8); vv8 += (vv8 += 1); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * 1));",
11100 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 += x); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * x));",
11101 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 -= x); sum(vv8) == (2 * vv8sum - 2 * (vv8[] * x));",
11102 "var vv3sum := sum(vv3); vv3 += (vv3 + 1); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1)",
11103 "var vv3sum := sum(vv3); vv3 += (vv3 - 1); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1)",
11104 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + x); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1)",
11105 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 - x); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1)",
11106 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 + x)); sum(vv3) == (3 * sum(vv3sum) + vv3[] * 1)",
11107 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 - x)); sum(vv3) == (3 * sum(vv3sum) - vv3[] * 1)",
11108 "var vv3sum := sum(vv3); vv3 += (vv3 += 1); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * 1))",
11109 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 += x); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * x))",
11110 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 -= x); sum(vv3) == (2 * vv3sum - 2 * (vv3[] * x))",
11111 "var vv3sum := sum(vv3); vv3 += (vv3 + 1); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1);",
11112 "var vv3sum := sum(vv3); vv3 += (vv3 - 1); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1);",
11113 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + x); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1);",
11114 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 - x); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1);",
11115 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 + x)); sum(vv3) == (3 * sum(vv3sum) + vv3[] * 1);",
11116 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 - x)); sum(vv3) == (3 * sum(vv3sum) - vv3[] * 1);",
11117 "var vv3sum := sum(vv3); vv3 += (vv3 += 1); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * 1));",
11118 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 += x); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * x));",
11119 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 -= x); sum(vv3) == (2 * vv3sum - 2 * (vv3[] * x));",
11120
11121 // assignment_vec_op_node
11122 "var vv8sum := sum(vv8); vv8 += 1; sum(vv8) == (vv8sum + vv8[] * 1)",
11123 "var vv7sum := sum(vv7); vv7 += 1; sum(vv7) == (vv7sum + vv7[] * 1)",
11124 "var vv6sum := sum(vv6); vv6 += 1; sum(vv6) == (vv6sum + vv6[] * 1)",
11125 "var vv5sum := sum(vv5); vv5 += 1; sum(vv5) == (vv5sum + vv5[] * 1)",
11126 "var vv4sum := sum(vv4); vv4 += 1; sum(vv4) == (vv4sum + vv4[] * 1)",
11127 "var vv3sum := sum(vv3); vv3 += 1; sum(vv3) == (vv3sum + vv3[] * 1)",
11128 "var vv2sum := sum(vv2); vv2 += 1; sum(vv2) == (vv2sum + vv2[] * 1)",
11129 "var vv1sum := sum(vv1); vv1 += 1; sum(vv1) == (vv1sum + vv1[] * 1)",
11130 "var vv8sum := sum(vv8); var x := 7; vv8 += (x - 1) / 2; sum(vv8) == (vv8sum + vv8[] * 3)",
11131 "var vv7sum := sum(vv7); var x := 7; vv7 += (x - 1) / 2; sum(vv7) == (vv7sum + vv7[] * 3)",
11132 "var vv6sum := sum(vv6); var x := 7; vv6 += (x - 1) / 2; sum(vv6) == (vv6sum + vv6[] * 3)",
11133 "var vv5sum := sum(vv5); var x := 7; vv5 += (x - 1) / 2; sum(vv5) == (vv5sum + vv5[] * 3)",
11134 "var vv4sum := sum(vv4); var x := 7; vv4 += (x - 1) / 2; sum(vv4) == (vv4sum + vv4[] * 3)",
11135 "var vv3sum := sum(vv3); var x := 7; vv3 += (x - 1) / 2; sum(vv3) == (vv3sum + vv3[] * 3)",
11136 "var vv2sum := sum(vv2); var x := 7; vv2 += (x - 1) / 2; sum(vv2) == (vv2sum + vv2[] * 3)",
11137 "var vv1sum := sum(vv1); var x := 7; vv1 += (x - 1) / 2; sum(vv1) == (vv1sum + vv1[] * 3)",
11138
11139 // assignment_vecvec_node
11140 "var v[8] := [-1]; vv8 := v; sum(vv8) == (-1 * 8 + 0)",
11141 "var v[7] := [-1]; vv8 := v; sum(vv8) == (-1 * 7 + (7))",
11142 "var v[6] := [-1]; vv8 := v; sum(vv8) == (-1 * 6 + (6+7))",
11143 "var v[5] := [-1]; vv8 := v; sum(vv8) == (-1 * 5 + (5+6+7))",
11144 "var v[4] := [-1]; vv8 := v; sum(vv8) == (-1 * 4 + (4+5+6+7))",
11145 "var v[3] := [-1]; vv8 := v; sum(vv8) == (-1 * 3 + (3+4+5+6+7))",
11146 "var v[2] := [-1]; vv8 := v; sum(vv8) == (-1 * 2 + (2+3+4+5+6+7))",
11147 "var v[1] := [-1]; vv8 := v; sum(vv8) == (-1 * 1 + (1+2+3+4+5+6+7))",
11148 "var v[8] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, -1 }; x == vv8",
11149 "var v[7] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, 7 }; x == vv8",
11150 "var v[6] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, 6, 7 }; x == vv8",
11151 "var v[5] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, 5, 6, 7 }; x == vv8",
11152 "var v[4] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, 4, 5, 6, 7 }; x == vv8",
11153 "var v[3] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, 3, 4, 5, 6, 7 }; x == vv8",
11154 "var v[2] := [-1]; vv8 := v; var x[8] := { -1, -1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11155 "var v[1] := [-1]; vv8 := v; var x[8] := { -1, 1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11156 "var v[3] := [-1]; vv3 := v; sum(vv3) == (-1 * 3 + (0))",
11157 "var v[2] := [-1]; vv3 := v; sum(vv3) == (-1 * 2 + (2))",
11158 "var v[1] := [-1]; vv3 := v; sum(vv3) == (-1 * 1 + (1+2))",
11159 "var v[3] := [-1]; vv3 := v; var x[3] := { -1, -1, -1}; x == vv3",
11160 "var v[2] := [-1]; vv3 := v; var x[3] := { -1, -1, 2}; x == vv3",
11161 "var v[1] := [-1]; vv3 := v; var x[3] := { -1, 1, 2}; x == vv3",
11162 "vv8 := vv7; sum(vv8) == (sum(vv7) + 7)",
11163 "vv8 := vv6; sum(vv8) == (sum(vv6) + 6+ 7)",
11164 "vv8 := vv5; sum(vv8) == (sum(vv5) + 5 + 6 + 7)",
11165 "vv8 := vv4; sum(vv8) == (sum(vv4) + 4 + 5 + 6 + 7)",
11166 "vv8 := vv3; sum(vv8) == (sum(vv3) + 3 + 4 + 5 + 6 + 7)",
11167 "vv8 := vv2; sum(vv8) == (sum(vv2) + 2 + 3 + 4 + 5 + 6 + 7)",
11168 "vv8 := vv1; sum(vv8) == (sum(vv1) + 1 + 2 + 3 + 4 + 5 + 6 + 7)",
11169 "vv8 := vv7 + vv7; sum(vv8) == (2 * sum(vv7) + 7)",
11170 "vv8 := vv6 + vv6; sum(vv8) == (2 * sum(vv6) + 6+ 7)",
11171 "vv8 := vv5 + vv5; sum(vv8) == (2 * sum(vv5) + 5 + 6 + 7)",
11172 "vv8 := vv4 + vv4; sum(vv8) == (2 * sum(vv4) + 4 + 5 + 6 + 7)",
11173 "vv8 := vv3 + vv3; sum(vv8) == (2 * sum(vv3) + 3 + 4 + 5 + 6 + 7)",
11174 "vv8 := vv2 + vv2; sum(vv8) == (2 * sum(vv2) + 2 + 3 + 4 + 5 + 6 + 7)",
11175 "vv8 := vv1 + vv1; sum(vv8) == (2 * sum(vv1) + 1 + 2 + 3 + 4 + 5 + 6 + 7)",
11176
11177 // assignment_vec_node
11178 "var x := 3; vv8 := 2*x+1; sum(vv8) == (vv8[] * 7)",
11179 "var x := 3; vv7 := 2*x+1; sum(vv7) == (vv7[] * 7)",
11180 "var x := 3; vv6 := 2*x+1; sum(vv6) == (vv6[] * 7)",
11181 "var x := 3; vv5 := 2*x+1; sum(vv5) == (vv5[] * 7)",
11182 "var x := 3; vv4 := 2*x+1; sum(vv4) == (vv4[] * 7)",
11183 "var x := 3; vv3 := 2*x+1; sum(vv3) == (vv3[] * 7)",
11184 "var x := 3; vv2 := 2*x+1; sum(vv2) == (vv2[] * 7)",
11185 "var x := 3; vv1 := 2*x+1; sum(vv1) == (vv1[] * 7)",
11186 "var x[3] := [3]; vv8 := 2x[0]+1; sum(vv8) == (vv8[] * 7)",
11187 "var x[3] := [3]; vv7 := 2x[1]+1; sum(vv7) == (vv7[] * 7)",
11188 "var x[3] := [3]; vv6 := 2x[2]+1; sum(vv6) == (vv6[] * 7)",
11189 "var x[3] := [3]; vv5 := 2x[0]+1; sum(vv5) == (vv5[] * 7)",
11190 "var x[3] := [3]; vv4 := 2x[1]+1; sum(vv4) == (vv4[] * 7)",
11191 "var x[3] := [3]; vv3 := 2x[2]+1; sum(vv3) == (vv3[] * 7)",
11192 "var x[3] := [3]; vv2 := 2x[0]+1; sum(vv2) == (vv2[] * 7)",
11193 "var x[3] := [3]; vv1 := 2x[1]+1; sum(vv1) == (vv1[] * 7)",
11194 "var x[3] := [3]; var y[3] := [1]; vv8 := 2x[0]+y[0]; sum(vv8) == (vv8[] * 7)",
11195 "var x[3] := [3]; var y[3] := [1]; vv7 := 2x[1]+y[1]; sum(vv7) == (vv7[] * 7)",
11196 "var x[3] := [3]; var y[3] := [1]; vv6 := 2x[2]+y[2]; sum(vv6) == (vv6[] * 7)",
11197 "var x[3] := [3]; var y[3] := [1]; vv5 := 2x[0]+y[0]; sum(vv5) == (vv5[] * 7)",
11198 "var x[3] := [3]; var y[3] := [1]; vv4 := 2x[1]+y[1]; sum(vv4) == (vv4[] * 7)",
11199 "var x[3] := [3]; var y[3] := [1]; vv3 := 2x[2]+y[2]; sum(vv3) == (vv3[] * 7)",
11200 "var x[3] := [3]; var y[3] := [1]; vv2 := 2x[0]+y[0]; sum(vv2) == (vv2[] * 7)",
11201 "var x[3] := [3]; var y[3] := [1]; vv1 := 2x[1]+y[1]; sum(vv1) == (vv1[] * 7)",
11202
11203 // swap vec vec node
11204 "var v[8] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 8 + 0)",
11205 "var v[7] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 7 + (7))",
11206 "var v[6] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 6 + (6+7))",
11207 "var v[5] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 5 + (5+6+7))",
11208 "var v[4] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 4 + (4+5+6+7))",
11209 "var v[3] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 3 + (3+4+5+6+7))",
11210 "var v[2] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 2 + (2+3+4+5+6+7))",
11211 "var v[1] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 1 + (1+2+3+4+5+6+7))",
11212 "var v[8] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, -1 }; x == vv8",
11213 "var v[7] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, 7 }; x == vv8",
11214 "var v[6] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, 6, 7 }; x == vv8",
11215 "var v[5] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, 5, 6, 7 }; x == vv8",
11216 "var v[4] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, 4, 5, 6, 7 }; x == vv8",
11217 "var v[3] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, 3, 4, 5, 6, 7 }; x == vv8",
11218 "var v[2] := [-1]; vv8 <=> v; var x[8] := { -1, -1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11219 "var v[1] := [-1]; vv8 <=> v; var x[8] := { -1, 1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11220 "var v[3] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 3 + (0))",
11221 "var v[2] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 2 + (2))",
11222 "var v[1] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 1 + (1+2))",
11223 "var v[3] := [-1]; vv3 <=> v; var x[3] := { -1, -1, -1}; x == vv3",
11224 "var v[2] := [-1]; vv3 <=> v; var x[3] := { -1, -1, 2}; x == vv3",
11225 "var v[1] := [-1]; vv3 <=> v; var x[3] := { -1, 1, 2}; x == vv3",
11226
11227 // rebasevector_elem_node
11228 "vv8[0] == 0",
11229 "vv8[2 - 2] == 0",
11230 "vv8[vv8[] - 1] == vv8[] - 1",
11231 "var vec_sum := 0; for (var i := 0; i < vv8[]; i +=1) { vec_sum += vv8[i]; }; vec_sum == (vv8[] - 1) * vv8[] / 2",
11232 "var vec_sum := 0; for (var i := 0; i < vv8[]; i +=1) { vec_sum += vv8[2i / 2]; }; vec_sum == (vv8[] - 1) * vv8[] / 2",
11233 "var x:= 1; var y:= 1; (vv8 + x)[y / x] == 2",
11234 "var x:= 1; var y:= 1; (vv8 + x - y)[y / x] == 1",
11235 "var x:= 1; (x + vv8)[1] == 2",
11236 "var x:= 1; var y:= 1; (x + vv8)[y / x] == 2",
11237 "var x:= 1; var y:= 1; (x + vv8 - y)[y / x] == 1",
11238 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + 1)[i] == i + 1; }; successes == vv8[]",
11239 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i] == i + x; }; successes == vv8[]",
11240 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i] == i + x; }; successes == vv8[]",
11241 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i / x] == i + x; }; successes == vv8[]",
11242 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i / x] == i + x; }; successes == vv8[]",
11243 "(1 + vv8)[1] == 2",
11244 "(vv8 + 1)[1] == 2",
11245 "(vv8 + 1)[2 / 2] == 2",
11246 "(1 + vv8)[2 / 2] == 2",
11247 "var x:= 1; (x + vv8)[1] == 2",
11248 "var x:= 1; (vv8 + x)[1] == 2",
11249 "var x:= 1; var y:= 1; (x + vv8)[y] == 2",
11250 "var x:= 1; var y:= 1; (vv8 + x)[y] == 2",
11251 "var x:= 1; var y:= 1; (vv8 + x)[y / x] == 2",
11252 "var x:= 1; var y:= 1; (vv8 + x - y)[y / x] == 1",
11253 "var x:= 1; var y:= 1; (x + vv8)[y / x] == 2",
11254 "var x:= 1; var y:= 1; (x + vv8 - y)[y / x] == 1",
11255 "(abs(vv8 + 1))[1] == 2",
11256 "(abs(1 + vv8))[1] == 2",
11257 "(abs(vv8 + 1))[2 / 2] == 2",
11258 "(abs(1 + vv8))[2 / 2] == 2",
11259 "(abs(vv8 + 1)/2)[1] == 1",
11260 "(abs(1 + vv8)/2)[1] == 1",
11261 "(abs(vv8 + 1)/2)[2 / 2] == 1",
11262 "(abs(1 + vv8)/2)[2 / 2] == 1",
11263 "(abs(abs(vv8 + 1)) - 1)[1] == 1",
11264 "(abs(2 * abs(vv8 + 1)) - 1)[1] == 3",
11265 "(abs(abs(vv8 + 1) * 2) - 1)[1] == 3",
11266 "(abs(2abs(vv8 + 1)) - 1)[1] == 3",
11267 "(abs(abs(vv8 + 1)2) - 1)[1] == 3",
11268 "var x:= 1; (abs(x + vv8))[1] == 2",
11269 "var x:= 1; (abs(vv8 + x))[1] == 2",
11270 "var x:= 1; var y:= 1; (abs(x + vv8))[y] == 2",
11271 "var x:= 1; var y:= 1; (abs(vv8 + x))[y] == 2",
11272 "var x:= 1; var y:= 1; (abs(vv8 + x))[y / x] == 2",
11273 "var x:= 1; var y:= 1; (abs(vv8 + x - y))[y / x] == 1",
11274 "var x:= 1; var y:= 1; (abs(x + vv8))[y / x] == 2",
11275 "var x:= 1; var y:= 1; (abs(x + vv8 - y))[y / x] == 1",
11276 "var x:= 1; (abs(x + vv8)/2)[1] == 1",
11277 "var x:= 1; (abs(vv8 + x)/2)[1] == 1",
11278 "var x:= 1; var y:= 1; (abs(x + vv8)/2)[y] == 1",
11279 "var x:= 1; var y:= 1; (abs(vv8 + x)/2)[y] == 1",
11280 "var x:= 1; var y:= 1; (abs(vv8 + x)/2)[y / x] == 1",
11281 "var x:= 1; var y:= 1; (abs(x + vv8)/2)[y / x] == 1",
11282 "var x := 1; (abs(abs(vv8 + x)) - x)[1] == 1",
11283 "var x := 1; (abs(2 * abs(vv8 + x)) - x)[1] == 3",
11284 "var x := 1; (abs(abs(vv8 + x) * 2) - x)[1] == 3",
11285 "var x := 1; (abs(2abs(vv8 + x)) - x)[1] == 3",
11286 "var x := 1; (abs(abs(vv8 + x)2) - x)[1] == 3",
11287 "var x := 1; var y := 1; (abs(abs(vv8 + x)) - x)[y] == 1",
11288 "var x := 1; var y := 1; (abs(2 * abs(vv8 + x)) - x)[y] == 3",
11289 "var x := 1; var y := 1; (abs(abs(vv8 + x) * 2) - x)[y] == 3",
11290 "var x := 1; var y := 1; (abs(2abs(vv8 + x)) - x)[y] == 3",
11291 "var x := 1; var y := 1; (abs(abs(vv8 + x)2) - x)[y] == 3",
11292 "var x := 1; var y := 1; (abs(abs(vv8 + x)) - x)[x / y] == 1",
11293 "var x := 1; var y := 1; (abs(2 * abs(vv8 + x)) - x)[x / y] == 3",
11294 "var x := 1; var y := 1; (abs(abs(vv8 + x) * 2) - x)[x / y] == 3",
11295 "var x := 1; var y := 1; (abs(2abs(vv8 + x)) - x)[x / y] == 3",
11296 "var x := 1; var y := 1; (abs(abs(vv8 + x)2) - x)[x / y] == 3",
11297 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + 1)[i] == i + 1; }; successes == vv8[]",
11298 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i] == i + x; }; successes == vv8[]",
11299 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i] == i + x; }; successes == vv8[]",
11300 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i / x] == i + x; }; successes == vv8[]",
11301 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i / x] == i + x; }; successes == vv8[]",
11302 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + 1))[i] == i + 1; }; successes == vv8[]",
11303 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + x))[i] == i + x; }; successes == vv8[]",
11304 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(x + vv8))[i] == i + x; }; successes == vv8[]",
11305 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + x))[i / x] == i + x; }; successes == vv8[]",
11306 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(x + vv8))[i / x] == i + x; }; successes == vv8[]",
11307 };
11308
11309 bool error_found = false;
11310
11311 for (std::size_t e = 0; e < sizeof(expressions)/sizeof(std::string); ++e)
11312 {
11313 T vs8[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
11314 T vs7[] = { 0, 1, 2, 3, 4, 5, 6 };
11315 T vs6[] = { 0, 1, 2, 3, 4, 5 };
11316 T vs5[] = { 0, 1, 2, 3, 4 };
11317 T vs4[] = { 0, 1, 2, 3 };
11318 T vs3[] = { 0, 1, 2 };
11319 T vs2[] = { 0, 1 };
11320 T vs1[] = { 0 };
11321
11330
11331 symbol_table_t symbol_table;
11332
11333 symbol_table.add_vector("vv1", vv1);
11334 symbol_table.add_vector("vv2", vv2);
11335 symbol_table.add_vector("vv3", vv3);
11336 symbol_table.add_vector("vv4", vv4);
11337 symbol_table.add_vector("vv5", vv5);
11338 symbol_table.add_vector("vv6", vv6);
11339 symbol_table.add_vector("vv7", vv7);
11340 symbol_table.add_vector("vv8", vv8);
11341
11342 parser_t parser;
11343
11344 const std::string& expression_string = expressions[e];
11345 expression_t expression;
11346 expression.register_symbol_table(symbol_table);
11347
11348 if (!parser.compile(expression_string,expression))
11349 {
11350 printf("run_test21() - vector_veiw expression compilation error. Expression: %s\n",
11351 expression_string.c_str());
11352
11353 for (std::size_t i = 0; i < parser.error_count(); ++i)
11354 {
11355 error_type error = parser.get_error(i);
11356 exprtk::parser_error::update_error(error,expression_string);
11357
11358 printf("run_test21() - Exp[%02d] Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11359 static_cast<unsigned int>(e),
11360 static_cast<unsigned int>(i),
11361 static_cast<unsigned int>(error.token.position),
11362 static_cast<unsigned int>(error.line_no),
11363 static_cast<unsigned int>(error.column_no),
11364 exprtk::parser_error::to_str(error.mode).c_str(),
11365 error.diagnostic.c_str());
11366 }
11367
11368 error_found = true;
11369
11370 continue;
11371 }
11372
11373 const T result = expression.value();
11374
11375 if (result != T(1.0))
11376 {
11377 error_found = true;
11378
11379 printf("run_test21() - Error: Exp[%02d] Expression result: %5.3f expected: 1 expression: %s\n",
11380 static_cast<unsigned int>(e),
11381 static_cast<double>(result),
11382 expression_string.c_str());
11383 }
11384 }
11385
11386 if (error_found)
11387 {
11388 return false;
11389 }
11390 }
11391
11392 {
11393 const std::string expressions[] =
11394 {
11395 "vv0[] == vv0_size",
11396 "sum(vv0) == (vv0[] * (vv0[] + 1) / 2) and (vv0[] == vv0_size)",
11397 "(min(vv0) == 1) and (vv0[] == vv0_size)",
11398 "(max(vv0) == vv0[]) and (vv0[] == vv0_size)",
11399 "(avg(vv0) == (min(vv0) + max(vv0)) / 2) and (vv0[] == vv0_size)",
11400 "(sum(vv0 + 1) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * 1))) and (vv0[] == vv0_size)",
11401 "(sum(vv0 - 1) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * 1))) and (vv0[] == vv0_size)",
11402 "(sum(1 + vv0) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * 1))) and (vv0[] == vv0_size)",
11403 "(sum(-1 + vv0) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * 1))) and (vv0[] == vv0_size)",
11404 "var x:= 1; sum(vv0 + x) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * x)) and (vv0[] == vv0_size)",
11405 "var x:= 1; sum(vv0 - x) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * x)) and (vv0[] == vv0_size)",
11406 "sum(2vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11407 "sum(vv0 * 2) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11408 "sum(2vv0 + 1) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11409 "sum(1 + 2vv0) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11410 "var x := 1; sum(2vv0 + x) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11411 "var x := 1; sum(x + 2vv0) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11412 "sum(vv0 += 1) == (vv0[] * (vv0[] + 1) / 2 + vv0[]) and (vv0[] == vv0_size)",
11413 "var x:= 1; sum(vv0 += x) == (vv0[] * (vv0[] + 1) / 2 + x * vv0[]) and (vv0[] == vv0_size)",
11414 "var x:= 1; sum(vv0 -= x) == (vv0[] * (vv0[] + 1 - 2x) / 2) and (vv0[] == vv0_size)",
11415 "(sum(2vv0) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
11416 "(sum(vv0 * 2) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
11417 "var x:= 1; sum(2vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11418 "var x := 2; sum(if (x > 1) { vv0 } else { vv1 }) == sum(vv0)",
11419 "dot(2 * vv0,vv1 - 1) + dot(2 * vv0,vv1 - 1) == 2sum(2vv0 * (vv1 - 1))",
11420 "(0 * dot(2 * vv0,vv1 - 1)) == 0"
11421 };
11422
11423 bool error_found = false;
11424
11425 for (std::size_t e = 0; e < sizeof(expressions) / sizeof(std::string); ++e)
11426 {
11427 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11428 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11429
11430 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11432
11433 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11435
11436 T vv0_size = T(0.0);
11437
11438 symbol_table_t symbol_table;
11439 symbol_table.add_variable("vv0_size", vv0_size);
11440 symbol_table.add_vector ("vv0" , vv0 );
11441 symbol_table.add_vector ("vv1" , vv1 );
11442
11443 exprtk::rtl::vecops::package<T> vector_package;
11444 exprtk::rtl::io::package<T> io_package;
11445
11446 symbol_table.add_package( vector_package );
11447 symbol_table.add_package( io_package );
11448
11449 const std::string& expression_string = expressions[e];
11450 expression_t expression;
11451 expression.register_symbol_table(symbol_table);
11452
11453 parser_t parser;
11454
11455 if (!parser.compile(expression_string, expression))
11456 {
11457 printf("run_test21() - Error: %s\tExpression: %s\n",
11458 parser.error().c_str(),
11459 expression_string.c_str());
11460
11461 for (std::size_t i = 0; i < parser.error_count(); ++i)
11462 {
11463 error_type error = parser.get_error(i);
11464 exprtk::parser_error::update_error(error,expression_string);
11465
11466 printf("run_test21() - Exp[%02d] Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11467 static_cast<unsigned int>(e),
11468 static_cast<unsigned int>(i),
11469 static_cast<unsigned int>(error.token.position),
11470 static_cast<unsigned int>(error.line_no),
11471 static_cast<unsigned int>(error.column_no),
11472 exprtk::parser_error::to_str(error.mode).c_str(),
11473 error.diagnostic.c_str());
11474 }
11475
11476 continue;
11477 }
11478
11479 for (std::size_t i = 1; i <= vv0.base_size(); ++i)
11480 {
11481 v0.assign(vanilla, vanilla + vanilla_size);
11482 v1.assign(vanilla, vanilla + vanilla_size);
11483
11484 vv0_size = T(i);
11485 vv0.set_size(i);
11486
11487 const T result = expression.value();
11488
11489 if (result != 1)
11490 {
11491 printf("run_test21() - Exp[%02d] Error: size: %d expected 1 instead got: %f expr:%s\n",
11492 static_cast<unsigned int>(e),
11493 static_cast<unsigned int>(i),
11494 static_cast<double>(result),
11495 expression_string.c_str());
11496 }
11497 }
11498
11499 vv1.rebase(v0.data());
11500 vv0.rebase(v1.data());
11501 expression.value();
11502
11503 vv0.rebase(v0.data());
11504 vv1.rebase(v1.data());
11505 expression.value();
11506
11507 expression.release();
11508 }
11509
11510 if (error_found)
11511 {
11512 return false;
11513 }
11514 }
11515
11516 {
11517 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11518 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11519
11520 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11521 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11522
11524
11525 vv_size_handler_t<T> vv_size_handler;
11526 vv_size_handler.register_vector_view(vv);
11527
11528 symbol_table_t symbol_table;
11529 symbol_table.add_vector("v", vv);
11530
11531 exprtk::rtl::vecops::package<T> vector_package;
11532 exprtk::rtl::io::package<T> io_package;
11533
11534 symbol_table.add_package( vector_package );
11535 symbol_table.add_package( io_package );
11536 symbol_table.add_function("resize", vv_size_handler);
11537
11538 expression_t expression;
11539 expression.register_symbol_table(symbol_table);
11540
11541 parser_t parser;
11542
11543 const std::string resize_expression =
11544 " var vec_original_size := v[]; "
11545 " var success_count := 0; "
11546 " "
11547 " for (var i := 1; i <= vec_original_size; i += 1) "
11548 " { "
11549 " if (resize(v,i) == true and v[] == i) "
11550 " { "
11551 " success_count += 1; "
11552 " } "
11553 " }; "
11554 " "
11555 " success_count == vec_original_size ";
11556
11557 if (!parser.compile(resize_expression, expression))
11558 {
11559 printf("run_test21() - Error: %s\tExpression: %s\n",
11560 parser.error().c_str(),
11561 resize_expression.c_str());
11562
11563 for (std::size_t i = 0; i < parser.error_count(); ++i)
11564 {
11565 error_type error = parser.get_error(i);
11566 exprtk::parser_error::update_error(error,resize_expression);
11567
11568 printf("run_test21() - Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11569 static_cast<unsigned int>(i),
11570 static_cast<unsigned int>(error.token.position),
11571 static_cast<unsigned int>(error.line_no),
11572 static_cast<unsigned int>(error.column_no),
11573 exprtk::parser_error::to_str(error.mode).c_str(),
11574 error.diagnostic.c_str());
11575 }
11576
11577 return false;
11578 }
11579
11580 const T value0 = expression.value();
11581
11582 if (expression.value() != T(1))
11583 {
11584 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (1)\n", static_cast<double>(value0));
11585 }
11586
11587 vv.rebase(v1.data());
11588 vv_size_handler.register_vector_view(vv);
11589
11590 const T value1 = expression.value();
11591
11592 if (expression.value() != T(1))
11593 {
11594 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (1)\n", static_cast<double>(value1));
11595 }
11596
11597 vv.rebase(v0.data());
11598 vv_size_handler.register_vector_view(vv);
11599
11600 expression.release();
11601 }
11602
11603 {
11604 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11605 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11606
11607 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11608 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11609
11611
11612 vv_size_handler_t<T> vv_size_handler;
11613 vv_size_handler.register_vector_view(vv);
11614
11615 symbol_table_t symbol_table;
11616 symbol_table.add_vector("v", vv);
11617
11618 exprtk::rtl::vecops::package<T> vector_package;
11619 exprtk::rtl::io::package<T> io_package;
11620
11621 symbol_table.add_package( vector_package );
11622 symbol_table.add_package( io_package );
11623 symbol_table.add_function("resize", vv_size_handler);
11624
11625 expression_t expression;
11626 expression.register_symbol_table(symbol_table);
11627
11628 parser_t parser;
11629
11630 const std::string resize_expression =
11631 " var vec_original_size := v[]; "
11632 " var failure_count := 0; "
11633 " "
11634 " for (var i := vec_original_size + 1; i <= 2 * vec_original_size; i += 1) "
11635 " { "
11636 " if (resize(v,i) == false or v[] != i) "
11637 " { "
11638 " failure_count += 1 "
11639 " } "
11640 " }; "
11641 " "
11642 " failure_count == vec_original_size ";
11643
11644 if (!parser.compile(resize_expression, expression))
11645 {
11646 printf("run_test21() - Error: %s\tExpression: %s\n",
11647 parser.error().c_str(),
11648 resize_expression.c_str());
11649
11650 for (std::size_t i = 0; i < parser.error_count(); ++i)
11651 {
11652 error_type error = parser.get_error(i);
11653 exprtk::parser_error::update_error(error,resize_expression);
11654
11655 printf("run_test21() - Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11656 static_cast<unsigned int>(i),
11657 static_cast<unsigned int>(error.token.position),
11658 static_cast<unsigned int>(error.line_no),
11659 static_cast<unsigned int>(error.column_no),
11660 exprtk::parser_error::to_str(error.mode).c_str(),
11661 error.diagnostic.c_str());
11662 }
11663
11664 return false;
11665 }
11666
11667 const T value0 = expression.value();
11668
11669 if (expression.value() != T(1))
11670 {
11671 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (2)\n", static_cast<double>(value0));
11672 }
11673
11674 vv.rebase(v1.data());
11675 vv_size_handler.register_vector_view(vv);
11676
11677 const T value1 = expression.value();
11678
11679 if (expression.value() != T(1))
11680 {
11681 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (2)\n", static_cast<double>(value1));
11682 }
11683
11684 vv.rebase(v0.data());
11685 vv_size_handler.register_vector_view(vv);
11686
11687 expression.release();
11688 }
11689
11690 return true;
11691}
11692
11694{
11695 std::size_t assert_count;
11697 {
11698 ++assert_count;
11699 }
11700};
11701
11702template <typename T>
11704{
11705 typedef exprtk::symbol_table<T> symbol_table_t;
11706 typedef exprtk::expression<T> expression_t;
11707 typedef exprtk::parser<T> parser_t;
11708
11709 bool result = true;
11710
11711 {
11712 const std::string expressions[] =
11713 {
11714 " assert(1 > 1); ",
11715 " assert(1 > 2, 'assert statement 2'); ",
11716 " assert(1 > 3, 'assert ' + 'statement 3'); ",
11717 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); ",
11718 " assert(1 > 5, 'assert ' + 'statement 5'); ",
11719 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); "
11720 };
11721
11722 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11723
11724 for (std::size_t i = 0; i < expression_count; ++i)
11725 {
11726 expression_t expression;
11727 parser_t parser;
11728
11729 if (!parser.compile(expressions[i], expression))
11730 {
11731 printf("run_test22() - Error: %s\tExpression: %s [1]\n",
11732 parser.error().c_str(),
11733 expressions[i].c_str());
11734 result = false;
11735 continue;
11736 }
11737 else if (!exprtk::expression_helper<T>::is_null(expression))
11738 {
11739 printf("run_test22() - Error: Expression is not null! expression: %s [1]\n",
11740 expressions[i].c_str());
11741 result = false;
11742 continue;
11743 }
11744
11745 expression.value();
11746 }
11747 }
11748
11749 {
11750 const std::string expressions[] =
11751 {
11752 " assert(1 > 1); 1 + 0 ",
11753 " assert(1 > 2, 'assert statement 2'); 2 + 0 ",
11754 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0 ",
11755 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
11756 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 ",
11757 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
11758 };
11759
11760 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11761
11762 for (std::size_t i = 0; i < expression_count; ++i)
11763 {
11764 expression_t expression;
11765 parser_t parser;
11766
11767 if (!parser.compile(expressions[i], expression))
11768 {
11769 printf("run_test22() - Error: %s\tExpression: %s [2]\n",
11770 parser.error().c_str(),
11771 expressions[i].c_str());
11772 result = false;
11773 continue;
11774 }
11775 else if (!exprtk::expression_helper<T>::is_literal(expression))
11776 {
11777 printf("run_test22() - Error: Expression is not constant! expression: %s [2]\n",
11778 expressions[i].c_str());
11779 continue;
11780 }
11781
11782 expression.value();
11783 }
11784 }
11785
11786 {
11787 const std::string expressions[] =
11788 {
11789 " assert(1 > 1); "
11790 " assert(1 > 2, 'assert statement 2'); "
11791 " assert(1 > 3, 'assert ' + 'statement 3'); "
11792 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); "
11793 " assert(1 > 5, 'assert ' + 'statement 5'); "
11794 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); "
11795 };
11796
11797 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11798
11799 for (std::size_t i = 0; i < expression_count; ++i)
11800 {
11801 expression_t expression;
11802 parser_t parser;
11803 assert_handler handler;
11804
11805 handler.assert_count = 0;
11806
11807 parser.register_assert_check(handler);
11808
11809 if (!parser.compile(expressions[i], expression))
11810 {
11811 printf("run_test22() - Error: %s\tExpression: %s [3]\n",
11812 parser.error().c_str(),
11813 expressions[i].c_str());
11814 result = false;
11815 continue;
11816 }
11817
11818 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11819
11820 typedef typename exprtk::expression_helper<T> et_t;
11821 type_sequence.push_back(et_t::e_assert);
11822 type_sequence.push_back(et_t::e_assert);
11823 type_sequence.push_back(et_t::e_assert);
11824 type_sequence.push_back(et_t::e_assert);
11825 type_sequence.push_back(et_t::e_assert);
11826 type_sequence.push_back(et_t::e_assert);
11827
11828 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11829 {
11830 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [3]\n",
11831 expressions[i].c_str());
11832 result = false;
11833 continue;
11834 }
11835
11836 expression.value();
11837
11838 if (6 != handler.assert_count)
11839 {
11840 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [3]\n",
11841 static_cast<int>(handler.assert_count),
11842 expressions[i].c_str());
11843 result = false;
11844 continue;
11845 }
11846 }
11847 }
11848
11849 {
11850 const std::string expressions[] =
11851 {
11852 " assert(1 > 1); 1 ",
11853 " assert(1 > 2, 'assert statement 2'); 2 ",
11854 " assert(1 > 3, 'assert ' + 'statement 3'); 3 ",
11855 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 ",
11856 " assert(1 > 5, 'assert ' + 'statement 5'); 5 ",
11857 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 "
11858 };
11859
11860 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11861
11862 for (std::size_t i = 0; i < expression_count; ++i)
11863 {
11864 expression_t expression;
11865 parser_t parser;
11866 assert_handler handler;
11867
11868 handler.assert_count = 0;
11869
11870 parser.register_assert_check(handler);
11871
11872 if (!parser.compile(expressions[i], expression))
11873 {
11874 printf("run_test22() - Error: %s\tExpression: %s [4]\n",
11875 parser.error().c_str(),
11876 expressions[i].c_str());
11877 result = false;
11878 continue;
11879 }
11880
11881 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11882
11883 typedef typename exprtk::expression_helper<T> et_t;
11884 type_sequence.push_back(et_t::e_assert );
11885 type_sequence.push_back(et_t::e_literal);
11886
11887 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11888 {
11889 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [4]\n",
11890 expressions[i].c_str());
11891 result = false;
11892 continue;
11893 }
11894
11895 expression.value();
11896
11897 if (1 != handler.assert_count)
11898 {
11899 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [4]\n",
11900 static_cast<int>(handler.assert_count),
11901 expressions[i].c_str());
11902 result = false;
11903 continue;
11904 }
11905 }
11906 }
11907
11908 {
11909 const std::string expressions[] =
11910 {
11911 " assert(1 > 1); 1 + 0 ",
11912 " assert(1 > 2, 'assert statement 2'); 2 + 0 ",
11913 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0 ",
11914 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
11915 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 ",
11916 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
11917 };
11918
11919 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11920
11921 for (std::size_t i = 0; i < expression_count; ++i)
11922 {
11923 expression_t expression;
11924 parser_t parser;
11925 assert_handler handler;
11926
11927 handler.assert_count = 0;
11928
11929 parser.register_assert_check(handler);
11930
11931 if (!parser.compile(expressions[i], expression))
11932 {
11933 printf("run_test22() - Error: %s\tExpression: %s [5]\n",
11934 parser.error().c_str(),
11935 expressions[i].c_str());
11936 result = false;
11937 continue;
11938 }
11939
11940 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11941
11942 typedef typename exprtk::expression_helper<T> et_t;
11943 type_sequence.push_back(et_t::e_assert );
11944 type_sequence.push_back(et_t::e_literal);
11945
11946 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11947 {
11948 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [5]\n",
11949 expressions[i].c_str());
11950 result = false;
11951 continue;
11952 }
11953
11954 expression.value();
11955
11956 if (1 != handler.assert_count)
11957 {
11958 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [5]\n",
11959 static_cast<int>(handler.assert_count),
11960 expressions[i].c_str());
11961 result = false;
11962 continue;
11963 }
11964 }
11965 }
11966
11967 {
11968 const std::string expressions[] =
11969 {
11970 " assert(1 > 1); 'assert statement 0001' ",
11971 " assert(1 > 2, 'assert statement 2'); 'assert statement 0002' ",
11972 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert statement 0003' ",
11973 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert statement 0004' ",
11974 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert statement 0005' ",
11975 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement 0006' "
11976 };
11977
11978 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11979
11980 for (std::size_t i = 0; i < expression_count; ++i)
11981 {
11982 expression_t expression;
11983 parser_t parser;
11984 assert_handler handler;
11985
11986 handler.assert_count = 0;
11987
11988 parser.register_assert_check(handler);
11989
11990 if (!parser.compile(expressions[i], expression))
11991 {
11992 printf("run_test22() - Error: %s\tExpression: %s [6]\n",
11993 parser.error().c_str(),
11994 expressions[i].c_str());
11995 result = false;
11996 continue;
11997 }
11998
11999 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12000
12001 typedef typename exprtk::expression_helper<T> et_t;
12002 type_sequence.push_back(et_t::e_assert);
12003 type_sequence.push_back(et_t::e_string);
12004
12005 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12006 {
12007 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [6]\n",
12008 expressions[i].c_str());
12009 result = false;
12010 continue;
12011 }
12012
12013 expression.value();
12014
12015 if (1 != handler.assert_count)
12016 {
12017 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [6]\n",
12018 static_cast<int>(handler.assert_count),
12019 expressions[i].c_str());
12020 result = false;
12021 continue;
12022 }
12023 }
12024 }
12025
12026 {
12027 const std::string expressions[] =
12028 {
12029 " assert(1 > 1); 'assert statement' + '0001' ",
12030 " assert(1 > 2, 'assert statement 2'); 'assert statement' + '0002' ",
12031 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert statement' + '0003' ",
12032 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert statement' + '0004' ",
12033 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert statement' + '0005' ",
12034 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement' + '0006' "
12035 };
12036
12037 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12038
12039 for (std::size_t i = 0; i < expression_count; ++i)
12040 {
12041 expression_t expression;
12042 parser_t parser;
12043 assert_handler handler;
12044
12045 handler.assert_count = 0;
12046
12047 parser.register_assert_check(handler);
12048
12049 if (!parser.compile(expressions[i], expression))
12050 {
12051 printf("run_test22() - Error: %s\tExpression: %s [7]\n",
12052 parser.error().c_str(),
12053 expressions[i].c_str());
12054 result = false;
12055 continue;
12056 }
12057
12058 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12059
12060 typedef typename exprtk::expression_helper<T> et_t;
12061 type_sequence.push_back(et_t::e_assert);
12062 type_sequence.push_back(et_t::e_string);
12063
12064 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12065 {
12066 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [7]\n",
12067 expressions[i].c_str());
12068 result = false;
12069 continue;
12070 }
12071
12072 expression.value();
12073
12074 if (1 != handler.assert_count)
12075 {
12076 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [7]\n",
12077 static_cast<int>(handler.assert_count),
12078 expressions[i].c_str());
12079 result = false;
12080 continue;
12081 }
12082 }
12083 }
12084
12085 {
12086 const std::string expressions[] =
12087 {
12088 " assert(x > y); ",
12089 " assert(x > y, 'assert statement 2'); ",
12090 " assert(x > y, 'assert ' + 'statement 3'); ",
12091 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); ",
12092 " assert(x > y, 'assert ' + 'statement 5'); ",
12093 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); "
12094 };
12095
12096 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12097
12098 for (std::size_t i = 0; i < expression_count; ++i)
12099 {
12100 T x = T(1);
12101 T y = T(2);
12102
12103 symbol_table_t symbol_table;
12104 expression_t expression;
12105 parser_t parser;
12106
12107 symbol_table.add_variable("x", x);
12108 symbol_table.add_variable("y", y);
12109 expression.register_symbol_table(symbol_table);
12110
12111 if (!parser.compile(expressions[i], expression))
12112 {
12113 printf("run_test22() - Error: %s\tExpression: %s [8]\n",
12114 parser.error().c_str(),
12115 expressions[i].c_str());
12116 result = false;
12117 continue;
12118 }
12119 else if (!exprtk::expression_helper<T>::is_null(expression))
12120 {
12121 printf("run_test22() - Error: Expression is not null! expression: %s [8]\n",
12122 expressions[i].c_str());
12123 result = false;
12124 continue;
12125 }
12126
12127 expression.value();
12128 }
12129 }
12130
12131 {
12132 const std::string expressions[] =
12133 {
12134 " assert(x > y); 1 + 0 ",
12135 " assert(x > y, 'assert statement 2'); 2 + 0 ",
12136 " assert(x > y, 'assert ' + 'statement 3'); 3 + 0 ",
12137 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
12138 " assert(x > y, 'assert ' + 'statement 5'); 5 + 0 ",
12139 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
12140 };
12141
12142 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12143
12144 for (std::size_t i = 0; i < expression_count; ++i)
12145 {
12146 T x = T(1);
12147 T y = T(2);
12148
12149 symbol_table_t symbol_table;
12150 expression_t expression;
12151 parser_t parser;
12152
12153 symbol_table.add_variable("x", x);
12154 symbol_table.add_variable("y", y);
12155 expression.register_symbol_table(symbol_table);
12156
12157 if (!parser.compile(expressions[i], expression))
12158 {
12159 printf("run_test22() - Error: %s\tExpression: %s [9]\n",
12160 parser.error().c_str(),
12161 expressions[i].c_str());
12162 result = false;
12163 continue;
12164 }
12165 else if (!exprtk::expression_helper<T>::is_literal(expression))
12166 {
12167 printf("run_test22() - Error: Expression is not constant! expression: %s [9]\n",
12168 expressions[i].c_str());
12169 continue;
12170 }
12171
12172 expression.value();
12173 }
12174 }
12175
12176 {
12177 const std::string expressions[] =
12178 {
12179 " assert(x > y); "
12180 " assert(x > y, 'assert statement 2'); "
12181 " assert(x > y, 'assert ' + 'statement 3'); "
12182 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); "
12183 " assert(x > y, 'assert ' + 'statement 5'); "
12184 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); "
12185 };
12186
12187 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12188
12189 for (std::size_t i = 0; i < expression_count; ++i)
12190 {
12191 T x = T(1);
12192 T y = T(2);
12193
12194 symbol_table_t symbol_table;
12195 expression_t expression;
12196 parser_t parser;
12197 assert_handler handler;
12198
12199 handler.assert_count = 0;
12200
12201 symbol_table.add_variable("x", x);
12202 symbol_table.add_variable("y", y);
12203 expression.register_symbol_table(symbol_table);
12204
12205 parser.register_assert_check(handler);
12206
12207 if (!parser.compile(expressions[i], expression))
12208 {
12209 printf("run_test22() - Error: %s\tExpression: %s [10]\n",
12210 parser.error().c_str(),
12211 expressions[i].c_str());
12212 result = false;
12213 continue;
12214 }
12215
12216 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12217
12218 typedef typename exprtk::expression_helper<T> et_t;
12219 type_sequence.push_back(et_t::e_assert);
12220 type_sequence.push_back(et_t::e_assert);
12221 type_sequence.push_back(et_t::e_assert);
12222 type_sequence.push_back(et_t::e_assert);
12223 type_sequence.push_back(et_t::e_assert);
12224 type_sequence.push_back(et_t::e_assert);
12225
12226 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12227 {
12228 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [10]\n",
12229 expressions[i].c_str());
12230 result = false;
12231 continue;
12232 }
12233
12234 expression.value();
12235
12236 if (6 != handler.assert_count)
12237 {
12238 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [10]\n",
12239 static_cast<int>(handler.assert_count),
12240 expressions[i].c_str());
12241 result = false;
12242 continue;
12243 }
12244 }
12245 }
12246
12247 {
12248 const std::string expressions[] =
12249 {
12250 " assert(x > y); 1 ",
12251 " assert(x > y, 'assert statement 2'); 2 ",
12252 " assert(x > y, 'assert ' + 'statement 3'); 3 ",
12253 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 ",
12254 " assert(x > y, 'assert ' + 'statement 5'); 5 ",
12255 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 "
12256 };
12257
12258 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12259
12260 for (std::size_t i = 0; i < expression_count; ++i)
12261 {
12262 T x = T(1);
12263 T y = T(2);
12264
12265 symbol_table_t symbol_table;
12266 expression_t expression;
12267 parser_t parser;
12268 assert_handler handler;
12269
12270 handler.assert_count = 0;
12271
12272 symbol_table.add_variable("x", x);
12273 symbol_table.add_variable("y", y);
12274 expression.register_symbol_table(symbol_table);
12275
12276 parser.register_assert_check(handler);
12277
12278 if (!parser.compile(expressions[i], expression))
12279 {
12280 printf("run_test22() - Error: %s\tExpression: %s [11]\n",
12281 parser.error().c_str(),
12282 expressions[i].c_str());
12283 result = false;
12284 continue;
12285 }
12286
12287 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12288
12289 typedef typename exprtk::expression_helper<T> et_t;
12290 type_sequence.push_back(et_t::e_assert );
12291 type_sequence.push_back(et_t::e_literal);
12292
12293 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12294 {
12295 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [11]\n",
12296 expressions[i].c_str());
12297 result = false;
12298 continue;
12299 }
12300
12301 expression.value();
12302
12303 if (1 != handler.assert_count)
12304 {
12305 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [11]\n",
12306 static_cast<int>(handler.assert_count),
12307 expressions[i].c_str());
12308 result = false;
12309 continue;
12310 }
12311
12312 }
12313 }
12314
12315 {
12316 const std::string expressions[] =
12317 {
12318 " assert(x > y); 1 + 0 ",
12319 " assert(x > y, 'assert statement 2'); 2 + 0 ",
12320 " assert(x > y, 'assert ' + 'statement 3'); 3 + 0 ",
12321 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
12322 " assert(x > y, 'assert ' + 'statement 5'); 5 + 0 ",
12323 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
12324 };
12325
12326 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12327
12328 for (std::size_t i = 0; i < expression_count; ++i)
12329 {
12330 T x = T(1);
12331 T y = T(2);
12332
12333 symbol_table_t symbol_table;
12334 expression_t expression;
12335 parser_t parser;
12336 assert_handler handler;
12337
12338 handler.assert_count = 0;
12339
12340 symbol_table.add_variable("x", x);
12341 symbol_table.add_variable("y", y);
12342 expression.register_symbol_table(symbol_table);
12343
12344 parser.register_assert_check(handler);
12345
12346 if (!parser.compile(expressions[i], expression))
12347 {
12348 printf("run_test22() - Error: %s\tExpression: %s [12]\n",
12349 parser.error().c_str(),
12350 expressions[i].c_str());
12351 result = false;
12352 continue;
12353 }
12354
12355 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12356
12357 typedef typename exprtk::expression_helper<T> et_t;
12358 type_sequence.push_back(et_t::e_assert );
12359 type_sequence.push_back(et_t::e_literal);
12360
12361 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12362 {
12363 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [12]\n",
12364 expressions[i].c_str());
12365 result = false;
12366 continue;
12367 }
12368
12369 expression.value();
12370
12371 if (1 != handler.assert_count)
12372 {
12373 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [12]\n",
12374 static_cast<int>(handler.assert_count),
12375 expressions[i].c_str());
12376 result = false;
12377 continue;
12378 }
12379 }
12380 }
12381
12382 {
12383 const std::string expressions[] =
12384 {
12385 " assert(x > y); 'assert statement 0001' ",
12386 " assert(x > y, 'assert statement 2'); 'assert statement 0002' ",
12387 " assert(x > y, 'assert ' + 'statement 3'); 'assert statement 0003' ",
12388 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert statement 0004' ",
12389 " assert(x > y, 'assert ' + 'statement 5'); 'assert statement 0005' ",
12390 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement 0006' "
12391 };
12392
12393 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12394
12395 for (std::size_t i = 0; i < expression_count; ++i)
12396 {
12397 T x = T(1);
12398 T y = T(2);
12399
12400 symbol_table_t symbol_table;
12401 expression_t expression;
12402 parser_t parser;
12403 assert_handler handler;
12404
12405 handler.assert_count = 0;
12406
12407 symbol_table.add_variable("x", x);
12408 symbol_table.add_variable("y", y);
12409 expression.register_symbol_table(symbol_table);
12410
12411 parser.register_assert_check(handler);
12412
12413 if (!parser.compile(expressions[i], expression))
12414 {
12415 printf("run_test22() - Error: %s\tExpression: %s [13]\n",
12416 parser.error().c_str(),
12417 expressions[i].c_str());
12418 result = false;
12419 continue;
12420 }
12421
12422 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12423
12424 typedef typename exprtk::expression_helper<T> et_t;
12425 type_sequence.push_back(et_t::e_assert);
12426 type_sequence.push_back(et_t::e_string);
12427
12428 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12429 {
12430 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [13]\n",
12431 expressions[i].c_str());
12432 result = false;
12433 continue;
12434 }
12435
12436 expression.value();
12437
12438 if (1 != handler.assert_count)
12439 {
12440 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [13]\n",
12441 static_cast<int>(handler.assert_count),
12442 expressions[i].c_str());
12443 result = false;
12444 continue;
12445 }
12446 }
12447 }
12448
12449 {
12450 const std::string expressions[] =
12451 {
12452 " assert(x > y); 'assert statement' + '0001' ",
12453 " assert(x > y, 'assert statement 2'); 'assert statement' + '0002' ",
12454 " assert(x > y, 'assert ' + 'statement 3'); 'assert statement' + '0003' ",
12455 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert statement' + '0004' ",
12456 " assert(x > y, 'assert ' + 'statement 5'); 'assert statement' + '0005' ",
12457 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement' + '0006' "
12458 };
12459
12460 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12461
12462 for (std::size_t i = 0; i < expression_count; ++i)
12463 {
12464 T x = T(1);
12465 T y = T(2);
12466
12467 symbol_table_t symbol_table;
12468 expression_t expression;
12469 parser_t parser;
12470 assert_handler handler;
12471
12472 handler.assert_count = 0;
12473
12474 symbol_table.add_variable("x", x);
12475 symbol_table.add_variable("y", y);
12476 expression.register_symbol_table(symbol_table);
12477
12478 parser.register_assert_check(handler);
12479
12480 if (!parser.compile(expressions[i], expression))
12481 {
12482 printf("run_test22() - Error: %s\tExpression: %s [14]\n",
12483 parser.error().c_str(),
12484 expressions[i].c_str());
12485 result = false;
12486 continue;
12487 }
12488
12489 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12490
12491 typedef typename exprtk::expression_helper<T> et_t;
12492 type_sequence.push_back(et_t::e_assert);
12493 type_sequence.push_back(et_t::e_string);
12494
12495 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12496 {
12497 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [14]\n",
12498 expressions[i].c_str());
12499 result = false;
12500 continue;
12501 }
12502
12503 expression.value();
12504
12505 if (1 != handler.assert_count)
12506 {
12507 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [14]\n",
12508 static_cast<int>(handler.assert_count),
12509 expressions[i].c_str());
12510 result = false;
12511 continue;
12512 }
12513 }
12514 }
12515
12516 {
12517 const std::string expressions[] =
12518 {
12519 " assert(1 > 1); 1 + 0; "
12520 " assert(1 > 2, 'assert statement 2'); 2 + 0; "
12521 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0; "
12522 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0; "
12523 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 "
12524 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0; "
12525 };
12526
12527 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12528
12529 for (std::size_t i = 0; i < expression_count; ++i)
12530 {
12531 expression_t expression;
12532 parser_t parser;
12533 assert_handler handler;
12534
12535 handler.assert_count = 0;
12536
12537 parser.register_assert_check(handler);
12538
12539 if (!parser.compile(expressions[i], expression))
12540 {
12541 printf("run_test22() - Error: %s\tExpression: %s [15]\n",
12542 parser.error().c_str(),
12543 expressions[i].c_str());
12544 result = false;
12545 continue;
12546 }
12547
12548 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12549
12550 typedef typename exprtk::expression_helper<T> et_t;
12551 type_sequence.push_back(et_t::e_assert );
12552 type_sequence.push_back(et_t::e_assert );
12553 type_sequence.push_back(et_t::e_assert );
12554 type_sequence.push_back(et_t::e_assert );
12555 type_sequence.push_back(et_t::e_assert );
12556 type_sequence.push_back(et_t::e_assert );
12557 type_sequence.push_back(et_t::e_literal);
12558
12559 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12560 {
12561 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [15]\n",
12562 expressions[i].c_str());
12563 result = false;
12564 continue;
12565 }
12566
12567 expression.value();
12568
12569 if (6 != handler.assert_count)
12570 {
12571 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [15]\n",
12572 static_cast<int>(handler.assert_count),
12573 expressions[i].c_str());
12574 result = false;
12575 continue;
12576 }
12577 }
12578 }
12579
12580 {
12581 const std::string expressions[] =
12582 {
12583 " assert(1 > 1); 'assert' + '01'; "
12584 " assert(1 > 2, 'assert statement 2'); 'assert' + '02'; "
12585 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert' + '03'; "
12586 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert' + '04'; "
12587 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert' + '05'; "
12588 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert' + '06'; "
12589 };
12590
12591 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12592
12593 for (std::size_t i = 0; i < expression_count; ++i)
12594 {
12595 expression_t expression;
12596 parser_t parser;
12597 assert_handler handler;
12598
12599 handler.assert_count = 0;
12600
12601 parser.register_assert_check(handler);
12602
12603 if (!parser.compile(expressions[i], expression))
12604 {
12605 printf("run_test22() - Error: %s\tExpression: %s [16]\n",
12606 parser.error().c_str(),
12607 expressions[i].c_str());
12608 result = false;
12609 continue;
12610 }
12611
12612 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12613
12614 typedef typename exprtk::expression_helper<T> et_t;
12615 type_sequence.push_back(et_t::e_assert);
12616 type_sequence.push_back(et_t::e_assert);
12617 type_sequence.push_back(et_t::e_assert);
12618 type_sequence.push_back(et_t::e_assert);
12619 type_sequence.push_back(et_t::e_assert);
12620 type_sequence.push_back(et_t::e_assert);
12621 type_sequence.push_back(et_t::e_string);
12622
12623 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12624 {
12625 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [16]\n",
12626 expressions[i].c_str());
12627 result = false;
12628 continue;
12629 }
12630
12631 expression.value();
12632
12633 if (6 != handler.assert_count)
12634 {
12635 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [16]\n",
12636 static_cast<int>(handler.assert_count),
12637 expressions[i].c_str());
12638 result = false;
12639 continue;
12640 }
12641 }
12642 }
12643
12644 {
12645 const std::string expressions[] =
12646 {
12647 " assert(x > y); x + y + 1; "
12648 " assert(x > y, 'assert statement 2'); x + y + 1; "
12649 " assert(x > y, 'assert ' + 'statement 3'); x + y + 1; "
12650 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); x + y + 1; "
12651 " assert(x > y, 'assert ' + 'statement 5'); x + y + 1; "
12652 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); x + y + 1; "
12653 };
12654
12655 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12656
12657 for (std::size_t i = 0; i < expression_count; ++i)
12658 {
12659 T x = T(1);
12660 T y = T(2);
12661
12662 symbol_table_t symbol_table;
12663 expression_t expression;
12664 parser_t parser;
12665 assert_handler handler;
12666
12667 handler.assert_count = 0;
12668
12669 symbol_table.add_variable("x", x);
12670 symbol_table.add_variable("y", y);
12671 expression.register_symbol_table(symbol_table);
12672
12673 parser.register_assert_check(handler);
12674
12675 if (!parser.compile(expressions[i], expression))
12676 {
12677 printf("run_test22() - Error: %s\tExpression: %s [17]\n",
12678 parser.error().c_str(),
12679 expressions[i].c_str());
12680 result = false;
12681 continue;
12682 }
12683
12684 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12685
12686 typedef typename exprtk::expression_helper<T> et_t;
12687 type_sequence.push_back(et_t::e_assert);
12688 type_sequence.push_back(et_t::e_assert);
12689 type_sequence.push_back(et_t::e_assert);
12690 type_sequence.push_back(et_t::e_assert);
12691 type_sequence.push_back(et_t::e_assert);
12692 type_sequence.push_back(et_t::e_assert);
12693 type_sequence.push_back(et_t::e_sf3ext);
12694
12695 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12696 {
12697 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [17]\n",
12698 expressions[i].c_str());
12699 result = false;
12700 continue;
12701 }
12702
12703 expression.value();
12704
12705 if (6 != handler.assert_count)
12706 {
12707 printf("run_test22() - Error: Invalid assert count of %d expected 6. Expression: %s [17]\n",
12708 static_cast<int>(handler.assert_count),
12709 expressions[i].c_str());
12710 result = false;
12711 continue;
12712 }
12713 }
12714 }
12715
12716 {
12717 const std::string expressions[] =
12718 {
12719 " assert(x > y); 'assert' + ((x < y) ? '01' : 'XYZ'); "
12720 " assert(x > y, 'assert statement 2'); 'assert' + ((x < y) ? '02' : 'XYZ'); "
12721 " assert(x > y, 'assert ' + 'statement 3'); 'assert' + ((x < y) ? '03' : 'XYZ'); "
12722 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert' + ((x < y) ? '04' : 'XYZ'); "
12723 " assert(x > y, 'assert ' + 'statement 5'); 'assert' + ((x < y) ? '05' : 'XYZ'); "
12724 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert' + ((x < y) ? '06' : 'XYZ'); "
12725 };
12726
12727 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12728
12729 for (std::size_t i = 0; i < expression_count; ++i)
12730 {
12731 T x = T(1);
12732 T y = T(2);
12733
12734 symbol_table_t symbol_table;
12735 expression_t expression;
12736 parser_t parser;
12737 assert_handler handler;
12738
12739 handler.assert_count = 0;
12740
12741 symbol_table.add_variable("x", x);
12742 symbol_table.add_variable("y", y);
12743 expression.register_symbol_table(symbol_table);
12744
12745 parser.register_assert_check(handler);
12746
12747 if (!parser.compile(expressions[i], expression))
12748 {
12749 printf("run_test22() - Error: %s\tExpression: %s [18]\n",
12750 parser.error().c_str(),
12751 expressions[i].c_str());
12752 result = false;
12753 continue;
12754 }
12755
12756 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12757
12758 typedef typename exprtk::expression_helper<T> et_t;
12759 type_sequence.push_back(et_t::e_assert);
12760 type_sequence.push_back(et_t::e_assert);
12761 type_sequence.push_back(et_t::e_assert);
12762 type_sequence.push_back(et_t::e_assert);
12763 type_sequence.push_back(et_t::e_assert);
12764 type_sequence.push_back(et_t::e_assert);
12765 type_sequence.push_back(et_t::e_string);
12766
12767 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12768 {
12769 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [18]\n",
12770 expressions[i].c_str());
12771 result = false;
12772 continue;
12773 }
12774
12775 expression.value();
12776
12777 if (6 != handler.assert_count)
12778 {
12779 printf("run_test22() - Error: Invalid assert count of %d expected 6. Expression: %s [18]\n",
12780 static_cast<int>(handler.assert_count),
12781 expressions[i].c_str());
12782 result = false;
12783 continue;
12784 }
12785 }
12786 }
12787
12788 return result;
12789}
12790
12791template <typename T>
12792struct type_name { static inline std::string value() { return "mpfr"; } };
12793
12794int main(int argc, char*argv[])
12795{
12796 mpfr::mpreal::set_default_prec(128);
12797
12798 const std::string test_set = (argc == 2) ? std::string(argv[1]) : "";
12799
12800 #define perform_test(Type,Number) \
12801 { \
12802 const std::string test_name = "run_test"#Number; \
12803 if ( \
12804 test_set.empty() || \
12805 test_set.find(test_name) != std::string::npos \
12806 ) \
12807 { \
12808 exprtk::timer timer; \
12809 timer.start(); \
12810 if (!run_test##Number<Type>()) \
12811 { \
12812 printf("run_test"#Number" (%s) *** FAILED! ***\n", \
12813 type_name<Type>::value().c_str()); \
12814 result = EXIT_FAILURE; \
12815 } \
12816 else \
12817 { \
12818 timer.stop(); \
12819 printf("run_test"#Number" (%s) - Result: SUCCESS Time: %8.4fsec\n", \
12820 type_name<Type>::value().c_str(), \
12821 timer.time()); \
12822 } \
12823 } \
12824 } \
12825
12826 int result = 0;
12827
12851
12852 #undef perform_test
12853
12854 return result;
12855}
bool register_symbol_table(symbol_table< T > &st)
Definition exprtk.hpp:21991
ifunction(const std::size_t &pc)
Definition exprtk.hpp:19784
std::string parameter_sequence
Definition exprtk.hpp:19938
igeneric_function(const std::string &param_seq="", const return_type rtr_type=e_rtrn_scalar)
Definition exprtk.hpp:19906
bool compile(const std::string &expression_string, expression< T > &expr)
Definition exprtk.hpp:24742
void enable_unknown_symbol_resolver(unknown_symbol_resolver *usr=reinterpret_cast< unknown_symbol_resolver * >(0))
Definition exprtk.hpp:25074
dependent_entity_collector & dec()
Definition exprtk.hpp:25044
std::string error() const
Definition exprtk.hpp:25029
std::size_t count() const
Definition exprtk.hpp:5023
bool add_package(Package &package)
Definition exprtk.hpp:21363
bool remove_vararg_function(const std::string &vararg_function_name)
Definition exprtk.hpp:21320
bool remove_variable(const std::string &variable_name, const bool delete_node=true)
Definition exprtk.hpp:21294
bool add_function(const std::string &function_name, function_t &function)
Definition exprtk.hpp:21076
bool remove_vector(const std::string &vector_name)
Definition exprtk.hpp:21328
std::size_t get_variable_list(Sequence< std::pair< std::string, T >, Allocator > &vlist) const
Definition exprtk.hpp:21370
stringvar_ptr get_stringvar(const std::string &string_name) const
Definition exprtk.hpp:20864
bool remove_stringvar(const std::string &string_name)
Definition exprtk.hpp:21303
variable_ptr get_variable(const std::string &variable_name) const
Definition exprtk.hpp:20844
bool add_variable(const std::string &variable_name, T &t, const bool is_constant=false)
Definition exprtk.hpp:21035
bool symbol_exists(const std::string &symbol_name, const bool check_reserved_symb=true) const
Definition exprtk.hpp:21456
bool add_vector(const std::string &vector_name, T(&v)[N])
Definition exprtk.hpp:21239
bool add_stringvar(const std::string &stringvar_name, std::string &s, const bool is_constant=false)
Definition exprtk.hpp:21063
std::size_t get_stringvar_list(Sequence< std::pair< std::string, std::string >, Allocator > &svlist) const
Definition exprtk.hpp:21391
std::size_t stringvar_count() const
Definition exprtk.hpp:20819
bool remove_function(const std::string &function_name)
Definition exprtk.hpp:21312
void rebase(data_ptr_t data)
Definition exprtk.hpp:4650
std::size_t base_size() const
Definition exprtk.hpp:4668
data_ptr_t data() const
Definition exprtk.hpp:4663
bool set_size(const std::size_t new_size)
Definition exprtk.hpp:4726
void register_vector_view(exprtk::vector_view< T > &vec_view)
exprtk::vector_view< T > * vv_ptr_t
std::map< void *, vv_ptr_t > map_t
T operator()(parameter_list_t parameters)
igfun_t::parameter_list_t parameter_list_t
exprtk::igeneric_function< T > igfun_t
igfun_t::generic_type generic_type
generic_type::vector_view vector_t
generic_type::scalar_view scalar_t
const double pi
static const std::size_t rounds
mpfr::mpreal numeric_type
numeric_type foo4(numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3)
numeric_type foo6(numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3, numeric_type v4, numeric_type v5)
bool run_test22()
#define exprtk_test_final
bool run_test07()
std::string results_to_string(const exprtk::results_context< T > &results)
bool run_test11()
std::pair< std::string, numeric_type > test_t
T isnan(const T t)
bool run_test09()
bool run_test16()
bool result_equal(const exprtk::results_context< T > &results, const T &value)
numeric_type foo5(numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3, numeric_type v4)
bool run_test00()
bool run_test13()
bool not_equal(const T &t0, const T &t1, const T &epsilon=T(0.000000000001))
#define perform_test(Type, Number)
static const test_t global_test_list[]
bool run_test05()
mpfr::mpreal numeric_type
bool run_test20()
bool run_test17()
T clamp(const T &l, const T &v, const T &u)
bool run_test12()
#define define_free_functions(N, Type)
bool run_test18()
numeric_type foo2(numeric_type v0, numeric_type v1)
bool run_test21()
bool run_test01()
numeric_type foo1(numeric_type v0)
static const std::size_t global_test_list_size
bool run_test15()
bool run_test19()
bool run_test02()
bool run_test03()
#define pb(v, N)
bool run_test04()
bool run_test08()
bool run_test06()
bool run_test10()
numeric_type foo3(numeric_type v0, numeric_type v1, numeric_type v2)
std::size_t load_expressions(const std::string &file_name, Sequence< std::string, Allocator > &sequence)
bool run_test14()
bool not_equal_impl(const T &t1, const T &t2, const T &epsilon=0.000000000001)
static const double delta
const std::size_t expression_list_size
static const std::string expression_list[]
numeric_type foo4(numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3)
numeric_type foo6(numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3, numeric_type v4, numeric_type v5)
std::pair< std::string, numeric_type > test_t
#define exprtk_test_override
numeric_type foo5(numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3, numeric_type v4)
numeric_type foo2(numeric_type v0, numeric_type v1)
numeric_type foo1(numeric_type v0)
numeric_type foo3(numeric_type v0, numeric_type v1, numeric_type v2)
std::string to_str(int i)
Definition exprtk.hpp:302
bool update_error(type &error, const std::string &expression)
Definition exprtk.hpp:22379
std::string to_str(error_mode mode)
Definition exprtk.hpp:22363
void enable_zero_parameters(FunctionType &func)
Definition exprtk.hpp:19736
bool collect_variables(const std::string &expression, Sequence< std::string, Allocator > &symbol_list)
Definition exprtk.hpp:42235
void set_max_num_args(FunctionType &func, const std::size_t &num_args)
Definition exprtk.hpp:19774
vector_view< T > make_vector_view(T *data, const std::size_t size, const std::size_t offset=0)
Definition exprtk.hpp:4762
T third_derivative(const expression< T > &e, T &x, const T &h=T(0.0001))
Definition exprtk.hpp:42451
bool collect_functions(const std::string &expression, Sequence< std::string, Allocator > &symbol_list)
Definition exprtk.hpp:42296
T derivative(const expression< T > &e, T &x, const T &h=T(0.00000001))
Definition exprtk.hpp:42408
T second_derivative(const expression< T > &e, T &x, const T &h=T(0.00001))
Definition exprtk.hpp:42429
std::string to_str(const StringView &view)
Definition exprtk.hpp:4996
void set_min_num_args(FunctionType &func, const std::size_t &num_args)
Definition exprtk.hpp:19765
T integrate(const expression< T > &e, T &x, const T &r0, const T &r1, const std::size_t number_of_intervals=1000000)
Definition exprtk.hpp:42356
void handle_assert(const assert_context &)
base_func(const std::size_t &n)
T operator()(type v0, type v1)
T operator()(type v0)
T operator()(type v0, type v1, type v2, type v3, type v4)
T operator()(type v0, type v1, type v2, type v3)
T operator()(type v0, type v1, type v2)
T operator()(const T &v)
igenfunct_t::parameter_list_t parameter_list_t
T operator()(std::string &result, parameter_list_t parameters)
exprtk::igeneric_function< T > igenfunct_t
generic_t::scalar_view scalar_t
igenfunct_t::generic_type generic_t
static std::vector< test_t > test_cases()
unknown_symbol_resolver(const usr_mode m=e_usrmode_default)
Definition exprtk.hpp:23731
virtual bool process(const std::string &, usr_symbol_type &st, T &default_value, std::string &error_message)
Definition exprtk.hpp:23738
std::size_t size() const
Definition exprtk.hpp:4899
const value_t * end() const
Definition exprtk.hpp:4917
const value_t * begin() const
Definition exprtk.hpp:4914
store_type type
Definition exprtk.hpp:4805
T operator()(parameter_list_t)
exprtk::igeneric_function< T >::parameter_list_t parameter_list_t
T operator()(const std::size_t &, parameter_list_t params)
exprtk::igeneric_function< T >::parameter_list_t parameter_list_t
std::size_t vector_count
generic_type::scalar_view scalar_t
generic_type::string_view string_t
generic_type::vector_view vector_t
std::size_t string_count
T operator()(parameter_list_t params)
std::size_t scalar_count
exprtk::igeneric_function< T >::generic_type generic_type
exprtk::igeneric_function< T >::generic_type generic_type
T operator()(parameter_list_t params)
generic_type::scalar_view scalar_t
generic_type::string_view string_t
T operator()(const std::size_t &, parameter_list_t params)
exprtk::igeneric_function< T >::parameter_list_t parameter_list_t
generic_type::vector_view vector_t
exprtk::symbol_table< T > symbol_table_t
exprtk::parser< T >::unknown_symbol_resolver usr_t
bool process(const std::string &unknown_symbol, symbol_table_t &symbol_table, std::string &error_message)
bool process(const std::string &unknown_symbol, usr_symbol_type &st, T &default_value, std::string &error_message)
T next_value(const bool reset=false)
exprtk::parser< T >::unknown_symbol_resolver usr_t
usr_t::usr_symbol_type usr_symbol_type
T operator()(const T &v1, const T &v2)
test_result_t(const std::size_t psi, const std::string &ps)
void determine_param_seq(parameter_list_t parameters)
igfun_t::parameter_list_t parameter_list_t
igfun_t::generic_type generic_type
T operator()(const std::size_t &ps_index, std::string &result, parameter_list_t parameters)
T operator()(const std::size_t &ps_index, parameter_list_t parameters)
exprtk::igeneric_function< T > igfun_t
std::size_t current_ps_index
overload_func(const std::string &param_seq_list)
generic_type::vector_view vector_t
std::string current_param_seq
T operator()(const std::size_t &param_seq_index, std::string &result, parameter_list_t params)
generic_type::string_view string_t
igenfunc_t::parameter_list_t parameter_list_t
exprtk::igeneric_function< T > igenfunc_t
igenfunc_t::generic_type generic_type
T operator()(std::string &result, parameter_list_t params)
T operator()(const T &v)
std::string expr
std::string c
std::string a
std::string b
test_ab(const std::string &e, const std::string &v0, const std::string &v1, const T &r)
std::string expr
test_xy(const std::string &e, const T &v0, const T &v1, const T &r)
test_xyzw(const std::string &e, const T &v0, const T &v1, const T &v2, const T &v3, const T &r)
std::string expr
static std::string value()
T operator()(const std::vector< T > &arglist)
generic_type::scalar_view scalar_t
generic_type::vector_view vector_t
exprtk::igeneric_function< T >::parameter_list_t parameter_list_t
T operator()(const std::size_t &ps_index, parameter_list_t)
exprtk::igeneric_function< T >::generic_type generic_type
exprtk::igeneric_function< T >::parameter_list_t parameter_list_t
exprtk::igeneric_function< T >::generic_type generic_type
generic_type::vector_view vector_t
T operator()(parameter_list_t params)
bool handle_runtime_violation(violation_context &)