C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
exprtk_real_test.cpp
Go to the documentation of this file.
1/*
2 **************************************************************
3 * C++ Mathematical Expression Toolkit Library *
4 * *
5 * Examples and Unit-Tests using a simple custom Real 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 <numeric>
27#include <string>
28#include <vector>
29
30#include "real_type.hpp"
32#include "exprtk.hpp"
33
34
36#if __cplusplus >= 201103L
37 #define exprtk_test_override override
38 #define exprtk_test_final final
39 #define exprtk_test_delete = delete
40#else
41 #define exprtk_test_override
42 #define exprtk_test_final
43 #define exprtk_test_delete
44#endif
45
46typedef std::pair<std::string,numeric_type> test_t;
47
48static const test_t global_test_list[] =
49{
50 // Note: Each of following tests must compile down
51 // to a single literal node.
52 test_t("0",0.0),
53 test_t("1",1.0),
54 test_t("2",2.0),
55 test_t("3",3.0),
56 test_t("4",4.0),
57 test_t("5",5.0),
58 test_t("6",6.0),
59 test_t("7",7.0),
60 test_t("8",8.0),
61 test_t("9",9.0),
62 test_t("12.12",12.12),
63 test_t("123.123",123.123),
64 test_t("1234.1234",1234.1234),
65 test_t("12345.12345",12345.12345),
66 test_t("123456.123456",123456.123456),
67 test_t("0.0",0.0),
68 test_t("1.0",1.0),
69 test_t("2.0",2.0),
70 test_t("3.0",3.0),
71 test_t("4.0",4.0),
72 test_t("5.0",5.0),
73 test_t("6.0",6.0),
74 test_t("7.0",7.0),
75 test_t("8.0",8.0),
76 test_t("9.0",9.0),
77 test_t("0.0",0.0),
78 test_t("1.1",1.1),
79 test_t("2.2",2.2),
80 test_t("3.3",3.3),
81 test_t("4.4",4.4),
82 test_t("5.5",5.5),
83 test_t("6.6",6.6),
84 test_t("7.7",7.7),
85 test_t("8.8",8.8),
86 test_t("9.9",9.9),
87 test_t("+0",0.0),
88 test_t("+1",1.0),
89 test_t("+2",2.0),
90 test_t("+3",3.0),
91 test_t("+4",4.0),
92 test_t("+5",5.0),
93 test_t("+6",6.0),
94 test_t("+7",7.0),
95 test_t("+8",8.0),
96 test_t("+9",9.0),
97 test_t("+0.0",0.0),
98 test_t("+1.0",1.0),
99 test_t("+2.0",2.0),
100 test_t("+3.0",3.0),
101 test_t("+4.0",4.0),
102 test_t("+5.0",5.0),
103 test_t("+6.0",6.0),
104 test_t("+7.0",7.0),
105 test_t("+8.0",8.0),
106 test_t("+9.0",9.0),
107 test_t("+0.0",0.0),
108 test_t("+1.1",1.1),
109 test_t("+2.2",2.2),
110 test_t("+3.3",3.3),
111 test_t("+4.4",4.4),
112 test_t("+5.5",5.5),
113 test_t("+6.6",6.6),
114 test_t("+7.7",7.7),
115 test_t("+8.8",8.8),
116 test_t("+9.9",9.9),
117 test_t("-0",-0.0),
118 test_t("-1",-1.0),
119 test_t("-2",-2.0),
120 test_t("-3",-3.0),
121 test_t("-4",-4.0),
122 test_t("-5",-5.0),
123 test_t("-6",-6.0),
124 test_t("-7",-7.0),
125 test_t("-8",-8.0),
126 test_t("-9",-9.0),
127 test_t("-0.0",-0.0),
128 test_t("-1.0",-1.0),
129 test_t("-2.0",-2.0),
130 test_t("-3.0",-3.0),
131 test_t("-4.0",-4.0),
132 test_t("-5.0",-5.0),
133 test_t("-6.0",-6.0),
134 test_t("-7.0",-7.0),
135 test_t("-8.0",-8.0),
136 test_t("-9.0",-9.0),
137 test_t("-0.0",-0.0),
138 test_t("-1.1",-1.1),
139 test_t("-2.2",-2.2),
140 test_t("-3.3",-3.3),
141 test_t("-4.4",-4.4),
142 test_t("-5.5",-5.5),
143 test_t("-6.6",-6.6),
144 test_t("-7.7",-7.7),
145 test_t("-8.8",-8.8),
146 test_t("-9.9",-9.9),
147 test_t("0.0e+0" ,+0.0e+0),
148 test_t("1.1e+1" ,+1.1e+1),
149 test_t("2.2e+2" ,+2.2e+2),
150 test_t("3.3e+3" ,+3.3e+3),
151 test_t("4.4e+4" ,+4.4e+4),
152 test_t("5.5e+5" ,+5.5e+5),
153 test_t("6.6e+6" ,+6.6e+6),
154 test_t("7.7e+7" ,+7.7e+7),
155 test_t("8.8e+8" ,+8.8e+8),
156 test_t("9.9e+9" ,+9.9e+9),
157 test_t("-0.0e+0",-0.0e+0),
158 test_t("-1.1e+1",-1.1e+1),
159 test_t("-2.2e+2",-2.2e+2),
160 test_t("-3.3e+3",-3.3e+3),
161 test_t("-4.4e+4",-4.4e+4),
162 test_t("-5.5e+5",-5.5e+5),
163 test_t("-6.6e+6",-6.6e+6),
164 test_t("-7.7e+7",-7.7e+7),
165 test_t("-8.8e+8",-8.8e+8),
166 test_t("-9.9e+9",-9.9e+9),
167 test_t("0.0E+0" ,+0.0E+0),
168 test_t("1.1E+1" ,+1.1E+1),
169 test_t("2.2E+2" ,+2.2E+2),
170 test_t("3.3E+3" ,+3.3E+3),
171 test_t("4.4E+4" ,+4.4E+4),
172 test_t("5.5E+5" ,+5.5E+5),
173 test_t("6.6E+6" ,+6.6E+6),
174 test_t("7.7E+7" ,+7.7E+7),
175 test_t("8.8E+8" ,+8.8E+8),
176 test_t("9.9E+9" ,+9.9E+9),
177 test_t("-0.0E+0",-0.0E+0),
178 test_t("-1.1E+1",-1.1E+1),
179 test_t("-2.2E+2",-2.2E+2),
180 test_t("-3.3E+3",-3.3E+3),
181 test_t("-4.4E+4",-4.4E+4),
182 test_t("-5.5E+5",-5.5E+5),
183 test_t("-6.6E+6",-6.6E+6),
184 test_t("-7.7E+7",-7.7E+7),
185 test_t("-8.8E+8",-8.8E+8),
186 test_t("-9.9E+9",-9.9E+9),
187 test_t("(0)",0.0),
188 test_t("(1)",1.0),
189 test_t("(2)",2.0),
190 test_t("(3)",3.0),
191 test_t("(4)",4.0),
192 test_t("(5)",5.0),
193 test_t("(6)",6.0),
194 test_t("(7)",7.0),
195 test_t("(8)",8.0),
196 test_t("(9)",9.0),
197 test_t("(0.0)",0.0),
198 test_t("(1.0)",1.0),
199 test_t("(2.0)",2.0),
200 test_t("(3.0)",3.0),
201 test_t("(4.0)",4.0),
202 test_t("(5.0)",5.0),
203 test_t("(6.0)",6.0),
204 test_t("(7.0)",7.0),
205 test_t("(8.0)",8.0),
206 test_t("(9.0)",9.0),
207 test_t("(0.0)",0.0),
208 test_t("(1.1)",1.1),
209 test_t("(2.2)",2.2),
210 test_t("(3.3)",3.3),
211 test_t("(4.4)",4.4),
212 test_t("(5.5)",5.5),
213 test_t("(6.6)",6.6),
214 test_t("(7.7)",7.7),
215 test_t("(8.8)",8.8),
216 test_t("(9.9)",9.9),
217 test_t("(+0)" ,0.0),
218 test_t("(+1)" ,1.0),
219 test_t("(+2)" ,2.0),
220 test_t("(+3)" ,3.0),
221 test_t("(+4)" ,4.0),
222 test_t("(+5)" ,5.0),
223 test_t("(+6)" ,6.0),
224 test_t("(+7)" ,7.0),
225 test_t("(+8)" ,8.0),
226 test_t("(+9)" ,9.0),
227 test_t("(+0.0)",0.0),
228 test_t("(+1.0)",1.0),
229 test_t("(+2.0)",2.0),
230 test_t("(+3.0)",3.0),
231 test_t("(+4.0)",4.0),
232 test_t("(+5.0)",5.0),
233 test_t("(+6.0)",6.0),
234 test_t("(+7.0)",7.0),
235 test_t("(+8.0)",8.0),
236 test_t("(+9.0)",9.0),
237 test_t("(+0.0)",0.0),
238 test_t("(+1.1)",1.1),
239 test_t("(+2.2)",2.2),
240 test_t("(+3.3)",3.3),
241 test_t("(+4.4)",4.4),
242 test_t("(+5.5)",5.5),
243 test_t("(+6.6)",6.6),
244 test_t("(+7.7)",7.7),
245 test_t("(+8.8)",8.8),
246 test_t("(+9.9)",9.9),
247 test_t("(-0)" ,-0.0),
248 test_t("(-1)" ,-1.0),
249 test_t("(-2)" ,-2.0),
250 test_t("(-3)" ,-3.0),
251 test_t("(-4)" ,-4.0),
252 test_t("(-5)" ,-5.0),
253 test_t("(-6)" ,-6.0),
254 test_t("(-7)" ,-7.0),
255 test_t("(-8)" ,-8.0),
256 test_t("(-9)" ,-9.0),
257 test_t("(-0.0)",-0.0),
258 test_t("(-1.0)",-1.0),
259 test_t("(-2.0)",-2.0),
260 test_t("(-3.0)",-3.0),
261 test_t("(-4.0)",-4.0),
262 test_t("(-5.0)",-5.0),
263 test_t("(-6.0)",-6.0),
264 test_t("(-7.0)",-7.0),
265 test_t("(-8.0)",-8.0),
266 test_t("(-9.0)",-9.0),
267 test_t("(-0.0)",-0.0),
268 test_t("(-1.1)",-1.1),
269 test_t("(-2.2)",-2.2),
270 test_t("(-3.3)",-3.3),
271 test_t("(-4.4)",-4.4),
272 test_t("(-5.5)",-5.5),
273 test_t("(-6.6)",-6.6),
274 test_t("(-7.7)",-7.7),
275 test_t("(-8.8)",-8.8),
276 test_t("(-9.9)",-9.9),
277 test_t("-(1.1)",-1.1),
278 test_t("-(1.1+2.2)",-3.3),
279 test_t("1234567890",1234567890),
280 test_t("123456789.0",123456789.0),
281 test_t("+1234567890",1234567890),
282 test_t("+123456789.0",123456789.0),
283 test_t("-1234567890",-1234567890),
284 test_t("-123456789.0",-123456789.0),
285 test_t("1234.567890",1234.567890),
286 test_t("-1234.567890",-1234.567890),
287 test_t("0+9",9.0),
288 test_t("1+8",9.0),
289 test_t("2+7",9.0),
290 test_t("3+6",9.0),
291 test_t("4+5",9.0),
292 test_t("5+4",9.0),
293 test_t("6+3",9.0),
294 test_t("7+2",9.0),
295 test_t("8+1",9.0),
296 test_t("9+0",9.0),
297 test_t(" 0 + 9 ",9.0),
298 test_t(" 1 + 8 ",9.0),
299 test_t(" 2 + 7 ",9.0),
300 test_t(" 3 + 6 ",9.0),
301 test_t(" 4 + 5 ",9.0),
302 test_t(" 5 + 4 ",9.0),
303 test_t(" 6 + 3 ",9.0),
304 test_t(" 7 + 2 ",9.0),
305 test_t(" 8 + 1 ",9.0),
306 test_t(" 9 + 0 ",9.0),
307 test_t("( 0 + 9 )",9.0),
308 test_t("( 1 + 8 )",9.0),
309 test_t("( 2 + 7 )",9.0),
310 test_t("( 3 + 6 )",9.0),
311 test_t("( 4 + 5 )",9.0),
312 test_t("( 5 + 4 )",9.0),
313 test_t("( 6 + 3 )",9.0),
314 test_t("( 7 + 2 )",9.0),
315 test_t("( 8 + 1 )",9.0),
316 test_t("( 9 + 0 )",9.0),
317 test_t("1E1+1",11.0),
318 test_t("1e1+1",11.0),
319 test_t("1E1-1", 9.0),
320 test_t("1e1-1", 9.0),
321 test_t("1E01+1",11.0),
322 test_t("1e01+1",11.0),
323 test_t("1E01-1", 9.0),
324 test_t("1e01-1", 9.0),
325 test_t("1+2",+3.0),
326 test_t("1-2",-1.0),
327 test_t("1*2",+2.0),
328 test_t("1/2",+0.5),
329 test_t("1.1+2.2", +3.3),
330 test_t("1.1-2.2", -1.1),
331 test_t("1.1*2.2",+2.42),
332 test_t("1.1/2.2", +0.5),
333 test_t("0-9",-9.0),
334 test_t("1-8",-7.0),
335 test_t("2-7",-5.0),
336 test_t("3-6",-3.0),
337 test_t("4-5",-1.0),
338 test_t("5-4",+1.0),
339 test_t("6-3",+3.0),
340 test_t("7-2",+5.0),
341 test_t("8-1",+7.0),
342 test_t("9-0",+9.0),
343 test_t("2.*3",+6.0),
344 test_t("2.*3.",+6.0),
345 test_t("2.+3",+5.0),
346 test_t("2.+3.",+5.0),
347 test_t("123.*456.",+56088.0),
348 test_t(" 0 - 9 ",-9.0),
349 test_t(" 1 - 8 ",-7.0),
350 test_t(" 2 - 7 ",-5.0),
351 test_t(" 3 - 6 ",-3.0),
352 test_t(" 4 - 5 ",-1.0),
353 test_t(" 5 - 4 ",+1.0),
354 test_t(" 6 - 3 ",+3.0),
355 test_t(" 7 - 2 ",+5.0),
356 test_t(" 8 - 1 ",+7.0),
357 test_t(" 9 - 0 ",+9.0),
358 test_t("( 0 - 9 )",-9.0),
359 test_t("( 1 - 8 )",-7.0),
360 test_t("( 2 - 7 )",-5.0),
361 test_t("( 3 - 6 )",-3.0),
362 test_t("( 4 - 5 )",-1.0),
363 test_t("( 5 - 4 )",+1.0),
364 test_t("( 6 - 3 )",+3.0),
365 test_t("( 7 - 2 )",+5.0),
366 test_t("( 8 - 1 )",+7.0),
367 test_t("( 9 - 0 )",+9.0),
368 test_t("1 - -1" , 2.0),
369 test_t("1 --1" , 2.0),
370 test_t("1-- 1" , 2.0),
371 test_t("1--1" , 2.0),
372 test_t("1 -- -1", 0.0),
373 test_t("1 + -1" , 0.0),
374 test_t("1 +-1" , 0.0),
375 test_t("1+- 1" , 0.0),
376 test_t("1+-1" , 0.0),
377 test_t("1 +- -1", 2.0),
378 test_t("1 + +1" , 2.0),
379 test_t("1 ++1" , 2.0),
380 test_t("1 - -1 + 1" , 3.0),
381 test_t("1 --1 + 1" , 3.0),
382 test_t("1-- 1 + 1" , 3.0),
383 test_t("1--1 + 1" , 3.0),
384 test_t("1 -- -1 + 1", 1.0),
385 test_t("1 + -1 + 1" , 1.0),
386 test_t("1 +-1 + 1" , 1.0),
387 test_t("1+- 1 + 1" , 1.0),
388 test_t("1+-1 + 1" , 1.0),
389 test_t("1 +- -1 + 1", 3.0),
390 test_t("1 + +1 + 1" , 3.0),
391 test_t("1 ++1 + 1" , 3.0),
392 test_t("1 - -1 - 1" , 1.0),
393 test_t("1 --1 - 1" , 1.0),
394 test_t("1-- 1 - 1" , 1.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+2)",-3.0),
405 test_t("+(1+2)",+3.0),
406 test_t("+(1-2)",-1.0),
407 test_t("-(1-2)",+1.0),
408 test_t("(-3*-6)",+18.0),
409 test_t("(-6*-3)",+18.0),
410 test_t("-(-3*-6)",-18.0),
411 test_t("-(-6*-3)",-18.0),
412 test_t("1.1+2.2+3.3",+6.6),
413 test_t("+1.1+2.2+3.3",+6.6),
414 test_t("-1.1-2.2-3.3",-6.6),
415 test_t("1.1*2.2*3.3",+7.986),
416 test_t("+1.1*2.2*3.3",+7.986),
417 test_t("-1.1*-2.2*-3.3",-7.986),
418 test_t("1 + 1/2",+1.5),
419 test_t("1 + (1/2)",+1.5),
420 test_t("1.1 + 1.1/2.2",+1.6),
421 test_t("1.1 + (1.1/2.2)",+1.6),
422 test_t("2 * 1/2",+1.0),
423 test_t("2 * (1/2)",+1.0),
424 test_t("2.2 * 1.1/2.2",+1.1),
425 test_t("2.2 * (1.1/2.2)",+1.1),
426 test_t("1^2",1.0),
427 test_t("2^1",2.0),
428 test_t("2^3",8.0),
429 test_t("-2^3",-8.0),
430 test_t("-2^4",-16.0),
431 test_t("(-2)^3",-8.0),
432 test_t("(-2)^4",+16.0),
433 test_t("3^2^4",43046721.0),
434 test_t("1.1^2.2",1.23328630055466251099),
435 test_t("2.2^1.1",2.3804822576003541627),
436 test_t("2.2^3.3",13.48946876053338489127),
437 test_t("3.3^2.2^1.1",17.15193942371376191362),
438 test_t("+3.3^2.2^1.1",17.15193942371376191362),
439 test_t("3.3^+2.2^1.1",17.15193942371376191362),
440 test_t("3.3^2.2^+1.1",17.15193942371376191362),
441 test_t("3.3^2.2^-1.1",1.65127293793867959137),
442 test_t("+3.3^+2.2^-1.1",1.65127293793867959137),
443 test_t("1.1^(1.1 * 2.2)",1.25941916576299080582),
444 test_t("2.2^(1.1 * 3.3)",17.49823848953534759743),
445 test_t("3.3^(1.1 * 2.2)",17.98058156638874965269),
446 test_t("1.1^-2.2/1.1",0.73712884727743375853),
447 test_t("1.1^+2.2/1.1",1.121169364140602282717273261774),
448 test_t("1.1^2.2/+1.1",1.121169364140602282717273261774),
449 test_t("1.1^+2.2/+1.1",1.121169364140602282717273261774),
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",0.73712884727743375853),
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",1.121169364140602282717273261774),
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("equal(1.23^3,(1.23 * 1.23 * 1.23))",1.0),
461 test_t("equal(1.23^-3,1/(1.23 * 1.23 * 1.23))",1.0),
462 test_t("equal((2.1 + 1.23^3),(2.1 + [1.23 * 1.23 * 1.23]))",1.0),
463 test_t("equal((2.1 - 1.23^3),(2.1 - [1.23 * 1.23 * 1.23]))",1.0),
464 test_t("equal((2.1 * 1.23^3),(2.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((1.23^3 + 2.1),({1.23 * 1.23 * 1.23} + 2.1))",1.0),
467 test_t("equal((1.23^3 - 2.1),({1.23 * 1.23 * 1.23} - 2.1))",1.0),
468 test_t("equal((1.23^3 * 2.1),({1.23 * 1.23 * 1.23} * 2.1))",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.0^(1.0/2.0),sqrt(1.0))",1.0),
471 test_t("equal(1.0^(1.0/2.0),root(1.0,2.0))",1.0),
472 test_t("equal(1.0^(1.0/3.0),root(1.0,3.0))",1.0),
473 test_t("equal(1.0^(1.0/4.0),root(1.0,4.0))",1.0),
474 test_t("equal(1.0^(1.0/5.0),root(1.0,5.0))",1.0),
475 test_t("equal(1.0^(1.0/6.0),root(1.0,6.0))",1.0),
476 test_t("equal(1.0^(1.0/7.0),root(1.0,7.0))",1.0),
477 test_t("equal(1.0^(1.0/8.0),root(1.0,8.0))",1.0),
478 test_t("equal(1.0^(1.0/9.0),root(1.0,9.0))",1.0),
479 test_t("equal(2.0^(1.0/2.0),sqrt(2.0))",1.0),
480 test_t("equal(2.0^(1.0/2.0),root(2.0,2.0))",1.0),
481 test_t("equal(3.0^(1.0/3.0),root(3.0,3.0))",1.0),
482 test_t("equal(4.0^(1.0/4.0),root(4.0,4.0))",1.0),
483 test_t("equal(5.0^(1.0/5.0),root(5.0,5.0))",1.0),
484 test_t("equal(6.0^(1.0/6.0),root(6.0,6.0))",1.0),
485 test_t("equal(7.0^(1.0/7.0),root(7.0,7.0))",1.0),
486 test_t("equal(8.0^(1.0/8.0),root(8.0,8.0))",1.0),
487 test_t("equal(9.0^(1.0/9.0),root(9.0,9.0))",1.0),
488 test_t("1 < 2", 1.0),
489 test_t("1 <= 2", 1.0),
490 test_t("1.1 <= 2.2", 1.0),
491 test_t("(1.0 + 0.1) <= (2.0 + 0.2)", 1.0),
492 test_t("1 > 2", 0.0),
493 test_t("1 >= 2", 0.0),
494 test_t("1.1 >= 2.2", 0.0),
495 test_t("(1.0 + 0.1) >= (2.0 + 0.2)", 0.0),
496 test_t("1 <> 2", 1.0),
497 test_t("1 != 2", 1.0),
498 test_t("1.1 <> 2.2", 1.0),
499 test_t("1.1 != 2.2", 1.0),
500 test_t("(1.0 + 0.1) <> (2.0 + 0.2)", 1.0),
501 test_t("(1.0 + 0.1) != (2.0 + 0.2)", 1.0),
502 test_t("1 == 1", 1.0),
503 test_t("1.1 == 1.1", 1.0),
504 test_t("1 = 1", 1.0),
505 test_t("1.1 = 1.1", 1.0),
506 test_t("1 <> 1", 0.0),
507 test_t("1 != 1", 0.0),
508 test_t("1.1 <> 1.1", 0.0),
509 test_t("1.1 != 1.1", 0.0),
510 test_t("(1.0 + 0.1) <> (1.0 + 0.1)", 0.0),
511 test_t("(1.0 + 0.1) != (1.0 + 0.1)", 0.0),
512 test_t("equal(1.1,1.1)",1.0),
513 test_t("equal(1.1,2.2)",0.0),
514 test_t("not_equal(1.1,1.1)",0.0),
515 test_t("not_equal(1.1,2.2)",1.0),
516 test_t("1 and 1",1.0),
517 test_t("1 and 0",0.0),
518 test_t("0 and 1",0.0),
519 test_t("0 and 0",0.0),
520 test_t("1.0 and 1.0",1.0),
521 test_t("1.0 and 0.0",0.0),
522 test_t("0.0 and 1.0",0.0),
523 test_t("0.0 and 0.0",0.0),
524 test_t("(1 and 1)",1.0),
525 test_t("(1 and 0)",0.0),
526 test_t("(0 and 1)",0.0),
527 test_t("(0 and 0)",0.0),
528 test_t("(1.0 and 1.0)",1.0),
529 test_t("(1.0 and 0.0)",0.0),
530 test_t("(0.0 and 1.0)",0.0),
531 test_t("(0.0 and 0.0)",0.0),
532 test_t("1 or 1",1.0),
533 test_t("1 or 0",1.0),
534 test_t("0 or 1",1.0),
535 test_t("0 or 0",0.0),
536 test_t("1.0 or 1.0",1.0),
537 test_t("1.0 or 0.0",1.0),
538 test_t("0.0 or 1.0",1.0),
539 test_t("0.0 or 0.0",0.0),
540 test_t("(1 or 1)",1.0),
541 test_t("(1 or 0)",1.0),
542 test_t("(0 or 1)",1.0),
543 test_t("(0 or 0)",0.0),
544 test_t("(1.0 or 1.0)",1.0),
545 test_t("(1.0 or 0.0)",1.0),
546 test_t("(0.0 or 1.0)",1.0),
547 test_t("(0.0 or 0.0)",0.0),
548 test_t("1 nand 1",0.0),
549 test_t("1 nand 0",1.0),
550 test_t("0 nand 1",1.0),
551 test_t("0 nand 0",1.0),
552 test_t("1.0 nand 1.0",0.0),
553 test_t("1.0 nand 0.0",1.0),
554 test_t("0.0 nand 1.0",1.0),
555 test_t("0.0 nand 0.0",1.0),
556 test_t("(1 nand 1)",0.0),
557 test_t("(1 nand 0)",1.0),
558 test_t("(0 nand 1)",1.0),
559 test_t("(0 nand 0)",1.0),
560 test_t("(1.0 nand 1.0)",0.0),
561 test_t("(1.0 nand 0.0)",1.0),
562 test_t("(0.0 nand 1.0)",1.0),
563 test_t("(0.0 nand 0.0)",1.0),
564 test_t("1 nor 1",0.0),
565 test_t("1 nor 0",0.0),
566 test_t("0 nor 1",0.0),
567 test_t("0 nor 0",1.0),
568 test_t("1.0 nor 1.0",0.0),
569 test_t("1.0 nor 0.0",0.0),
570 test_t("0.0 nor 1.0",0.0),
571 test_t("0.0 nor 0.0",1.0),
572 test_t("(1 nor 1)",0.0),
573 test_t("(1 nor 0)",0.0),
574 test_t("(0 nor 1)",0.0),
575 test_t("(0 nor 0)",1.0),
576 test_t("(1.0 nor 1.0)",0.0),
577 test_t("(1.0 nor 0.0)",0.0),
578 test_t("(0.0 nor 1.0)",0.0),
579 test_t("(0.0 nor 0.0)",1.0),
580 test_t("0 xor 0",0.0),
581 test_t("0 xor 1",1.0),
582 test_t("1 xor 0",1.0),
583 test_t("1 xor 1",0.0),
584 test_t("0.0 xor 0.0",0.0),
585 test_t("0.0 xor 1.0",1.0),
586 test_t("1.0 xor 0.0",1.0),
587 test_t("1.0 xor 1.0",0.0),
588 test_t("(0 xor 0)",0.0),
589 test_t("(0 xor 1)",1.0),
590 test_t("(1 xor 0)",1.0),
591 test_t("(1 xor 1)",0.0),
592 test_t("(0.0 xor 0.0)",0.0),
593 test_t("(0.0 xor 1.0)",1.0),
594 test_t("(1.0 xor 0.0)",1.0),
595 test_t("(1.0 xor 1.0)",0.0),
596 test_t("1 & 1",1.0),
597 test_t("1 & 0",0.0),
598 test_t("0 & 1",0.0),
599 test_t("0 & 0",0.0),
600 test_t("1.0 & 1.0",1.0),
601 test_t("1.0 & 0.0",0.0),
602 test_t("0.0 & 1.0",0.0),
603 test_t("0.0 & 0.0",0.0),
604 test_t("(1 & 1)",1.0),
605 test_t("(1 & 0)",0.0),
606 test_t("(0 & 1)",0.0),
607 test_t("(0 & 0)",0.0),
608 test_t("(1.0 & 1.0)",1.0),
609 test_t("(1.0 & 0.0)",0.0),
610 test_t("(0.0 & 1.0)",0.0),
611 test_t("(0.0 & 0.0)",0.0),
612 test_t("1 | 1",1.0),
613 test_t("1 | 0",1.0),
614 test_t("0 | 1",1.0),
615 test_t("0 | 0",0.0),
616 test_t("1.0 | 1.0",1.0),
617 test_t("1.0 | 0.0",1.0),
618 test_t("0.0 | 1.0",1.0),
619 test_t("0.0 | 0.0",0.0),
620 test_t("(1 | 1)",1.0),
621 test_t("(1 | 0)",1.0),
622 test_t("(0 | 1)",1.0),
623 test_t("(0 | 0)",0.0),
624 test_t("(1.0 | 1.0)",1.0),
625 test_t("(1.0 | 0.0)",1.0),
626 test_t("(0.0 | 1.0)",1.0),
627 test_t("(0.0 | 0.0)",0.0),
628 test_t("(1 nand 1) == not(1 and 1)",1.0),
629 test_t("(1 nand 0) == not(1 and 0)",1.0),
630 test_t("(0 nand 1) == not(0 and 1)",1.0),
631 test_t("(0 nand 0) == not(0 and 0)",1.0),
632 test_t("(1 nor 1) == not(1 or 1)",1.0),
633 test_t("(1 nor 0) == not(1 or 0)",1.0),
634 test_t("(0 nor 1) == not(0 or 1)",1.0),
635 test_t("(0 nor 0) == not(0 or 0)",1.0),
636 test_t("(1.0 nand 1.0) == not(1.0 and 1.0)",1.0),
637 test_t("(1.0 nand 0.0) == not(1.0 and 0.0)",1.0),
638 test_t("(0.0 nand 1.0) == not(0.0 and 1.0)",1.0),
639 test_t("(0.0 nand 0.0) == not(0.0 and 0.0)",1.0),
640 test_t("(1.0 nor 1.0) == not(1.0 or 1.0)",1.0),
641 test_t("(1.0 nor 0.0) == not(1.0 or 0.0)",1.0),
642 test_t("(0.0 nor 1.0) == not(0.0 or 1.0)",1.0),
643 test_t("(0.0 nor 0.0) == not(0.0 or 0.0)",1.0),
644 test_t("(1 nand 1) == not(1 & 1)",1.0),
645 test_t("(1 nand 0) == not(1 & 0)",1.0),
646 test_t("(0 nand 1) == not(0 & 1)",1.0),
647 test_t("(0 nand 0) == not(0 & 0)",1.0),
648 test_t("(1 nor 1) == not(1 | 1)",1.0),
649 test_t("(1 nor 0) == not(1 | 0)",1.0),
650 test_t("(0 nor 1) == not(0 | 1)",1.0),
651 test_t("(0 nor 0) == not(0 | 0)",1.0),
652 test_t("(1.0 nand 1.0) == not(1.0 & 1.0)",1.0),
653 test_t("(1.0 nand 0.0) == not(1.0 & 0.0)",1.0),
654 test_t("(0.0 nand 1.0) == not(0.0 & 1.0)",1.0),
655 test_t("(0.0 nand 0.0) == not(0.0 & 0.0)",1.0),
656 test_t("(1.0 nor 1.0) == not(1.0 | 1.0)",1.0),
657 test_t("(1.0 nor 0.0) == not(1.0 | 0.0)",1.0),
658 test_t("(0.0 nor 1.0) == not(0.0 | 1.0)",1.0),
659 test_t("(0.0 nor 0.0) == not(0.0 | 0.0)",1.0),
660 test_t("mand(1,1)",1.0),
661 test_t("mand(1,0)",0.0),
662 test_t("mand(0,1)",0.0),
663 test_t("mand(0,0)",0.0),
664 test_t("mand(1.0,1.0)",1.0),
665 test_t("mand(1.0,0.0)",0.0),
666 test_t("mand(0.0,1.0)",0.0),
667 test_t("mand(0.0,0.0)",0.0),
668 test_t("mor(1,1)",1.0),
669 test_t("mor(1,0)",1.0),
670 test_t("mor(0,1)",1.0),
671 test_t("mor(0,0)",0.0),
672 test_t("mor(1.0,1.0)",1.0),
673 test_t("mor(1.0,0.0)",1.0),
674 test_t("mor(0.0,1.0)",1.0),
675 test_t("mor(0.0,0.0)",0.0),
676 test_t("(1 nand 1) == not(mand(1,1))",1.0),
677 test_t("(1 nand 0) == not(mand(1,0))",1.0),
678 test_t("(0 nand 1) == not(mand(0,1))",1.0),
679 test_t("(0 nand 0) == not(mand(0,0))",1.0),
680 test_t("(1 nor 1) == not(mor(1,1))",1.0),
681 test_t("(1 nor 0) == not(mor(1,0))",1.0),
682 test_t("(0 nor 1) == not(mor(0,1))",1.0),
683 test_t("(0 nor 0) == not(mor(0,0))",1.0),
684 test_t("(1.0 nand 1.0) == not(mand(1.0,1.0))",1.0),
685 test_t("(1.0 nand 0.0) == not(mand(1.0,0.0))",1.0),
686 test_t("(0.0 nand 1.0) == not(mand(0.0,1.0))",1.0),
687 test_t("(0.0 nand 0.0) == not(mand(0.0,0.0))",1.0),
688 test_t("(1.0 nor 1.0) == not(mor(1.0,1.0))",1.0),
689 test_t("(1.0 nor 0.0) == not(mor(1.0,0.0))",1.0),
690 test_t("(0.0 nor 1.0) == not(mor(0.0,1.0))",1.0),
691 test_t("(0.0 nor 0.0) == not(mor(0.0,0.0))",1.0),
692 test_t("abs(1)",1.0),
693 test_t("abs(-1)",1.0),
694 test_t("abs(1.0)",1.0),
695 test_t("abs(-1.0)",1.0),
696 test_t("min(1,2)",1.0),
697 test_t("min(1,2,3)",1.0),
698 test_t("min(1,2,3,4)",1.0),
699 test_t("min(1,2,3,4,5)",1.0),
700 test_t("min(1,2,3,4,5,6)",1.0),
701 test_t("min(1.1,2.2)",1.1),
702 test_t("min(1.1,2.2,3.3)",1.1),
703 test_t("min(1.1,2.2,3.3,4.4)",1.1),
704 test_t("min(1.1,2.2,3.3,4.4,5.5)",1.1),
705 test_t("min(1.1,2.2,3.3,4.4,5.5,6.6)",1.1),
706 test_t("min(min(1,2),min(3,4))",1.0),
707 test_t("max(1,2)",2.0),
708 test_t("max(1,2,3)",3.0),
709 test_t("max(1,2,3,4)",4.0),
710 test_t("max(1,2,3,4,5)",5.0),
711 test_t("max(1,2,3,4,5,6)",6.0),
712 test_t("max(1.1,2.2)",2.2),
713 test_t("max(1.1,2.2,3.3)",3.3),
714 test_t("max(1.1,2.2,3.3,4.4)",4.4),
715 test_t("max(1.1,2.2,3.3,4.4,5.5)",5.5),
716 test_t("max(1.1,2.2,3.3,4.4,5.5,6.6)",6.6),
717 test_t("max(max(1,2),max(3,4))",4.0),
718 test_t("avg(1,2)",1.5),
719 test_t("avg(1,2,3)",2.0),
720 test_t("avg(1,2,3,4)",2.5),
721 test_t("avg(1,2,3,4,5)",3.0),
722 test_t("avg(1.1,2.2)",1.65),
723 test_t("avg(1.1,2.2,3.3)",2.2),
724 test_t("avg(1.1,2.2,3.3,4.4)",2.75),
725 test_t("avg(1.1,2.2,3.3,4.4,5.5)",3.3),
726 test_t("avg(1.1,2.2,3.3,4.4,5.5,6.6)",3.85),
727 test_t("sum(1,2)",3.0),
728 test_t("sum(1,2,3)",6.0),
729 test_t("sum(1,2,3,4)",10),
730 test_t("sum(1,2,3,4,5)",15.0),
731 test_t("sum(1,2,3,4,5,6)",21),
732 test_t("sum(1.1,2.2)",3.3),
733 test_t("sum(1.1,2.2,3.3)",6.6),
734 test_t("sum(1.1,2.2,3.3,4.4)",11.0),
735 test_t("sum(1.1,2.2,3.3,4.4,5.5)",16.5),
736 test_t("sum(1.1,2.2,3.3,4.4,5.5,6.6)",23.1),
737 test_t("mul(1,2)",2.0),
738 test_t("mul(1,2,3)",6.0),
739 test_t("mul(1,2,3,4)",24.0),
740 test_t("mul(1,2,3,4,5)",120.0),
741 test_t("mul(1,2,3,4,5,6)",720.0),
742 test_t("mul(1.1,2.2)",2.42),
743 test_t("mul(1.1,2.2,3.3)",7.986),
744 test_t("mul(1.1,2.2,3.3,4.4)",35.1384),
745 test_t("mul(1.1,2.2,3.3,4.4,5.5)",193.2612),
746 test_t("mul(1.1,2.2,3.3,4.4,5.5,6.6)",1275.52392),
747 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),
748 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),
749 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),
750 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),
751 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),
752 test_t("floor(1.0)",1.0),
753 test_t("floor(1.1)",1.0),
754 test_t("floor(-1.0)",-1.0),
755 test_t("floor(-1.1)",-2.0),
756 test_t("ceil(1.0)",1.0),
757 test_t("ceil(1.1)",2.0),
758 test_t("ceil(-1.0)",-1.0),
759 test_t("ceil(-1.1)",-1.0),
760 test_t("round(1.1)",1.0),
761 test_t("round(1.49)",1.0),
762 test_t("round(1.5)",2.0),
763 test_t("round(1.9)",2.0),
764 test_t("roundn(1/3,2)",0.33),
765 test_t("roundn(1/3,5)",0.33333),
766 test_t("roundn(2/3,2)",0.67),
767 test_t("roundn(2/3,5)",0.66667),
768 test_t("roundn(1.0/3.0,2.0)",0.33),
769 test_t("roundn(1.0/3.0,5.0)",0.33333),
770 test_t("roundn(2.0/3.0,2.0)",0.67),
771 test_t("roundn(2.0/3.0,5.0)",0.66667),
772 test_t("cos(0.0)",1.0),
773 test_t("sin(0.0)",0.0),
774 test_t("equal(sin(pi/4.0),cos(pi/4.0))",1.0),
775 test_t("equal(sin(pi/6.0),cos(pi/3.0))",1.0),
776 test_t("(sin(pi/4.0) - cos(pi/4.0)) <= epsilon",1.0),
777 test_t("(cos(pi/3.0) - sin(pi/6.0)) <= epsilon",1.0),
778 test_t("sin(deg2rad(30))",0.5),
779 test_t("cos(deg2rad(60))",0.5),
780 test_t("sin(deg2rad(30)) + cos(deg2rad(60))",1.0),
781 test_t("equal(sin(deg2rad(30))/cos(deg2rad(30)),tan(deg2rad(30)))",1.0),
782 test_t("equal(sinh(pi),11.5487393572577483779773343153884) ",1.0),
783 test_t("equal(asinh(11.5487393572577483779773343153884),pi)",1.0),
784 test_t("equal(cosh(pi),11.5919532755215206277517520525601) ",1.0),
785 test_t("equal(acosh(11.5919532755215206277517520525601),pi)",1.0),
786 test_t("equal(tanh(pi),0.99627207622074994426469058001253) ",1.0),
787 test_t("equal(atanh(0.99627207622074994426469058001253),pi)",1.0),
788 test_t("exp(1.0)",2.71828182845904523536028747135266249775724),
789 test_t("exp(0.0)",1.0),
790 test_t("log(2.7182818284590451)",1.0),
791 test_t("log10(10.0)",1.0),
792 test_t("frac(12.34) + trunc(12.34)",12.34),
793 test_t("hypot(3.0,4.0)",5.0),
794 test_t("hypot(1.0,sqrt(3.0))",2.0),
795 test_t("if(1 < 2, 3, 4)",3.0),
796 test_t("if(1.1 < 2.2, 3.3, 4.4)",3.3),
797 test_t("if((1.0+1.1) < (2.0+1.2), 3.3, 4.4)",3.3),
798 test_t("if(1 = 2, 3, 4)",4.0),
799 test_t("if(1.1 = 2.2, 3.3, 4.4)",4.4),
800 test_t("if((1.0+1.1) = (2.0+1.2), 3.3, 4.4)",4.4),
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.0 + 2.0) == 3.0) and ((4.0 + 5.0) < 9.0),1,2)",2.0),
808 test_t("(3.0 - 1.0 - 2.0) == ((3.0 - 1.0) - 2.0)",1.0),
809 test_t("true == true",1.0),
810 test_t("false == false",1.0),
811 test_t("true != false",1.0),
812 test_t("false != true",1.0),
813 test_t("(1 < 2) == true",1.0),
814 test_t("(1 > 2) == false",1.0),
815 test_t("true == (1 < 2)",1.0),
816 test_t("false == (1 > 2)",1.0),
817 test_t("(1 > 2) != true",1.0),
818 test_t("(1 < 2) != false",1.0),
819 test_t("true != (1 > 2)",1.0),
820 test_t("false != (1 < 2)",1.0),
821 test_t("(true and true) == true",1.0),
822 test_t("(false and false) == false",1.0),
823 test_t("(true or true) == true",1.0),
824 test_t("(false or false) == false",1.0),
825 test_t("(true and false) == false",1.0),
826 test_t("(false and true) == false",1.0),
827 test_t("(true or false) == true",1.0),
828 test_t("(false or true) == true",1.0),
829 test_t("(true & true) == true",1.0),
830 test_t("(false & false) == false",1.0),
831 test_t("(true | true) == true",1.0),
832 test_t("(false | false) == false",1.0),
833 test_t("(true & false) == false",1.0),
834 test_t("(false & true) == false",1.0),
835 test_t("(true | false) == true",1.0),
836 test_t("(false | true) == true",1.0),
837 test_t("clamp(-1,1,+1)",1.0),
838 test_t("clamp(-1,-1.5,+1.0)",-1.0),
839 test_t("clamp(-1,+1.5,+1.0)",+1.0),
840 test_t("clamp(-1,-1.5,+1.0) + clamp(-1,+1.5,+1.0)",0.0),
841 test_t("inrange(-2,1,+2) == ((-2 <= 1) and (1 <= +2))",1.0),
842 test_t("inrange(-2,1,+2) == if(({-2 <= 1} and [1 <= +2]),1.0,0.0)",1.0),
843 test_t("sgn( 0)", 0.0),
844 test_t("sgn(+3)",+1.0),
845 test_t("sgn(-3)",-1.0),
846 test_t("equal($f00(1.1,2.2,3.3),(1.1+2.2)/3.3)",1.0),
847 test_t("equal($f01(1.1,2.2,3.3),(1.1+2.2)*3.3)",1.0),
848 test_t("equal($f02(1.1,2.2,3.3),(1.1+2.2)-3.3)",1.0),
849 test_t("equal($f03(1.1,2.2,3.3),(1.1+2.2)+3.3)",1.0),
850 test_t("equal($f04(1.1,2.2,3.3),(1.1-2.2)+3.3)",1.0),
851 test_t("equal($f05(1.1,2.2,3.3),(1.1-2.2)/3.3)",1.0),
852 test_t("equal($f06(1.1,2.2,3.3),(1.1-2.2)*3.3)",1.0),
853 test_t("equal($f07(1.1,2.2,3.3),(1.1*2.2)+3.3)",1.0),
854 test_t("equal($f08(1.1,2.2,3.3),(1.1*2.2)-3.3)",1.0),
855 test_t("equal($f09(1.1,2.2,3.3),(1.1*2.2)/3.3)",1.0),
856 test_t("equal($f10(1.1,2.2,3.3),(1.1*2.2)*3.3)",1.0),
857 test_t("equal($f11(1.1,2.2,3.3),(1.1/2.2)+3.3)",1.0),
858 test_t("equal($f12(1.1,2.2,3.3),(1.1/2.2)-3.3)",1.0),
859 test_t("equal($f13(1.1,2.2,3.3),(1.1/2.2)/3.3)",1.0),
860 test_t("equal($f14(1.1,2.2,3.3),(1.1/2.2)*3.3)",1.0),
861 test_t("equal($f15(1.1,2.2,3.3),1.1/(2.2+3.3))",1.0),
862 test_t("equal($f16(1.1,2.2,3.3),1.1/(2.2-3.3))",1.0),
863 test_t("equal($f17(1.1,2.2,3.3),1.1/(2.2*3.3))",1.0),
864 test_t("equal($f18(1.1,2.2,3.3),1.1/(2.2/3.3))",1.0),
865 test_t("equal($f19(1.1,2.2,3.3),1.1*(2.2+3.3))",1.0),
866 test_t("equal($f20(1.1,2.2,3.3),1.1*(2.2-3.3))",1.0),
867 test_t("equal($f21(1.1,2.2,3.3),1.1*(2.2*3.3))",1.0),
868 test_t("equal($f22(1.1,2.2,3.3),1.1*(2.2/3.3))",1.0),
869 test_t("equal($f23(1.1,2.2,3.3),1.1-(2.2+3.3))",1.0),
870 test_t("equal($f24(1.1,2.2,3.3),1.1-(2.2-3.3))",1.0),
871 test_t("equal($f25(1.1,2.2,3.3),1.1-(2.2/3.3))",1.0),
872 test_t("equal($f26(1.1,2.2,3.3),1.1-(2.2*3.3))",1.0),
873 test_t("equal($f27(1.1,2.2,3.3),1.1+(2.2*3.3))",1.0),
874 test_t("equal($f28(1.1,2.2,3.3),1.1+(2.2/3.3))",1.0),
875 test_t("equal($f29(1.1,2.2,3.3),1.1+(2.2+3.3))",1.0),
876 test_t("equal($f30(1.1,2.2,3.3),1.1+(2.2-3.3))",1.0),
877 test_t("equal($f31(1.1,2.2,3.3),1.1*2.2^2+3.3)",1.0),
878 test_t("equal($f32(1.1,2.2,3.3),1.1*2.2^3+3.3)",1.0),
879 test_t("equal($f33(1.1,2.2,3.3),1.1*2.2^4+3.3)",1.0),
880 test_t("equal($f34(1.1,2.2,3.3),1.1*2.2^5+3.3)",1.0),
881 test_t("equal($f35(1.1,2.2,3.3),1.1*2.2^6+3.3)",1.0),
882 test_t("equal($f36(1.1,2.2,3.3),1.1*2.2^7+3.3)",1.0),
883 test_t("equal($f37(1.1,2.2,3.3),1.1*2.2^8+3.3)",1.0),
884 test_t("equal($f38(1.1,2.2,3.3),1.1*2.2^9+3.3)",1.0),
885 test_t("equal($f39(1.1,2.2,3.3),1.1*log(2.2)+3.3)",1.0),
886 test_t("equal($f40(1.1,2.2,3.3),1.1*log(2.2)-3.3)",1.0),
887 test_t("equal($f41(1.1,2.2,3.3),1.1*log10(2.2)+3.3)",1.0),
888 test_t("equal($f42(1.1,2.2,3.3),1.1*log10(2.2)-3.3)",1.0),
889 test_t("equal($f43(1.1,2.2,3.3),1.1*sin(2.2)+3.3)",1.0),
890 test_t("equal($f44(1.1,2.2,3.3),1.1*sin(2.2)-3.3)",1.0),
891 test_t("equal($f45(1.1,2.2,3.3),1.1*cos(2.2)+3.3)",1.0),
892 test_t("equal($f46(1.1,2.2,3.3),1.1*cos(2.2)-3.3)",1.0),
893 test_t("equal($f47(1.1,2.2,3.3),if(0!=1.1,2.2,3.3))",1.0),
894 test_t("equal($f48(1.1,2.2,3.3,4.4),1.1+((2.2+3.3)/4.4))",1.0),
895 test_t("equal($f49(1.1,2.2,3.3,4.4),1.1+((2.2+3.3)*4.4))",1.0),
896 test_t("equal($f50(1.1,2.2,3.3,4.4),1.1+((2.2-3.3)/4.4))",1.0),
897 test_t("equal($f51(1.1,2.2,3.3,4.4),1.1+((2.2-3.3)*4.4))",1.0),
898 test_t("equal($f52(1.1,2.2,3.3,4.4),1.1+((2.2*3.3)/4.4))",1.0),
899 test_t("equal($f53(1.1,2.2,3.3,4.4),1.1+((2.2*3.3)*4.4))",1.0),
900 test_t("equal($f54(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)+4.4))",1.0),
901 test_t("equal($f55(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)/4.4))",1.0),
902 test_t("equal($f56(1.1,2.2,3.3,4.4),1.1+((2.2/3.3)*4.4))",1.0),
903 test_t("equal($f57(1.1,2.2,3.3,4.4),1.1-((2.2+3.3)/4.4))",1.0),
904 test_t("equal($f58(1.1,2.2,3.3,4.4),1.1-((2.2+3.3)*4.4))",1.0),
905 test_t("equal($f59(1.1,2.2,3.3,4.4),1.1-((2.2-3.3)/4.4))",1.0),
906 test_t("equal($f60(1.1,2.2,3.3,4.4),1.1-((2.2-3.3)*4.4))",1.0),
907 test_t("equal($f61(1.1,2.2,3.3,4.4),1.1-((2.2*3.3)/4.4))",1.0),
908 test_t("equal($f62(1.1,2.2,3.3,4.4),1.1-((2.2*3.3)*4.4))",1.0),
909 test_t("equal($f63(1.1,2.2,3.3,4.4),1.1-((2.2/3.3)/4.4))",1.0),
910 test_t("equal($f64(1.1,2.2,3.3,4.4),1.1-((2.2/3.3)*4.4))",1.0),
911 test_t("equal($f65(1.1,2.2,3.3,4.4),((1.1+2.2)*3.3)-4.4)",1.0),
912 test_t("equal($f66(1.1,2.2,3.3,4.4),((1.1-2.2)*3.3)-4.4)",1.0),
913 test_t("equal($f67(1.1,2.2,3.3,4.4),((1.1*2.2)*3.3)-4.4)",1.0),
914 test_t("equal($f68(1.1,2.2,3.3,4.4),((1.1/2.2)*3.3)-4.4)",1.0),
915 test_t("equal($f69(1.1,2.2,3.3,4.4),((1.1+2.2)/3.3)-4.4)",1.0),
916 test_t("equal($f70(1.1,2.2,3.3,4.4),((1.1-2.2)/3.3)-4.4)",1.0),
917 test_t("equal($f71(1.1,2.2,3.3,4.4),((1.1*2.2)/3.3)-4.4)",1.0),
918 test_t("equal($f72(1.1,2.2,3.3,4.4),((1.1/2.2)/3.3)-4.4)",1.0),
919 test_t("equal($f73(1.1,2.2,3.3,4.4),(1.1*2.2)+(3.3*4.4))",1.0),
920 test_t("equal($f74(1.1,2.2,3.3,4.4),(1.1*2.2)-(3.3*4.4))",1.0),
921 test_t("equal($f75(1.1,2.2,3.3,4.4),(1.1*2.2)+(3.3/4.4))",1.0),
922 test_t("equal($f76(1.1,2.2,3.3,4.4),(1.1*2.2)-(3.3/4.4))",1.0),
923 test_t("equal($f77(1.1,2.2,3.3,4.4),(1.1/2.2)+(3.3/4.4))",1.0),
924 test_t("equal($f78(1.1,2.2,3.3,4.4),(1.1/2.2)-(3.3/4.4))",1.0),
925 test_t("equal($f79(1.1,2.2,3.3,4.4),(1.1/2.2)-(3.3*4.4))",1.0),
926 test_t("equal($f80(1.1,2.2,3.3,4.4),1.1/(2.2+(3.3*4.4)))",1.0),
927 test_t("equal($f81(1.1,2.2,3.3,4.4),1.1/(2.2-(3.3*4.4)))",1.0),
928 test_t("equal($f82(1.1,2.2,3.3,4.4),1.1*(2.2+(3.3*4.4)))",1.0),
929 test_t("equal($f83(1.1,2.2,3.3,4.4),1.1*(2.2-(3.3*4.4)))",1.0),
930 test_t("equal($f84(1.1,2.2,3.3,4.4),1.1*2.2^2+3.3*4.4^2)",1.0),
931 test_t("equal($f85(1.1,2.2,3.3,4.4),1.1*2.2^3+3.3*4.4^3)",1.0),
932 test_t("equal($f86(1.1,2.2,3.3,4.4),1.1*2.2^4+3.3*4.4^4)",1.0),
933 test_t("equal($f87(1.1,2.2,3.3,4.4),1.1*2.2^5+3.3*4.4^5)",1.0),
934 test_t("equal($f88(1.1,2.2,3.3,4.4),1.1*2.2^6+3.3*4.4^6)",1.0),
935 test_t("equal($f89(1.1,2.2,3.3,4.4),1.1*2.2^7+3.3*4.4^7)",1.0),
936 test_t("equal($f90(1.1,2.2,3.3,4.4),1.1*2.2^8+3.3*4.4^8)",1.0),
937 test_t("equal($f91(1.1,2.2,3.3,4.4),1.1*2.2^9+3.3*4.4^9)",1.0),
938 test_t("equal($f92(1.1,2.2,3.3,4.4),if(1.1 and 2.2,3.3,4.4))",1.0),
939 test_t("equal($f93(1.1,2.2,3.3,4.4),if(1.1 or 2.2,3.3,4.4))",1.0),
940 test_t("equal($f94(1.1,2.2,3.3,4.4),if(1.1 < 2.2,3.3,4.4))",1.0),
941 test_t("equal($f95(1.1,2.2,3.3,4.4),if(1.1 <= 2.2,3.3,4.4))",1.0),
942 test_t("equal($f96(1.1,2.2,3.3,4.4),if(1.1 > 2.2,3.3,4.4))",1.0),
943 test_t("equal($f97(1.1,2.2,3.3,4.4),if(1.1 >= 2.2,3.3,4.4))",1.0),
944 test_t("equal($f98(1.1,2.2,3.3,4.4),if(equal(1.1,2.2),3.3,4.4))",1.0),
945 test_t("equal($f99(1.1,2.2,3.3,4.4),1.1*sin(2.2)+3.3*cos(4.4))",1.0),
946 test_t("equal((48.0/2.0*(9.0+3.0)),288.0)",1.0),
947 test_t("equal((48.0/2.0(9.0+3.0)),288.0)",1.0),
948 test_t("equal((6.0/2.0(1.0+2.0)),9.0)",1.0),
949 test_t("1+2+3+4+5+6+7+8+9+0",45.0),
950 test_t("1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0",45.0),
951 test_t("1.0 + 2.0 + 3.0 + 4.0 + 5.0 + 6.0 + 7.0 + 8.0 + 9.0 + 0.0",45.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)",+5.0),
954 test_t("(1+2)-(3+4)-(5+6)-(7+8)-(9+0)",-39.0),
955 test_t("(1.0+2.0)+(3.0+4.0)+(5.0+6.0)+(7.0+8.0)+(9.0+0.0)",45.0),
956 test_t("(1.0-2.0)+(3.0-4.0)+(5.0-6.0)+(7.0-8.0)+(9.0-0.0)",+5.0),
957 test_t("(1.0+2.0)-(3.0+4.0)-(5.0+6.0)-(7.0+8.0)-(9.0+0.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+2-3*4/5+6-7*8/9+0",0.37777777777777777778),
965 test_t("1.1+2.2-3.3*4.4/5.5+6.6-7.7*8.8/9.9+0.0",0.41555555555555555556),
966 test_t("(1+2)-(3*4)/(5+6)-(7*8)/(9+0)",-4.31313131313131313131),
967 test_t("1/1+1/2+1/3+1/4+1/5+1/6+1/7+1/8+1/9",2.82896825396825396825),
968 test_t("(1/1)+(1/2)+(1/3)+(1/4)+(1/5)+(1/6)+(1/7)+(1/8)+(1/9)",2.82896825396825396825),
969 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),
970 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),
971 test_t("1/1*1/2*1/3*1/4*1/5*1/6*1/7*1/8*1/9",0.00000275573192239859),
972 test_t("(1/1)*(1/2)*(1/3)*(1/4)*(1/5)*(1/6)*(1/7)*(1/8)*(1/9)",0.00000275573192239859),
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",0.00000275573192239859),
974 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),
975 test_t("equal(poly01(1.2345,2.2,1.1),(2.2*1.2345^1+1.1))",1.0),
976 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),
977 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),
978 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),
979 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),
980 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),
981 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),
982 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),
983 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),
984 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),
985 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),
986 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),
987 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),
988 test_t("equal((pi^2^3),(pi^8))",1.0),
989 test_t("equal((pi^(2^3)),(pi^8))",1.0),
990 test_t("equal(pi^2^3-pi^8,0)",1.0),
991 test_t("equal((2*pi^2^3),2*(pi^8))",1.0),
992 test_t("equal((pi^2^3*2),2*(pi^8))",1.0),
993 test_t("equal((pi^2^3/2),(pi^8)/2)",1.0),
994 test_t("equal((pi^2.2^3.3),(pi^13.4894687605338489))",1.0),
995 test_t("equal((pi^(2.2^3.3)),(pi^13.4894687605338489))",1.0),
996 test_t("equal((2.2*pi^2.2^3.3),2.2*(pi^13.4894687605338489))",1.0),
997 test_t("equal((pi^2.2^3.3*2),2*(pi^13.4894687605338489))",1.0),
998 test_t("equal((pi^2.2^3.3/2.2),(pi^13.4894687605338489)/2.2)",1.0),
999 test_t("equal((pi^-2^3),1/(pi^8))",1.0),
1000 test_t("equal((pi^(-2^3)),1/(pi^8))",1.0),
1001 test_t("equal((pi^2^-3),(pi^(1/8)))",1.0),
1002 test_t("equal((pi^(2^-3)),(pi^(1/8)))",1.0),
1003 test_t("equal((pi^-2^-3),1/(pi^(1/8)))",1.0),
1004 test_t("equal((pi^(-2^-3)),1/(pi^(1/8)))",1.0),
1005 test_t("equal((-pi^2^3),(-pi^8))",1.0),
1006 test_t("equal((-pi^(2^3)),(-pi^8))",1.0),
1007 test_t("equal(-pi^2^3--pi^8,0)",1.0),
1008 test_t("equal((2*-pi^2^3),2*(-pi^8))",1.0),
1009 test_t("equal((-pi^2^3*2),2*(-pi^8))",1.0),
1010 test_t("equal((-pi^2^3/2),(-pi^8)/2)",1.0),
1011 test_t("equal((-pi^2.2^3.3),(-pi^13.4894687605338489))",1.0),
1012 test_t("equal((-pi^(2.2^3.3)),(-pi^13.4894687605338489))",1.0),
1013 test_t("equal((2.2*-pi^2.2^3.3),2.2*(-pi^13.4894687605338489))",1.0),
1014 test_t("equal((-pi^2.2^3.3*2),2*(-pi^13.4894687605338489))",1.0),
1015 test_t("equal((-pi^2.2^3.3/2.2),(-pi^13.4894687605338489)/2.2)",1.0),
1016 test_t("equal((-pi^-2^3),1/(-pi^8))",1.0),
1017 test_t("equal((-pi^(-2^3)),1/(-pi^8))",1.0),
1018 test_t("equal((-pi^2^-3),(-pi^(1/8)))",1.0),
1019 test_t("equal((-pi^(2^-3)),(-pi^(1/8)))",1.0),
1020 test_t("equal((-pi^-2^-3),1/(-pi^(1/8)))",1.0),
1021 test_t("equal((-pi^(-2^-3)),1/(-pi^(1/8)))",1.0),
1022 test_t("equal((+pi^+2^+3),(+pi^+8))",1.0),
1023 test_t("equal((+pi^(2^3)),(+pi^+8))",1.0),
1024 test_t("equal(+pi^+2^+3-+pi^+8,0)",1.0),
1025 test_t("equal((+2*+pi^+2^+3),+2*(+pi^+8))",1.0),
1026 test_t("equal((+pi^+2^+3*+2),+2*(+pi^+8))",1.0),
1027 test_t("equal((+pi^+2^+3/+2),(+pi^+8)/+2)",1.0),
1028 test_t("equal((+pi^+2.2^+3.3),(+pi^+13.4894687605338489))",1.0),
1029 test_t("equal((+pi^(+2.2^+3.3)),(+pi^+13.4894687605338489))",1.0),
1030 test_t("equal((+2.2*+pi^+2.2^+3.3),+2.2*(+pi^+13.4894687605338489))",1.0),
1031 test_t("equal((+pi^+2.2^+3.3*+2),+2*(+pi^+13.4894687605338489))",1.0),
1032 test_t("equal((+pi^+2.2^+3.3/+2.2),(+pi^+13.4894687605338489)/+2.2)",1.0),
1033 test_t("equal((+pi^-2^3),1/(+pi^+8))",1.0),
1034 test_t("equal((+pi^(-2^3)),1/(+pi^+8))",1.0),
1035 test_t("equal((+pi^2^-3),(+pi^(+1/+8)))",1.0),
1036 test_t("equal((+pi^(2^-3)),(+pi^(+1/+8)))",1.0),
1037 test_t("equal((+pi^-2^-3),1/(+pi^(+1/+8)))",1.0),
1038 test_t("equal((+pi^(-2^-3)),1/(+pi^(+1/+8)))",1.0),
1039 test_t("equal((-pi^+2^+3),(-pi^+8))",1.0),
1040 test_t("equal((-pi^(2^3)),(-pi^+8))",1.0),
1041 test_t("equal(-pi^+2^+3--pi^+8,0)",1.0),
1042 test_t("equal((+2*-pi^+2^+3),2*(-pi^+8))",1.0),
1043 test_t("equal((-pi^+2^+3*2),2*(-pi^+8))",1.0),
1044 test_t("equal((-pi^+2^+3/+2),(-pi^+8)/+2)",1.0),
1045 test_t("equal((-pi^+2.2^+3.3),(-pi^+13.4894687605338489))",1.0),
1046 test_t("equal((-pi^(2.2^3.3)),(-pi^+13.4894687605338489))",1.0),
1047 test_t("equal((+2.2*-pi^+2.2^+3.3),2.2*(-pi^+13.4894687605338489))",1.0),
1048 test_t("equal((-pi^+2.2^+3.3*2),2*(-pi^+13.4894687605338489))",1.0),
1049 test_t("equal((-pi^+2.2^+3.3/+2.2),(-pi^+13.4894687605338489)/+2.2)",1.0),
1050 test_t("equal((-pi^-2^3),1/(-pi^+8))",1.0),
1051 test_t("equal((-pi^(-2^3)),1/(-pi^+8))",1.0),
1052 test_t("equal((-pi^2^-3),(-pi^(+1/+8)))",1.0),
1053 test_t("equal((-pi^(2^-3)),(-pi^(+1/+8)))",1.0),
1054 test_t("equal((-pi^-2^-3),1/(-pi^(+1/+8)))",1.0),
1055 test_t("equal((-pi^(-2^-3)),1/(-pi^(+1/+8)))",1.0),
1056 test_t("switch { case (1 <= 2) : 1; default: 1.12345; }",1.0),
1057 test_t("switch { case (1 > 2) : 0; case (1 <= 2) : 1; default: 1.12345; }",1.0),
1058 test_t("switch { case (1 <= 2) : switch { case (1 <= 2) : 1; default: 1.12345; }; default: 1.12345; }",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 > 1 : 1; case 2 > 2 : 2; case 3 = 3 : 3; case 4 > 4 : 4; default : 5; }",3.0),
1069 test_t("repeat 1.1 + 2.2 until (1 < 2)",3.3),
1070 test_t("repeat (1.1 + 2.2) until (1 < 2)",3.3),
1071 test_t("repeat 1.1 + 2.2; until (1 < 2)",3.3),
1072 test_t("repeat (1.1 + 2.2); until (1 < 2)",3.3),
1073 test_t("repeat 1.1234; 1 < 2; 1.1 + 2.2 until (1 < 2)",3.3),
1074 test_t("repeat 1.1234; 1 < 2; (1.1 + 2.2) until (1 < 2)",3.3),
1075 test_t("repeat 1.1234; 1 < 2; 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("[*] { case 1 < 2 : 1 / 2; case (1 < 3) : 2 / 2; case 1 < 4 : 3 / 2; case (1 < 5) : 4 / 2; }",2.0),
1078 test_t(" 0 ? 1 : 2",2.0),
1079 test_t(" 1 ? 3 : 4",3.0),
1080 test_t("(0 ? 1 : 2) == 2",1.0),
1081 test_t("(1 ? 3 : 4) == 3",1.0),
1082 test_t("[(0)] ? [(1)] : [(2)]",2.0),
1083 test_t("([(0)] ? [(1)] : [(2)]) == 2",1.0),
1084 test_t("([(1)] ? [(3)] : [(4)]) == 3",1.0),
1085 test_t("(1 < 2 ? 3 : 4) == 3",1.0),
1086 test_t("(1 > 2 ? 3 : 4) == 4",1.0),
1087 test_t("(1 < 2 ? 3 + 5 : 4) == 8",1.0),
1088 test_t("(1 > 2 ? 3 : 4 + 5) == 9",1.0),
1089 test_t("(2 < 3 + 3 ? 7 : 9) == 7",1.0),
1090 test_t("(1 + 1 < 3 ? 7 : 9) == 7",1.0),
1091 test_t("(1 + 1 < 3 + 3 ? 7 : 9) == 7",1.0),
1092 test_t("(2 > 3 + 3 ? 7 : 9) == 9",1.0),
1093 test_t("(1 + 1 > 3 ? 7 : 9) == 9",1.0),
1094 test_t("(1 + 1 > 3 + 3 ? 7 : 9) == 9",1.0),
1095 test_t("(2 < (3 + 3) ? 7 : 9) == 7",1.0),
1096 test_t("((1 + 1) < 3 ? 7 : 9) == 7",1.0),
1097 test_t("((1 + 1) < (3 + 3) ? 7 : 9) == 7",1.0),
1098 test_t("(min(1,2) ? 1 + 3 : 1 + 4) == 4",1.0),
1099 test_t("(min(0,1) ? 1 + 3 : 1 + 4) == 5",1.0),
1100 test_t("(if (1 < 2) 3;) == 3",1.0),
1101 test_t("(if (1 > 2) 3;) == null",1.0),
1102 test_t("(if (1 < 2) 3; else 4;) == 3",1.0),
1103 test_t("(if (1 > 2) 3; else 4;) == 4",1.0),
1104 test_t("if (1 < 2) 3; else {1+2; 4;} == 3",1.0),
1105 test_t("if (1 > 2) 3; else {1+2; 4;} == 4",1.0),
1106 test_t("(if (1 < 2) 3; else if (1 < 2) 4;) == 3",1.0),
1107 test_t("(if (1 > 2) 3; else if (1 < 2) 4;) == 4",1.0),
1108 test_t("(if (1 > 2) 3; else if (1 > 2) 4;) == null",1.0),
1109 test_t("if (1 < 2) 3; else if (1 < 2) {1+2; 4;} == 3",1.0),
1110 test_t("if (1 > 2) 3; else if (1 < 2) {1+2; 4;} == 4",1.0),
1111 test_t("if (1 > 2) 3; else if (1 > 2) {1+2; 4;} == null",1.0),
1112 test_t("if (1 < 2) { 1+2; 3;} == 3",1.0),
1113 test_t("if (1 > 2) { 1+2; 3;} == null",1.0),
1114 test_t("(if (1 < 2) { 1+2; 3;} else 4;) == 3",1.0),
1115 test_t("(if (1 > 2) { 1+2; 3;} else 4;) == 4",1.0),
1116 test_t("if (1 < 2) { 1+2; 3;} else {1+2; 4;} == 3",1.0),
1117 test_t("if (1 > 2) { 1+2; 3;} else {1+2; 4;} == 4",1.0),
1118 test_t("(if (1 < 2) { 1+2; 3;} else if (1 < 2) 4;) == 3",1.0),
1119 test_t("(if (1 > 2) { 1+2; 3;} else if (1 < 2) 4;) == 4",1.0),
1120 test_t("(if (1 > 2) { 1+2; 3;} else if (1 > 2) 4;) == null",1.0),
1121 test_t("if (1 < 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 3",1.0),
1122 test_t("if (1 > 2) { 1+2; 3;} else if (1 < 2) {1+2; 4;} == 4",1.0),
1123 test_t("if (1 > 2) { 1+2; 3;} else if (1 > 2) {1+2; 4;} == null",1.0)
1124};
1125
1126static const std::size_t global_test_list_size = sizeof(global_test_list) / sizeof(test_t);
1127
1128template <typename T>
1129inline bool not_equal_impl(const T& t1,
1130 const T& t2,
1131 const T& epsilon = 0.0000000001/*std::numeric_limits<T>::epsilon()*/)
1132{
1133 if (t1 != t1) return true;
1134 if (t2 != t2) return true;
1135 T diff = real::abs(t1 - t2);
1136 T eps_norm = (real::max(T(1),real::max(real::abs(t1),real::abs(t2))) * epsilon);
1137 return diff > eps_norm;
1138}
1139
1140template <typename T>
1141inline bool not_equal(const T& t0, const T& t1,
1142 const T& epsilon = T(0.0000000001))
1143{
1144 return not_equal_impl(t0,t1,epsilon);
1145}
1146
1147inline bool not_equal(const float& t0, const float& t1, const float& epsilon = 0.000001f)
1148{
1149 return not_equal_impl(t0,t1,epsilon);
1150}
1151
1152template <typename T>
1153inline bool test_expression(const std::string& expression_string, const T& expected_result)
1154{
1155 exprtk::symbol_table<T> symbol_table;
1156 symbol_table.add_constants();
1157
1170
1171 symbol_table.add_function("poly01", poly01);
1172 symbol_table.add_function("poly02", poly02);
1173 symbol_table.add_function("poly03", poly03);
1174 symbol_table.add_function("poly04", poly04);
1175 symbol_table.add_function("poly05", poly05);
1176 symbol_table.add_function("poly06", poly06);
1177 symbol_table.add_function("poly07", poly07);
1178 symbol_table.add_function("poly08", poly08);
1179 symbol_table.add_function("poly09", poly09);
1180 symbol_table.add_function("poly10", poly10);
1181 symbol_table.add_function("poly11", poly11);
1182 symbol_table.add_function("poly12", poly12);
1183
1184 exprtk::expression<T> expression;
1185 expression.register_symbol_table(symbol_table);
1186
1187 {
1188 exprtk::parser<T> parser;
1189
1190 if (!parser.compile(expression_string,expression))
1191 {
1192 printf("test_expression() - Error: %s Expression: %s\n",
1193 parser.error().c_str(),
1194 expression_string.c_str());
1195
1196 return false;
1197 }
1198 }
1199
1201 {
1202 printf("test_expression() - Error: Expression did not compile to a constant! Expression: %s\n",
1203 expression_string.c_str());
1204
1205 return false;
1206 }
1207
1208 const T result = expression.value();
1209
1210 if (not_equal(result,expected_result))
1211 {
1212 printf("test_expression() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1213 expression_string.c_str(),
1214 static_cast<double>(expected_result),
1215 static_cast<double>(result));
1216
1217 return false;
1218 }
1219
1220 return true;
1221}
1222
1223template <typename T>
1224struct edge_cases {};
1225
1226template <>
1228{
1229 static inline std::vector<test_t> test_cases()
1230 {
1231 std::vector<test_t> cases;
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 cases.push_back(test_t("-2.2250738585072013831e-308", -2.2250738585072013831e-308));
1237 cases.push_back(test_t("-1.7976931348623157081e+308", -1.7976931348623157081e+308));
1238
1239 return cases;
1240 }
1241};
1242
1243template <typename T>
1245{
1246 const std::size_t rounds = 10;
1247
1248 for (std::size_t r = 0; r < rounds; ++r)
1249 {
1250 bool result = true;
1251
1252 for (std::size_t i = 0; i < global_test_list_size; ++i)
1253 {
1254 if (!test_expression<T>(global_test_list[i].first,T(global_test_list[i].second)))
1255 {
1256 result = false;
1257 }
1258 }
1259
1260 if (!result)
1261 {
1262 return false;
1263 }
1264 }
1265
1266 {
1267 const std::vector<test_t> tests = edge_cases<T>::test_cases();
1268
1269 bool result = true;
1270
1271 for (std::size_t i = 0; i < tests.size(); ++i)
1272 {
1273 if (!test_expression<T>(tests[i].first,T(tests[i].second)))
1274 {
1275 result = false;
1276 }
1277 }
1278
1279 if (!result)
1280 {
1281 return false;
1282 }
1283 }
1284
1285 return true;
1286}
1287
1288template <typename T>
1289struct test_xy
1290{
1291 test_xy(const std::string& e, const T& v0, const T& v1, const T& r)
1292 : expr(e)
1293 , x(v0)
1294 , y(v1)
1295 , result(r)
1296 {}
1297
1298 std::string expr;
1299 T x;
1300 T y;
1301 T result;
1302};
1303
1304template <typename T>
1305struct test_xyzw
1306{
1307 test_xyzw(const std::string& e, const T& v0, const T& v1, const T& v2, const T& v3, const T& r)
1308 : expr(e)
1309 , x(v0)
1310 , y(v1)
1311 , z(v2)
1312 , w(v3)
1313 , result(r)
1314 {}
1315
1316 std::string expr;
1317 T x;
1318 T y;
1319 T z;
1320 T w;
1321 T result;
1322};
1323
1324template <typename T>
1326{
1327 {
1328 static const test_xy<T> test_list[] =
1329 {
1330 test_xy<T>("x + y" ,T(2.2),T(3.3),T(5.5 )),
1331 test_xy<T>("x - y" ,T(3.3),T(2.2),T(1.1 )),
1332 test_xy<T>("x * y" ,T(3.3),T(2.2),T(7.26 )),
1333 test_xy<T>("x / y" ,T(3.3),T(2.2),T(1.5 )),
1334 test_xy<T>("(x + y) * (x + y)" ,T(2.2),T(3.3),T(30.25)),
1335 test_xy<T>("(x + y) / (x + y)" ,T(2.2),T(3.3),T(1.0 )),
1336 test_xy<T>("x + y > x and x + y > y" ,T(2.2),T(3.3),T(1.0)),
1337 test_xy<T>("1 + (x + y)" ,T(2.2),T(3.3),T(6.5 )),
1338 test_xy<T>("(x + y) - 1" ,T(2.2),T(3.3),T(4.5 )),
1339 test_xy<T>("1 + (x + y) * 2" ,T(2.2),T(3.3),T(12.0 )),
1340 test_xy<T>("2 * (x + y) - 1" ,T(2.2),T(3.3),T(10.0 )),
1341 test_xy<T>("y + (x + 1)" ,T(2.2),T(3.3),T(6.5 )),
1342 test_xy<T>("(x + 1) + y" ,T(2.2),T(3.3),T(6.5 )),
1343 test_xy<T>("2 * x" ,T(2.2),T(0.0),T(4.4)),
1344 test_xy<T>("x * 2" ,T(2.2),T(0.0),T(4.4)),
1345 test_xy<T>("1.1 + x" ,T(2.2),T(0.0),T(3.3)),
1346 test_xy<T>("x + 1.1" ,T(2.2),T(0.0),T(3.3)),
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(2)),
1350 test_xy<T>("x--1 " ,T(1.0),T(0.0),T(2)),
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(0)),
1355 test_xy<T>("x+-1 " ,T(1.0),T(0.0),T(0)),
1356 test_xy<T>("x +- -1" ,T(1.0),T(0.0),T(2)),
1357 test_xy<T>("x + +1 " ,T(1.0),T(0.0),T(2)),
1358 test_xy<T>("x ++1 " ,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(2)),
1362 test_xy<T>("1--x " ,T(1.0),T(0.0),T(2)),
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(0)),
1367 test_xy<T>("1+-x " ,T(1.0),T(0.0),T(0)),
1368 test_xy<T>("1 +- -x" ,T(1.0),T(0.0),T(2)),
1369 test_xy<T>("1 + +x " ,T(1.0),T(0.0),T(2)),
1370 test_xy<T>("1 ++x " ,T(1.0),T(0.0),T(2)),
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(3)),
1374 test_xy<T>("(x--1 + 1)" ,T(1.0),T(0.0),T(3)),
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(1)),
1379 test_xy<T>("(x+-1 + 1)" ,T(1.0),T(0.0),T(1)),
1380 test_xy<T>("(x +- -1 + 1)" ,T(1.0),T(0.0),T(3)),
1381 test_xy<T>("(x + +1 + 1)" ,T(1.0),T(0.0),T(3)),
1382 test_xy<T>("(x ++1 + 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(3)),
1386 test_xy<T>("(1--x + 1)" ,T(1.0),T(0.0),T(3)),
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(1)),
1391 test_xy<T>("(1+-x + 1)" ,T(1.0),T(0.0),T(1)),
1392 test_xy<T>("(1 +- -x + 1)" ,T(1.0),T(0.0),T(3)),
1393 test_xy<T>("(1 + +x + 1)" ,T(1.0),T(0.0),T(3)),
1394 test_xy<T>("(1 ++x + 1)" ,T(1.0),T(0.0),T(3)),
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>("(x + +1 - 1)" ,T(1.0),T(0.0),T(1)),
1406 test_xy<T>("(x ++1 - 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>("(1 + +x - 1)" ,T(1.0),T(0.0),T(1)),
1418 test_xy<T>("(1 ++x - 1)" ,T(1.0),T(0.0),T(1)),
1419 test_xy<T>("x * 1 == x" ,T(2.0),T(3.0),T(1.0)),
1420 test_xy<T>("1 * x == x" ,T(2.0),T(3.0),T(1.0)),
1421 test_xy<T>("y * 1 == y" ,T(2.0),T(3.0),T(1.0)),
1422 test_xy<T>("1 * y == y" ,T(2.0),T(3.0),T(1.0)),
1423 test_xy<T>("x * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
1424 test_xy<T>("0 * x == 0" ,T(2.0),T(3.0),T(1.0)),
1425 test_xy<T>("y * 0 == 0" ,T(2.0),T(3.0),T(1.0)),
1426 test_xy<T>("0 * y == 0" ,T(2.0),T(3.0),T(1.0)),
1427 test_xy<T>("x + 1 == 1 + x" ,T(2.0),T(3.0),T(1.0)),
1428 test_xy<T>("y + 1 == 1 + y" ,T(2.0),T(3.0),T(1.0)),
1429 test_xy<T>("x + y == y + x" ,T(2.0),T(3.0),T(1.0)),
1430 test_xy<T>("x * y == 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" ,T(2.0),T(3.0),T(1.0)),
1434 test_xy<T>("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>("(x * y) > y" ,T(2.0),T(3.0),T(1.0)),
1442 test_xy<T>("(x * y) > x" ,T(2.0),T(3.0),T(1.0)),
1443 test_xy<T>("(2x + 3y) == (2*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
1444 test_xy<T>("2(x + y) == (2*x + 2*y)" ,T(2.0),T(3.0),T(1.0)),
1445 test_xy<T>(" (x + y)3 == (3*x + 3*y)" ,T(2.0),T(3.0),T(1.0)),
1446 test_xy<T>("2x + 3y == 2*x + 3*y" ,T(2.0),T(3.0),T(1.0)),
1447 test_xy<T>("2(x + y) == 2*x + 2*y" ,T(2.0),T(3.0),T(1.0)),
1448 test_xy<T>(" (x + y)3 == 3*x + 3*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) y) == (x*y)" ,T(2.0),T(3.0),T(1.0)),
1454 test_xy<T>(" (x (y)) == (x*y)" ,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>(" ((x) 3) == (x*3)" ,T(2.0),T(3.0),T(1.0)),
1460 test_xy<T>(" (x (3)) == (x*3)" ,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>(" ((2) y) == (2*y)" ,T(2.0),T(3.0),T(1.0)),
1466 test_xy<T>(" (2 (y)) == (2*y)" ,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; {a}{3} == 6" ,T(2.0),T(3.0),T(1.0)),
1472 test_xy<T>("var a := 2; {a}[3] == 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; var b := 3; {a}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
1478 test_xy<T>("var a := 2; var b := 3; {a}[b] == 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; {a}{a+1} == 6" ,T(2.0),T(3.0),T(1.0)),
1484 test_xy<T>("var a := 2; {a}[a+1] == 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>("var a := 2; var b := 3; {b-1}{b} == 6" ,T(2.0),T(3.0),T(1.0)),
1490 test_xy<T>("var a := 2; var b := 3; {b-1}[b] == 6" ,T(2.0),T(3.0),T(1.0)),
1491 test_xy<T>("equal(x^2.2^1.1,17.15193942371376191362)" ,T(3.3),T(0.0),T(1.0)),
1492 test_xy<T>("equal(3.3^x^1.1,17.15193942371376191362)" ,T(2.2),T(0.0),T(1.0)),
1493 test_xy<T>("equal(3.3^2.2^x,17.15193942371376191362)" ,T(1.1),T(0.0),T(1.0)),
1494 test_xy<T>("equal(x^2.2^y,17.15193942371376191362)" ,T(3.3),T(1.1),T(1.0)),
1495 test_xy<T>("equal(x^y^1.1,17.15193942371376191362)" ,T(3.3),T(2.2),T(1.0)),
1496 test_xy<T>("equal(3.3^x^y,17.15193942371376191362)" ,T(2.2),T(1.1),T(1.0)),
1497 test_xy<T>("equal(x+y^3/7,x+(y*y*y)/7)",T(2.0),T(3.0),T(1.0)),
1498 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)),
1499 test_xy<T>("equal( x^0,1)",T(12.34),T(0.0),T(1.0)),
1500 test_xy<T>("equal( x^1,x)",T(12.34),T(0.0),T(1.0)),
1501 test_xy<T>("equal( x^2,x*x)",T(12.34),T(0.0),T(1.0)),
1502 test_xy<T>("equal( x^3,x*x*x)",T(12.34),T(0.0),T(1.0)),
1503 test_xy<T>("equal( x^4,x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1504 test_xy<T>("equal( x^5,x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1505 test_xy<T>("equal( x^6,x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1506 test_xy<T>("equal( x^7,x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1507 test_xy<T>("equal( x^8,x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1508 test_xy<T>("equal( x^9,x*x*x*x*x*x*x*x*x)",T(12.34),T(0.0),T(1.0)),
1509 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)),
1510 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)),
1511 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)),
1512 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)),
1513 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)),
1514 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)),
1515 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)),
1516 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)),
1517 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)),
1518 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)),
1519 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)),
1520 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)),
1521 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)),
1522 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)),
1523 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)),
1524 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)),
1525 test_xy<T>("equal( y^0,1)",T(0.0),T(12.34),T(1.0)),
1526 test_xy<T>("equal( y^1,y)",T(0.0),T(12.34),T(1.0)),
1527 test_xy<T>("equal( y^2,y*y)",T(0.0),T(12.34),T(1.0)),
1528 test_xy<T>("equal( y^3,y*y*y)",T(0.0),T(12.34),T(1.0)),
1529 test_xy<T>("equal( y^4,y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1530 test_xy<T>("equal( y^5,y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1531 test_xy<T>("equal( y^6,y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1532 test_xy<T>("equal( y^7,y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1533 test_xy<T>("equal( y^8,y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1534 test_xy<T>("equal( y^9,y*y*y*y*y*y*y*y*y)",T(0.0),T(12.34),T(1.0)),
1535 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)),
1536 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)),
1537 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)),
1538 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)),
1539 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)),
1540 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)),
1541 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)),
1542 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)),
1543 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)),
1544 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)),
1545 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)),
1546 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)),
1547 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)),
1548 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)),
1549 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)),
1550 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)),
1551 test_xy<T>("equal( x^-0,1/1)",T(12.34),T(0.0),T(1.0)),
1552 test_xy<T>("equal( x^-1,1/(x))",T(12.34),T(0.0),T(1.0)),
1553 test_xy<T>("equal( x^-2,1/(x*x))",T(12.34),T(0.0),T(1.0)),
1554 test_xy<T>("equal( x^-3,1/(x*x*x))",T(12.34),T(0.0),T(1.0)),
1555 test_xy<T>("equal( x^-4,1/(x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1556 test_xy<T>("equal( x^-5,1/(x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1557 test_xy<T>("equal( x^-6,1/(x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1558 test_xy<T>("equal( x^-7,1/(x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1559 test_xy<T>("equal( x^-8,1/(x*x*x*x*x*x*x*x))",T(12.34),T(0.0),T(1.0)),
1560 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)),
1561 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)),
1562 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)),
1563 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)),
1564 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)),
1565 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)),
1566 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)),
1567 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)),
1568 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)),
1569 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)),
1570 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)),
1571 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)),
1572 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)),
1573 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)),
1574 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)),
1575 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)),
1576 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)),
1577 test_xy<T>("equal( y^-0,1/1)",T(0.0),T(12.34),T(1.0)),
1578 test_xy<T>("equal( y^-1,1/(y))",T(0.0),T(12.34),T(1.0)),
1579 test_xy<T>("equal( y^-2,1/(y*y))",T(0.0),T(12.34),T(1.0)),
1580 test_xy<T>("equal( y^-3,1/(y*y*y))",T(0.0),T(12.34),T(1.0)),
1581 test_xy<T>("equal( y^-4,1/(y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1582 test_xy<T>("equal( y^-5,1/(y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1583 test_xy<T>("equal( y^-6,1/(y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1584 test_xy<T>("equal( y^-7,1/(y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1585 test_xy<T>("equal( y^-8,1/(y*y*y*y*y*y*y*y))",T(0.0),T(12.34),T(1.0)),
1586 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)),
1587 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)),
1588 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)),
1589 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)),
1590 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)),
1591 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)),
1592 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)),
1593 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)),
1594 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)),
1595 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)),
1596 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)),
1597 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)),
1598 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)),
1599 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)),
1600 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)),
1601 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)),
1602 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)),
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 / (x / 7)",T(3.0),T(0.0),T(2.0 / (3.0 / 7.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>("2 / (7 / x)",T(3.0),T(0.0),T(2.0 / (7.0 / 3.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>("(x / 2) / 7",T(3.0),T(0.0),T((3.0 / 2.0) / 7.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>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.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>("((x - 2) - (y - 3))",T(7.0),T(9.0),T(((7.0 - 2.0) - (9.0 - 3.0)))),
1642 test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) * (3.0 * 9.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) - (y - 3))",T(7.0),T(9.0),T(((2.0 - 7.0) - (9.0 - 3.0)))),
1646 test_xy<T>("((2 * x) * (3 * y))",T(7.0),T(9.0),T(((2.0 * 7.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>("((x - 2) - (3 - y))",T(7.0),T(9.0),T(((7.0 - 2.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>("((2 / x) / (3 * y))",T(7.0),T(9.0),T(((2.0 / 7.0) / (3.0 * 9.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>("((x / 2) / (y * 3))",T(7.0),T(9.0),T(((7.0 / 2.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>("((2 / x) / (y * 3))",T(7.0),T(9.0),T(((2.0 / 7.0) / (9.0 * 3.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>("((x / 2) / (3 * y))",T(7.0),T(9.0),T(((7.0 / 2.0) / (3.0 * 9.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>("([(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))),
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>("(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))))),
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) - (2 * y))",T(7.0),T(9.0),T(((2.0 * 7.0) - (2.0 * 9.0)))),
1701 test_xy<T>("((2 * x) + (y * 2))",T(7.0),T(9.0),T(((2.0 * 7.0) + (9.0 * 2.0)))),
1702 test_xy<T>("((x * 2) - (y * 2))",T(7.0),T(9.0),T(((7.0 * 2.0) - (9.0 * 2.0)))),
1703 test_xy<T>("0 * (abs (x) + acos (y) + asin (x) + atan (y))",T(1.0),T(1.0),T(0.0)),
1704 test_xy<T>("0 * (ceil (x) + cos (y) + cosh (x) + exp (y))",T(1.0),T(1.0),T(0.0)),
1705 test_xy<T>("0 * (floor(x) + log (y) + log10(x) + round(y))",T(1.0),T(1.0),T(0.0)),
1706 test_xy<T>("0 * (sin (x) + sinh (y) + sqrt (x) + tan (y))",T(1.0),T(1.0),T(0.0)),
1707 test_xy<T>("0 * (sec (x) + csc (y) + tanh (x) + cot (y))",T(1.0),T(1.0),T(0.0)),
1708 test_xy<T>("0 * (erf (x) + erfc (y) + sgn (y) + frac (y))",T(1.0),T(1.0),T(0.0)),
1709 test_xy<T>("0 * (log1p(x) + expm1(y) + acosh(x) + asinh(y))",T(1.0),T(1.0),T(0.0)),
1710 test_xy<T>("0 * (deg2grad(x) + grad2deg(y) + rad2deg(x) + deg2rad(y))",T(1.0),T(1.0),T(0.0)),
1711 test_xy<T>("switch { 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) : 0; case (x <= y) : (y - x); default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1713 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)),
1714 test_xy<T>("switch { 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] : 0; case [x <= y] : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1716 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)),
1717 test_xy<T>("switch { case {x <= y} : x; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1718 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)),
1719 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)),
1720 test_xy<T>("switch { 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]) : [0]; case ([x <= y]) : [y - x]; default: 1.12345; }",T(1.0),T(2.0),T(1.0)),
1722 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)),
1723 test_xy<T>("[*]{ case x < y : x + y; case y < x : y - x; }",T(2.0),T(3.0),T(5.0)),
1724 test_xy<T>("[*]{ case x > y : x + y; case y > x : y - x; }",T(2.0),T(3.0),T(1.0)),
1725 test_xy<T>("[*]{ case x > y : x - y; case y < x : y + x; }",T(2.0),T(3.0),T(0.0)),
1726 test_xy<T>("0 ? x : y" ,T(1.0),T(2.0),T( 2.0)),
1727 test_xy<T>("1 ? x : y" ,T(1.0),T(2.0),T( 1.0)),
1728 test_xy<T>("x ? x : y" ,T(1.0),T(2.0),T( 1.0)),
1729 test_xy<T>("x ? x : y" ,T(0.0),T(2.0),T( 2.0)),
1730 test_xy<T>("(x + y < 4) ? 1 : 2" ,T(1.0),T(2.0),T( 1.0)),
1731 test_xy<T>("(x + y > 4) ? 1 : 2" ,T(1.0),T(2.0),T( 2.0)),
1732 test_xy<T>("x < y ? x + y : x - y" ,T(1.0),T(2.0),T( 3.0)),
1733 test_xy<T>("x > y ? x + y : x - y" ,T(1.0),T(2.0),T(-1.0)),
1734 test_xy<T>("(x + x < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1735 test_xy<T>("(x + x < y + y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1736 test_xy<T>("(x > y + y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1737 test_xy<T>("(x + x > y ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1738 test_xy<T>("(x + x > y + 3 ? 7 : 9) == 9" ,T(1.0),T(3.0),T( 1.0)),
1739 test_xy<T>("(x < (y + y) ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1740 test_xy<T>("((x + x) < y ? 7 : 9) == 7" ,T(1.0),T(3.0),T( 1.0)),
1741 test_xy<T>("((x + x) < (y + y) ? 7 : 9) == 7",T(1.0),T(3.0),T( 1.0)),
1742 test_xy<T>("(x += 2 ) == 3 " ,T(1),T(3),T(1)),
1743 test_xy<T>("(x += 2y) == 7 " ,T(1),T(3),T(1)),
1744 test_xy<T>("(x -= 2 ) == -1 " ,T(1),T(3),T(1)),
1745 test_xy<T>("(x -= 2y) == -5 " ,T(1),T(3),T(1)),
1746 test_xy<T>("(x *= 2 ) == 2 " ,T(1),T(3),T(1)),
1747 test_xy<T>("(x *= 2y) == 6 " ,T(1),T(3),T(1)),
1748 test_xy<T>("(x /= 2 ) == (1/2)" ,T(1),T(3),T(1)),
1749 test_xy<T>("(x /= 2y) == (1/6)" ,T(1),T(3),T(1)),
1750 test_xy<T>("for(var i := 0; (i < 10);) { i += 1; }; x;" ,T(1),T(20),T( 1)),
1751 test_xy<T>("for(var i := 0; (i < 10) and (i != y); i+=2) { x += i; }; x;" ,T(1),T(20),T(21)),
1752 test_xy<T>("for(var i := 0; (i < 10) and (i != y);) { x += i; i+=2; }; x;",T(1),T(20),T(21)),
1753 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)),
1754 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)),
1755 test_xy<T>("var a := 2; (0 * a) == 0",T(0),T(0),T(1)),
1756 test_xy<T>("var a := 2; (0 / a) == 0",T(0),T(0),T(1)),
1757 test_xy<T>("var a := 2; (a * 0) == 0",T(0),T(0),T(1)),
1758 test_xy<T>("var a := 2; (a / 1) == a",T(0),T(0),T(1)),
1759 test_xy<T>("var a := 2; (0 + a) == a",T(0),T(0),T(1)),
1760 test_xy<T>("var a := 2; (a + 0) == a",T(0),T(0),T(1)),
1761 test_xy<T>("var a := 2; (1 * a) == a",T(0),T(0),T(1)),
1762 test_xy<T>("var a.b := 3; (2 * a.b ) == 6",T(0),T(0),T(1)),
1763 test_xy<T>("var aa.bb := 3; (2 * aa.bb ) == 6",T(0),T(0),T(1)),
1764 test_xy<T>("var aaa.bbb := 3; (2 * aAa.BbB) == 6",T(0),T(0),T(1)),
1765 test_xy<T>("var a1.b2 := 3; (2 * a1.b2 ) == 6",T(0),T(0),T(1))
1766 };
1767
1768 static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xy<T>);
1769
1770 const std::size_t rounds = 60;
1771
1772 for (std::size_t r = 0; r < rounds; ++r)
1773 {
1774 bool loop_result = true;
1775
1776 for (std::size_t i = 0; i < test_list_size; ++i)
1777 {
1778 test_xy<T>& test = const_cast<test_xy<T>&>(test_list[i]);
1779
1780 T x = test.x;
1781 T y = test.y;
1782
1783 exprtk::symbol_table<T> symbol_table;
1784 symbol_table.add_variable("x",x);
1785 symbol_table.add_variable("y",y);
1786
1787 exprtk::expression<T> expression;
1788 expression.register_symbol_table(symbol_table);
1789
1790 {
1791 exprtk::parser<T> parser;
1792
1793 if (!parser.compile(test.expr,expression))
1794 {
1795 printf("run_test01() - Error: %s Expression: %s\n",
1796 parser.error().c_str(),
1797 test.expr.c_str());
1798
1799 loop_result = false;
1800
1801 continue;
1802 }
1803 }
1804
1805 const T result = expression.value();
1806
1807 if (not_equal(result,test.result))
1808 {
1809 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1810 test.expr.c_str(),
1811 static_cast<double>(test.result),
1812 static_cast<double>(result));
1813
1814 loop_result = false;
1815 }
1816 }
1817
1818 if (!loop_result)
1819 {
1820 return false;
1821 }
1822 }
1823 }
1824
1825 {
1826 static const test_xyzw<T> test_list[] =
1827 {
1828 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 ))),
1829 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 ))),
1830 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 ))),
1831 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 ))),
1832 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)))),
1833 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)))),
1834 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)))),
1835 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)))),
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>("([(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))),
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>("(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))))),
1868 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)),
1869 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)),
1870 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)),
1871 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)),
1872 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)),
1873 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)),
1874 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)),
1875 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)),
1876 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)),
1877 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)),
1878 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)),
1879 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))
1880 };
1881
1882 static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_xyzw<T>);
1883
1884 const std::size_t rounds = 60;
1885
1886 for (std::size_t r = 0; r < rounds; ++r)
1887 {
1888 bool loop_result = true;
1889 for (std::size_t i = 0; i < test_list_size; ++i)
1890 {
1891 test_xyzw<T>& test = const_cast<test_xyzw<T>&>(test_list[i]);
1892
1893 exprtk::symbol_table<T> symbol_table;
1894 symbol_table.add_variable("x",test.x);
1895 symbol_table.add_variable("y",test.y);
1896 symbol_table.add_variable("z",test.z);
1897 symbol_table.add_variable("w",test.w);
1898
1899 exprtk::expression<T> expression;
1900 expression.register_symbol_table(symbol_table);
1901
1902 {
1903 exprtk::parser<T> parser;
1904
1905 if (!parser.compile(test.expr,expression))
1906 {
1907 printf("run_test01() - Error: %s Expression: %s\n",
1908 parser.error().c_str(),
1909 test.expr.c_str());
1910
1911 loop_result = false;
1912
1913 continue;
1914 }
1915 }
1916
1917 const T result = expression.value();
1918
1919 if (not_equal(result,test.result))
1920 {
1921 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
1922 test.expr.c_str(),
1923 static_cast<double>(test.result),
1924 static_cast<double>(result));
1925
1926 loop_result = false;
1927 }
1928 }
1929
1930 if (!loop_result)
1931 {
1932 return false;
1933 }
1934 }
1935 }
1936
1937 {
1938 const std::string expr_list[] =
1939 {
1940 "((v[1] + x) == (x + v[1]))",
1941 "((v[0] += x) == x)",
1942 "((v[0] += x + y) == (x + y))",
1943 "((v[0] -= x) == -x)",
1944 "((v[0] -= (x + y)) == -(x + y))",
1945 "((v[1] + v[2]) == (v[3 - 1] + v[2 * 1/2]))",
1946 "(v[v[1]] == v[1])",
1947 "(v[1] += v[1]) == v[1 + 1]",
1948 "((v[i[1]] + x) == (x + v[i[1]]))",
1949 "((v[i[0]] += x) == x)",
1950 "((v[i[0]] += x + y) == (x + y))",
1951 "((v[i[0]] -= x) == -x)",
1952 "((v[i[0]] -= (x + y)) == -(x + y))",
1953 "((v[i[1]] + v[2]) == (v[i[3] - i[1]] + v[i[2] * 1/2]))",
1954 "(v[v[i[1]]] == v[i[1]])",
1955 "(v[i[1]] += v[i[1]]) == v[i[1] + 1]"
1956 };
1957
1958 const std::size_t expr_list_size = sizeof(expr_list) / sizeof(std::string);
1959
1960 const std::size_t rounds = 60;
1961
1962 for (std::size_t r = 0; r < rounds; ++r)
1963 {
1964 bool loop_result = true;
1965
1966 for (std::size_t i = 0; i < expr_list_size; ++i)
1967 {
1968 T v[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
1969 T index[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
1970
1971 T x = T(6.6);
1972 T y = T(7.7);
1973 T z = T(8.8);
1974
1975 exprtk::symbol_table<T> symbol_table;
1976 symbol_table.add_variable("x",x);
1977 symbol_table.add_variable("y",y);
1978 symbol_table.add_variable("z",z);
1979 symbol_table.add_vector ("v",v);
1980 symbol_table.add_vector ("i",index);
1981
1982 exprtk::expression<T> expression;
1983 expression.register_symbol_table(symbol_table);
1984
1985 {
1986 exprtk::parser<T> parser;
1987
1988 if (!parser.compile(expr_list[i],expression))
1989 {
1990 printf("run_test01() - Error: %s Expression: %s\n",
1991 parser.error().c_str(),
1992 expr_list[i].c_str());
1993
1994 loop_result = false;
1995
1996 continue;
1997 }
1998 }
1999
2000 const T result = expression.value();
2001
2002 if (not_equal(result,T(1)))
2003 {
2004 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
2005 expr_list[i].c_str(),
2006 static_cast<double>(1.0),
2007 static_cast<double>(result));
2008
2009 loop_result = false;
2010 }
2011 }
2012
2013 if (!loop_result)
2014 {
2015 return false;
2016 }
2017 }
2018
2019 for (std::size_t r = 0; r < rounds; ++r)
2020 {
2021 bool loop_result = true;
2022
2023 for (std::size_t i = 0; i < expr_list_size; ++i)
2024 {
2025 T v_[] = { T(0.0), T(1.1), T(2.2), T(3.3), T(4.4), T(5.5) };
2026 T index_[] = { T(0) , T(1) , T(2) , T(3) , T(4) , T(5) };
2027
2028 T x = T(6.6);
2029 T y = T(7.7);
2030 T z = T(8.8);
2031
2034
2035 exprtk::symbol_table<T> symbol_table;
2036 symbol_table.add_variable("x",x);
2037 symbol_table.add_variable("y",y);
2038 symbol_table.add_variable("z",z);
2039 symbol_table.add_vector ("v",v);
2040 symbol_table.add_vector ("i",index);
2041
2042 exprtk::expression<T> expression;
2043 expression.register_symbol_table(symbol_table);
2044
2045 {
2046 exprtk::parser<T> parser;
2047
2048 if (!parser.compile(expr_list[i],expression))
2049 {
2050 printf("run_test01() - Error: %s Expression: %s\n",
2051 parser.error().c_str(),
2052 expr_list[i].c_str());
2053
2054 loop_result = false;
2055
2056 continue;
2057 }
2058 }
2059
2060 const T result = expression.value();
2061
2062 if (not_equal(result,T(1)))
2063 {
2064 printf("run_test01() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\n",
2065 expr_list[i].c_str(),
2066 static_cast<double>(1.0),
2067 static_cast<double>(result));
2068 loop_result = false;
2069 }
2070 }
2071
2072 if (!loop_result)
2073 {
2074 return false;
2075 }
2076 }
2077 }
2078
2079 return true;
2080}
2081
2082template <typename T>
2083struct test_ab
2084{
2085 test_ab(const std::string& e, const std::string& v0, const std::string& v1, const T& r)
2086 : expr(e)
2087 , a(v0)
2088 , b(v1)
2089 , c("ccc")
2090 , result(r)
2091 {}
2092
2093 std::string expr;
2094 std::string a;
2095 std::string b;
2096 std::string c;
2097 T result;
2098};
2099
2100template <typename T>
2102{
2103 static const test_ab<T> test_list[] =
2104 {
2105 test_ab<T>("'aaa' == 'aaa'" ,"","",T(1.0)),
2106 test_ab<T>("'aaa' < 'bbb'" ,"","",T(1.0)),
2107 test_ab<T>("'aaa' <= 'bbb'" ,"","",T(1.0)),
2108 test_ab<T>("'bbb' > 'aaa'" ,"","",T(1.0)),
2109 test_ab<T>("'bbb' >= 'aaa'" ,"","",T(1.0)),
2110 test_ab<T>("'aaa' != 'aaa'" ,"","",T(0.0)),
2111 test_ab<T>("'aaa' != 'bbb'" ,"","",T(1.0)),
2112 test_ab<T>("'aaa' + '123' == 'aaa123'" ,"","",T(1.0)),
2113 test_ab<T>("'aaa123' == 'aaa' + '123'" ,"","",T(1.0)),
2114 test_ab<T>("('aaa' + '123') == 'aaa123'" ,"","",T(1.0)),
2115 test_ab<T>("'aaa123' == ('aaa' + '123')" ,"","",T(1.0)),
2116 test_ab<T>("'aaa' in 'aaa123'" ,"","",T(1.0)),
2117 test_ab<T>("'123' in 'aaa123'" ,"","",T(1.0)),
2118 test_ab<T>("'a123b' like '*123*'" ,"","",T(1.0)),
2119 test_ab<T>("'a123b' like '*123?'" ,"","",T(1.0)),
2120 test_ab<T>("'1XYZ2' ilike '*xyz*'" ,"","",T(1.0)),
2121 test_ab<T>("'1XYZ2' ilike '*xyz?'" ,"","",T(1.0)),
2122 test_ab<T>("inrange('aaa','bbb','ccc')" ,"","",T(1.0)),
2123 test_ab<T>("a == b" ,"aaa","aaa",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>("a <= b" ,"aaa","bbb",T(1.0)),
2127 test_ab<T>("b > a" ,"aaa","bbb",T(1.0)),
2128 test_ab<T>("b >= a" ,"aaa","bbb",T(1.0)),
2129 test_ab<T>("a in b" ,"aaa","aaa123",T(1.0)),
2130 test_ab<T>("a in b" ,"123","aaa123",T(1.0)),
2131 test_ab<T>("a == 'aaa'" ,"aaa","aaa",T(1.0)),
2132 test_ab<T>("'aaa' == a" ,"aaa","aaa",T(1.0)),
2133 test_ab<T>("a != 'bbb'" ,"aaa","bbb",T(1.0)),
2134 test_ab<T>("'bbb' != a" ,"aaa","bbb",T(1.0)),
2135 test_ab<T>("a < 'bbb'" ,"aaa","bbb",T(1.0)),
2136 test_ab<T>("a <= 'bbb'" ,"aaa","bbb",T(1.0)),
2137 test_ab<T>("'bbb' > a" ,"aaa","bbb",T(1.0)),
2138 test_ab<T>("'bbb' >= a" ,"aaa","bbb",T(1.0)),
2139 test_ab<T>("a in 'aaa123'" ,"aaa","aaa123",T(1.0)),
2140 test_ab<T>("a in 'aaa123'" ,"123","aaa123",T(1.0)),
2141 test_ab<T>("'aaa' in b" ,"aaa","aaa123",T(1.0)),
2142 test_ab<T>("'123' in b" ,"aaa","aaa123",T(1.0)),
2143 test_ab<T>("(a < b) or (a == b)" ,"aaa","bbb",T(1.0)),
2144 test_ab<T>("(a == b) or (a < b)" ,"aaa","bbb",T(1.0)),
2145 test_ab<T>("(b > a) or (b == a)" ,"aaa","bbb",T(1.0)),
2146 test_ab<T>("(b == a) or (b > a)" ,"aaa","bbb",T(1.0)),
2147 test_ab<T>("(a < b) and (b > a)" ,"aaa","bbb",T(1.0)),
2148 test_ab<T>("a like '*123*'" ,"a123b","",T(1.0)),
2149 test_ab<T>("a like '*123?'" ,"a123b","",T(1.0)),
2150 test_ab<T>("'a123b' like b" ,"a123b","*123*",T(1.0)),
2151 test_ab<T>("'a123b' like b" ,"a123b","*123?",T(1.0)),
2152 test_ab<T>("a ilike '*xyz*'" ,"1XYZ2","",T(1.0)),
2153 test_ab<T>("a ilike '*xyz?'" ,"1XYZ2","",T(1.0)),
2154 test_ab<T>("'1XYZ2' ilike b" ,"","*xyz*",T(1.0)),
2155 test_ab<T>("'1XYZ2' ilike b" ,"","*xyz?",T(1.0)),
2156 test_ab<T>("inrange(a,'bbb',c)" ,"aaa","bbb",T(1.0)),
2157 test_ab<T>("inrange('aaa',b,'ccc')" ,"aaa","bbb",T(1.0)),
2158 test_ab<T>("inrange(a,b,c)" ,"aaa","bbb",T(1.0)),
2159 test_ab<T>("inrange(a,b,'ccc')" ,"aaa","bbb",T(1.0)),
2160 test_ab<T>("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
2161 test_ab<T>("inrange('aaa',b,c)" ,"aaa","bbb",T(1.0)),
2162 test_ab<T>("(a < b ? a : b) == a" ,"aaa","bbb",T(1.0)),
2163 test_ab<T>("(a > b ? a : b) == b" ,"aaa","bbb",T(1.0)),
2164 test_ab<T>("(a == (a + '1') ? a : b) == b" ,"aaa","bbb",T(1.0)),
2165 test_ab<T>("((a + '2') != a ? a : b) == a" ,"aaa","bbb",T(1.0)),
2166 test_ab<T>("(a < b ? a + '1' : b) == 'aaa1'","aaa","bbb",T(1.0)),
2167 test_ab<T>("(a > b ? a : b + '2') == 'bbb2'","aaa","bbb",T(1.0)),
2168 test_ab<T>("b == (a == (a + '1') ? a : b)" ,"aaa","bbb",T(1.0)),
2169 test_ab<T>("a == (a != (a + '2') ? a : b)" ,"aaa","bbb",T(1.0)),
2170 test_ab<T>("'aaa1' == (a < b ? a + '1' : b)","aaa","bbb",T(1.0)),
2171 test_ab<T>("'bbb2' == (a > b ? a : b + '2')","aaa","bbb",T(1.0)),
2172 test_ab<T>("(a < b ? a[1:3] : b) == '23'" ,"1234","67890",T(1.0)),
2173 test_ab<T>("(a > b ? a : b[0:4]) == '6789'" ,"1234","67890",T(1.0)),
2174 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x : y) == x }}","","",T(1.0)),
2175 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y) == y }}","","",T(1.0)),
2176 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x == (x + '1') ? x : y) == y }}","","",T(1.0)),
2177 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{((x + '2') != x ? x : y) == x }}","","",T(1.0)),
2178 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x < y ? x + '1' : y) == 'xxx1'}}","","",T(1.0)),
2179 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{(x > y ? x : y + '2') == 'yyy2'}}","","",T(1.0)),
2180 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{y == (x == (x + '1') ? x : y) }}","","",T(1.0)),
2181 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{x == (x != (x + '2') ? x : y) }}","","",T(1.0)),
2182 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'xxx1' == (x < y ? x + '1' : y)}}","","",T(1.0)),
2183 test_ab<T>("~{var x := 'xxx'; var y := 'yyy';~{'yyy2' == (x > y ? x : y + '2')}}","","",T(1.0)),
2184 test_ab<T>("'01234567890123456789'[0:9] == '0123456789' ","","",T(1.0)),
2185 test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:] ","","",T(1.0)),
2186 test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[0:]","","",T(1.0)),
2187 test_ab<T>("'01234567890123456789'[0:9] == '0123456789'[:9]","","",T(1.0)),
2188 test_ab<T>("'01234567890123456789'[:9] == '0123456789'[:9]","","",T(1.0)),
2189 test_ab<T>("'01234567890123456789'[10:] == '0123456789'[:] ","","",T(1.0)),
2190 test_ab<T>("'01234567890123456789'[0:9] != '123456789' ","","",T(1.0)),
2191 test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:] ","","",T(1.0)),
2192 test_ab<T>("'01234567890123456789'[0:9] != '123456789'[0:] ","","",T(1.0)),
2193 test_ab<T>("'01234567890123456789'[0:9] != '123456789'[:8] ","","",T(1.0)),
2194 test_ab<T>("'01234567890123456789'[:9] != '123456789'[:8] ","","",T(1.0)),
2195 test_ab<T>("'01234567890123456789'[10:] != '123456789'[:] ","","",T(1.0)),
2196 test_ab<T>("'01234567890123456789'[2*6:10+6] == '23456' ","","",T(1.0)),
2197 test_ab<T>("'0123456789' == '01234567890123456789'[0:9]","","",T(1.0)),
2198 test_ab<T>("'0123456789'[:] == '01234567890123456789'[0:9]","","",T(1.0)),
2199 test_ab<T>("'0123456789'[0:] == '01234567890123456789'[0:9]","","",T(1.0)),
2200 test_ab<T>("'0123456789'[:9] == '01234567890123456789'[0:9]","","",T(1.0)),
2201 test_ab<T>("'0123456789'[:9] == '01234567890123456789'[:9] ","","",T(1.0)),
2202 test_ab<T>("'0123456789'[:] == '01234567890123456789'[10:]","","",T(1.0)),
2203 test_ab<T>("'0123456789'[3:3] == '3'[:] ","","",T(1.0)),
2204 test_ab<T>("'0123456789'[3:3] == '3'[0:0] ","","",T(1.0)),
2205 test_ab<T>("'123456789' != '01234567890123456789'[0:9]","","",T(1.0)),
2206 test_ab<T>("'123456789'[:] != '01234567890123456789'[0:9]","","",T(1.0)),
2207 test_ab<T>("'123456789'[0:] != '01234567890123456789'[0:9]","","",T(1.0)),
2208 test_ab<T>("'123456789'[:8] != '01234567890123456789'[0:9]","","",T(1.0)),
2209 test_ab<T>("'123456789'[:8] != '01234567890123456789'[:9] ","","",T(1.0)),
2210 test_ab<T>("'123456789'[:] != '01234567890123456789'[10:]","","",T(1.0)),
2211 test_ab<T>("'23456' == '01234567890123456789'[2*6:10+6] ","","",T(1.0)),
2212 test_ab<T>("'01234567890123456789'[r0: 6] == '23456' ","","",T(1.0)),
2213 test_ab<T>("'01234567890123456789'[2: r1] == '23456' ","","",T(1.0)),
2214 test_ab<T>("'01234567890123456789'[r0:3*2] == '23456' ","","",T(1.0)),
2215 test_ab<T>("'01234567890123456789'[1+1:r1] == '23456' ","","",T(1.0)),
2216 test_ab<T>("'01234567890123456789'[r0: ] == '234567890123456789' ","","",T(1.0)),
2217 test_ab<T>("'01234567890123456789'[: r1] == '0123456' ","","",T(1.0)),
2218 test_ab<T>("'01234567890123456789'[r0:r1] == '23456' ","","",T(1.0)),
2219 test_ab<T>("'01234567890123456789'[r0:r1+2] == '2345678' ","","",T(1.0)),
2220 test_ab<T>("'01234567890123456789'[r0+2:r1] == '456' ","","",T(1.0)),
2221 test_ab<T>("'01234567890123456789'[r1-r0:] == '4567890123456789' ","","",T(1.0)),
2222 test_ab<T>("'01234567890123456789'[:r1-r0] == '01234' ","","",T(1.0)),
2223 test_ab<T>("'23456' == '01234567890123456789'[r0: 6] ","","",T(1.0)),
2224 test_ab<T>("'23456' == '01234567890123456789'[2: r1] ","","",T(1.0)),
2225 test_ab<T>("'23456' == '01234567890123456789'[r0:3*2] ","","",T(1.0)),
2226 test_ab<T>("'23456' == '01234567890123456789'[1+1:r1] ","","",T(1.0)),
2227 test_ab<T>("'234567890123456789' == '01234567890123456789'[r0: ] ","","",T(1.0)),
2228 test_ab<T>("'0123456' == '01234567890123456789'[: r1] ","","",T(1.0)),
2229 test_ab<T>("'23456' == '01234567890123456789'[r0:r1] ","","",T(1.0)),
2230 test_ab<T>("'2345678' == '01234567890123456789'[r0:r1+2] ","","",T(1.0)),
2231 test_ab<T>("'456' == '01234567890123456789'[r0+2:r1] ","","",T(1.0)),
2232 test_ab<T>("'4567890123456789' == '01234567890123456789'[r1-r0:] ","","",T(1.0)),
2233 test_ab<T>("'01234' == '01234567890123456789'[:r1-r0] ","","",T(1.0)),
2234 test_ab<T>("a[r0: 6] == '23456' ","01234567890123456789","",T(1.0)),
2235 test_ab<T>("a[2: r1] == '23456' ","01234567890123456789","",T(1.0)),
2236 test_ab<T>("a[r0:3*2] == '23456' ","01234567890123456789","",T(1.0)),
2237 test_ab<T>("a[1+1:r1] == '23456' ","01234567890123456789","",T(1.0)),
2238 test_ab<T>("a[r0: ] == '234567890123456789' ","01234567890123456789","",T(1.0)),
2239 test_ab<T>("a[: r1] == '0123456' ","01234567890123456789","",T(1.0)),
2240 test_ab<T>("a[r0:r1] == '23456' ","01234567890123456789","",T(1.0)),
2241 test_ab<T>("a[r0:r1+2] == '2345678' ","01234567890123456789","",T(1.0)),
2242 test_ab<T>("a[r0+2:r1] == '456' ","01234567890123456789","",T(1.0)),
2243 test_ab<T>("a[r1-r0:] == '4567890123456789' ","01234567890123456789","",T(1.0)),
2244 test_ab<T>("a[:r1-r0] == '01234' ","01234567890123456789","",T(1.0)),
2245 test_ab<T>("'23456' == a[r0: 6] ","01234567890123456789","",T(1.0)),
2246 test_ab<T>("'23456' == a[2: r1] ","01234567890123456789","",T(1.0)),
2247 test_ab<T>("'23456' == a[r0:3*2] ","01234567890123456789","",T(1.0)),
2248 test_ab<T>("'23456' == a[1+1:r1] ","01234567890123456789","",T(1.0)),
2249 test_ab<T>("'234567890123456789' == a[r0: ] ","01234567890123456789","",T(1.0)),
2250 test_ab<T>("'0123456' == a[: r1] ","01234567890123456789","",T(1.0)),
2251 test_ab<T>("'23456' == a[r0:r1] ","01234567890123456789","",T(1.0)),
2252 test_ab<T>("'2345678' == a[r0:r1+2] ","01234567890123456789","",T(1.0)),
2253 test_ab<T>("'456' == a[r0+2:r1] ","01234567890123456789","",T(1.0)),
2254 test_ab<T>("'4567890123456789' == a[r1-r0:] ","01234567890123456789","",T(1.0)),
2255 test_ab<T>("'01234' == a[:r1-r0] ","01234567890123456789","",T(1.0)),
2256 test_ab<T>("a[r0: 6] == b ","01234567890123456789","23456",T(1.0)),
2257 test_ab<T>("a[2: r1] == b ","01234567890123456789","23456",T(1.0)),
2258 test_ab<T>("a[r0:3*2] == b ","01234567890123456789","23456",T(1.0)),
2259 test_ab<T>("a[1+1:r1] == b ","01234567890123456789","23456",T(1.0)),
2260 test_ab<T>("a[r0: ] == b ","01234567890123456789","234567890123456789",T(1.0)),
2261 test_ab<T>("a[: r1] == b ","01234567890123456789","0123456",T(1.0)),
2262 test_ab<T>("a[r0:r1] == b ","01234567890123456789","23456",T(1.0)),
2263 test_ab<T>("a[r0:r1+2] == b ","01234567890123456789","2345678",T(1.0)),
2264 test_ab<T>("a[r0+2:r1] == b ","01234567890123456789","456",T(1.0)),
2265 test_ab<T>("a[r1-r0:] == b ","01234567890123456789","4567890123456789",T(1.0)),
2266 test_ab<T>("a[:r1-r0] == b ","01234567890123456789","01234",T(1.0)),
2267 test_ab<T>("b == a[r0: 6] ","01234567890123456789","23456",T(1.0)),
2268 test_ab<T>("b == a[2: r1] ","01234567890123456789","23456",T(1.0)),
2269 test_ab<T>("b == a[r0:3*2] ","01234567890123456789","23456",T(1.0)),
2270 test_ab<T>("b == a[1+1:r1] ","01234567890123456789","23456",T(1.0)),
2271 test_ab<T>("b == a[r0: ] ","01234567890123456789","234567890123456789",T(1.0)),
2272 test_ab<T>("b == a[: r1] ","01234567890123456789","0123456",T(1.0)),
2273 test_ab<T>("b == a[r0:r1] ","01234567890123456789","23456",T(1.0)),
2274 test_ab<T>("b == a[r0:r1+2] ","01234567890123456789","2345678",T(1.0)),
2275 test_ab<T>("b == a[r0+2:r1] ","01234567890123456789","456",T(1.0)),
2276 test_ab<T>("b == a[r1-r0:] ","01234567890123456789","4567890123456789",T(1.0)),
2277 test_ab<T>("b == a[:r1-r0] ","01234567890123456789","01234",T(1.0)),
2278 test_ab<T>("'01234567890123456789'[0:9] == a ","0123456789","",T(1.0)),
2279 test_ab<T>("'01234567890123456789'[0:9] == a[:] ","0123456789","",T(1.0)),
2280 test_ab<T>("'01234567890123456789'[0:9] == a[0:] ","0123456789","",T(1.0)),
2281 test_ab<T>("'01234567890123456789'[0:9] == a[:9] ","0123456789","",T(1.0)),
2282 test_ab<T>("'01234567890123456789'[:9] == a[:9] ","0123456789","",T(1.0)),
2283 test_ab<T>("'01234567890123456789'[10:] == a[:] ","0123456789","",T(1.0)),
2284 test_ab<T>("'01234567890123456789'[0:9] != a ","123456789" ,"",T(1.0)),
2285 test_ab<T>("'01234567890123456789'[0:9] != a[:] ","123456789" ,"",T(1.0)),
2286 test_ab<T>("'01234567890123456789'[0:9] != a[0:] ","123456789" ,"",T(1.0)),
2287 test_ab<T>("'01234567890123456789'[0:9] != a[:8] ","123456789" ,"",T(1.0)),
2288 test_ab<T>("'01234567890123456789'[:9] != a[:8] ","123456789" ,"",T(1.0)),
2289 test_ab<T>("'01234567890123456789'[10:] != a[:] ","123456789" ,"",T(1.0)),
2290 test_ab<T>("'01234567890123456789'[2*6:10+6] == a","23456" ,"",T(1.0)),
2291 test_ab<T>("'23456' == a[:] ","23456" ,"",T(1.0)),
2292 test_ab<T>("a == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2293 test_ab<T>("a[:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2294 test_ab<T>("a[0:] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2295 test_ab<T>("a[:9] == '01234567890123456789'[0:9] ","0123456789","",T(1.0)),
2296 test_ab<T>("a[:9] == '01234567890123456789'[:9] ","0123456789","",T(1.0)),
2297 test_ab<T>("a[:] == '01234567890123456789'[10:] ","0123456789","",T(1.0)),
2298 test_ab<T>("a != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2299 test_ab<T>("a[:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2300 test_ab<T>("a[0:] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2301 test_ab<T>("a[:8] != '01234567890123456789'[0:9] ","123456789" ,"",T(1.0)),
2302 test_ab<T>("a[:8] != '01234567890123456789'[:9] ","123456789" ,"",T(1.0)),
2303 test_ab<T>("a[:] != '01234567890123456789'[10:] ","123456789" ,"",T(1.0)),
2304 test_ab<T>("a == '01234567890123456789'[2*6:10+6]","23456" ,"",T(1.0)),
2305 test_ab<T>("a[:] == '23456' ","23456" ,"",T(1.0)),
2306 test_ab<T>("a[0:9] == b ","01234567890123456789","0123456789",T(1.0)),
2307 test_ab<T>("a[0:9] == b[:] ","01234567890123456789","0123456789",T(1.0)),
2308 test_ab<T>("a[0:9] == b[0:] ","01234567890123456789","0123456789",T(1.0)),
2309 test_ab<T>("a[0:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
2310 test_ab<T>("a[:9] == b[:9] ","01234567890123456789","0123456789",T(1.0)),
2311 test_ab<T>("a[10:] == b[:] ","01234567890123456789","0123456789",T(1.0)),
2312 test_ab<T>("a[0:9] != b ","01234567890123456789","123456789" ,T(1.0)),
2313 test_ab<T>("a[0:9] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
2314 test_ab<T>("a[0:9] != b[0:] ","01234567890123456789","123456789" ,T(1.0)),
2315 test_ab<T>("a[0:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
2316 test_ab<T>("a[:9] != b[:8] ","01234567890123456789","123456789" ,T(1.0)),
2317 test_ab<T>("a[10:] != b[:] ","01234567890123456789","123456789" ,T(1.0)),
2318 test_ab<T>("a[2*6:10+6] == b ","01234567890123456789","23456" ,T(1.0)),
2319 test_ab<T>("b == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2320 test_ab<T>("b[:] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2321 test_ab<T>("b[0:] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2322 test_ab<T>("b[:9] == a[0:9] ","01234567890123456789","0123456789",T(1.0)),
2323 test_ab<T>("b[:9] == a[:9] ","01234567890123456789","0123456789",T(1.0)),
2324 test_ab<T>("b[:] == a[10:] ","01234567890123456789","0123456789",T(1.0)),
2325 test_ab<T>("b != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2326 test_ab<T>("b[:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2327 test_ab<T>("b[0:] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2328 test_ab<T>("b[:8] != a[0:9] ","01234567890123456789","123456789" ,T(1.0)),
2329 test_ab<T>("b[:8] != a[:9] ","01234567890123456789","123456789" ,T(1.0)),
2330 test_ab<T>("b[:] != a[10:] ","01234567890123456789","123456789" ,T(1.0)),
2331 test_ab<T>("b == a[2*6:10+6] ","01234567890123456789","23456" ,T(1.0)),
2332 test_ab<T>("a[2:6] == b" ,"0123456789","23456" ,T(1.0)),
2333 test_ab<T>("a == b[2:6]" ,"23456","0123456789" ,T(1.0)),
2334 test_ab<T>("a[1+1:2*3] == b" ,"0123456789","23456" ,T(1.0)),
2335 test_ab<T>("a == b[4/2:sqrt(36)]","23456","0123456789" ,T(1.0)),
2336 test_ab<T>("a[0:6] == b" ,"0123456789","0123456",T(1.0)),
2337 test_ab<T>("a[:6] == b" ,"0123456789","0123456",T(1.0)),
2338 test_ab<T>("a[4/2-2:2+4] == b" ,"0123456789","0123456",T(1.0)),
2339 test_ab<T>("a[:12/2] == b" ,"0123456789","0123456",T(1.0)),
2340 test_ab<T>("a[0:] == b" ,"0123456","0123456" ,T(1.0)),
2341 test_ab<T>("a[:] == b" ,"0123456","0123456" ,T(1.0)),
2342 test_ab<T>("a == b[0:6]" ,"0123456","0123456789",T(1.0)),
2343 test_ab<T>("a == b[:6]" ,"0123456","0123456789",T(1.0)),
2344 test_ab<T>("a == b[4/2-2:2+4]" ,"0123456","0123456789",T(1.0)),
2345 test_ab<T>("a == b[:12/2]" ,"0123456","0123456789",T(1.0)),
2346 test_ab<T>("a == b[0:]" ,"0123456","0123456" ,T(1.0)),
2347 test_ab<T>("a == b[:]" ,"0123456","0123456" ,T(1.0)),
2348 test_ab<T>("a[:9] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2349 test_ab<T>("a[0:9] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2350 test_ab<T>("a[0:] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2351 test_ab<T>("a[:] == b[0:9]" ,"0123456789","01234567890123456789",T(1.0)),
2352 test_ab<T>("a[:] == b[10:]" ,"0123456789","01234567890123456789",T(1.0)),
2353 test_ab<T>("'!@#$%^&*([{}])-=' != ')]}{[(*&^%$#@!'","","",T(1.0)),
2354 test_ab<T>("('!@#$%^&*([{}])-=') != (')]}{[(*&^%$#@!')","","",T(1.0)),
2355 test_ab<T>("{[('a')]} == [{('a')}]","","",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>("{[('!@#$%^&*([{}])-=')]} == [{('!@#$%^&*([{}])-=')}]","","",T(1.0)),
2360 test_ab<T>("'1234\\\\abc\nxyz\r890\tqaz\\'567' == a","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
2361 test_ab<T>("a == '1234\\\\abc\nxyz\r890\tqaz\\'567'","1234\\abc\nxyz\r890\tqaz'567","",T(1.0)),
2362 test_ab<T>("'123'[] == 3" ,"","" ,T(1.0)),
2363 test_ab<T>("3 == '123'[]" ,"","" ,T(1.0)),
2364 test_ab<T>("'123'[] + '1234'[] == 7" ,"","" ,T(1.0)),
2365 test_ab<T>("abs('123'[] - '1234'[]) == 1" ,"","" ,T(1.0)),
2366 test_ab<T>("'1234'[] == a[]" ,"1234","" ,T(1.0)),
2367 test_ab<T>("'123'[] + a[] == 7" ,"1234","" ,T(1.0)),
2368 test_ab<T>("abs(a[] - '12345'[]) == 1" ,"1234","" ,T(1.0)),
2369 test_ab<T>("'1234'[] + '12345'[] == a[] + b[]" ,"1234","12345" ,T(1.0)),
2370 test_ab<T>("abs('123'[] -'1234'[]) == abs(a[] - b[])" ,"1234","12345",T(1.0)),
2371 test_ab<T>("(a + b) == 'abc123' ","abc","123" ,T(1.0)),
2372 test_ab<T>("(a + '123') == 'abc123' ","abc","123" ,T(1.0)),
2373 test_ab<T>("('abc' + b) == 'abc123' ","abc","123" ,T(1.0)),
2374 test_ab<T>("(a + '1') == 'abc1' ","abc","123" ,T(1.0)),
2375 test_ab<T>("('a' + b) == 'a123' ","abc","123" ,T(1.0)),
2376 test_ab<T>("(a[2:8] + b) == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
2377 test_ab<T>("(a + b[2:8]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
2378 test_ab<T>("(a[2:8] + '0123') == 'cdefgh0123' ","abcdefghij","0123",T(1.0)),
2379 test_ab<T>("('abc' + b[2:8]) == 'abc234567' ","abc","0123456789" ,T(1.0)),
2380 test_ab<T>("(a[2:3] + b[3:4]) == 'c3' ","abc","0123456789" ,T(1.0)),
2381 test_ab<T>("(a[3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2382 test_ab<T>("('abc' + b[:8]) == 'abc01234567' ","abc","0123456789" ,T(1.0)),
2383 test_ab<T>("a + '123' == 'abc'+ b ","abc" , "123" , T(1.0)),
2384 test_ab<T>("a[0:3] + '123' == 'abc' + b[0:3] ","abcXYZ", "123XYZ", T(1.0)),
2385 test_ab<T>("a[ :3] + '123' == 'abc' + b[ :3] ","abcXYZ", "123XYZ", T(1.0)),
2386 test_ab<T>("a[3: ] + '123' == 'abc' + b[3: ]","XYZabc", "XYZ123", T(1.0)),
2387 test_ab<T>("a[3:a[]] + '123' == 'abc' + b[3:b[]]","XYZabc", "XYZ123", T(1.0)),
2388 test_ab<T>("(a[r0:r2] + b) == 'cdefg0123' ","abcdefghij","0123",T(1.0)),
2389 test_ab<T>("(a + b[r0:r2]) == 'abc23456' ","abc","0123456789" ,T(1.0)),
2390 test_ab<T>("(a[r0:r2] + '0123') == 'cdefg0123' ","abcdefghij","0123",T(1.0)),
2391 test_ab<T>("('abc' + b[r0:r2]) == 'abc23456' ","abc","0123456789" ,T(1.0)),
2392 test_ab<T>("(a[r0:r0+1] + b[r3:r3+1]) == 'c3' ","abc","0123456789" ,T(1.0)),
2393 test_ab<T>("(a[r3:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2394 test_ab<T>("('abc' + b[:r2]) == 'abc0123456' ","abc","0123456789" ,T(1.0)),
2395 test_ab<T>("a[0:r0] + '123' == 'ab'+ b[0:r0+1] ","abcXYZ", "123XYZ", T(1.0)),
2396 test_ab<T>("a[ :r0] + '123' == 'ab' +b[ :r0+1] ","abcXYZ", "123XYZ", T(1.0)),
2397 test_ab<T>("a[r3: ] + '123' == 'abc' + b[r3: ]","XYZabc", "XYZ123", T(1.0)),
2398 test_ab<T>("a[r3:a[]] + '123' == 'abc' + b[r3:b[]] ","XYZabc", "XYZ123", T(1.0)),
2399 test_ab<T>("(a[r0:r0+1] + b[r3:r0+2]) == 'c3' ","abc","0123456789" ,T(1.0)),
2400 test_ab<T>("(a[r0+1:] + b) == 'defghij0123' ","abcdefghij","0123",T(1.0)),
2401 test_ab<T>("a[r0+1: ] + '123' == 'abc' + b[r0+1: ]", "XYZabc" ,"XYZ123" ,T(1.0)),
2402 test_ab<T>("a[r0+1:a[]] + '123' == 'abc' + b[r0+1:b[]] ", "XYZabc" ,"XYZ123" ,T(1.0)),
2403 test_ab<T>("(a + b)[ :14] == 'abcdefghij0123' ", "abcdefghij", "0123456789" ,T(1.0)),
2404 test_ab<T>("(a + b)[ 6: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2405 test_ab<T>("(a + b)[ 2:3r1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2406 test_ab<T>("(a[2:8] + b[2:8]) == 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2407 test_ab<T>("(a[2:8] + b[2:8])[3:9] == 'fgh234' ", "abcdefghij", "0123456789" ,T(1.0)),
2408 test_ab<T>("(a + b)[r0 - 2: r1 + r2 +1] == 'abcdefghij0123'", "abcdefghij", "0123456789" ,T(1.0)),
2409 test_ab<T>("(a + b)[r0*r3:] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2410 test_ab<T>("(a + b)[3r0: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2411 test_ab<T>("(a + b)[2r3: ] == 'ghij0123456789' ", "abcdefghij", "0123456789" ,T(1.0)),
2412 test_ab<T>("(a + b)[2:3r1] == 'cdefghij01234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2413 test_ab<T>("(a[r0:8] + b[r0:r2+1])== 'cdefgh234567' ", "abcdefghij", "0123456789" ,T(1.0)),
2414 test_ab<T>("(a[r1 / r3:8] + b[r0:r2+1])[3:r2 + 2] == 'fgh234'", "abcdefghij", "0123456789" ,T(1.0)),
2415 test_ab<T>("(a += b) == 'abc123' ", "abc","123" ,T(1.0)),
2416 test_ab<T>("(a += '123') == 'abc123' ", "abc","123" ,T(1.0)),
2417 test_ab<T>("(a += b[3:6]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2418 test_ab<T>("(a += 'XXX123XXX'[3:6]) == 'abc123' ", "abc","123" ,T(1.0)),
2419 test_ab<T>("(a += b)[:] == 'abc123' ", "abc","123" ,T(1.0)),
2420 test_ab<T>("(a += '123')[:] == 'abc123' ", "abc","123" ,T(1.0)),
2421 test_ab<T>("(a += b[3:6])[:] == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2422 test_ab<T>("(a += 'XXX123XXX'[3:6])[:] == 'abc123' ", "abc","123" ,T(1.0)),
2423 test_ab<T>("(a += b[r1/2:r1]) == 'abc123' ", "abc","XXX123XXX" ,T(1.0)),
2424 test_ab<T>("(a += 'XXX123XXX'[r0+1:r1]) == 'abc123' ", "abc","123" ,T(1.0)),
2425 test_ab<T>("(a += b)[] == 6 ", "abc","123" ,T(1.0)),
2426 test_ab<T>("(a += '123')[] == 6 ", "abc","123" ,T(1.0)),
2427 test_ab<T>("(a += b[3:6])[] == 6 ", "abc","XXX123XXX" ,T(1.0)),
2428 test_ab<T>("(a += b[r0+1:r1])[] == 6 ", "abc","XXX123XXX" ,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)[:][:][:][:][:][:][:][]== 6 ","abc","123" ,T(1.0)),
2436 test_ab<T>("(a + b)[0:6] == 'abc123' ","abc","123" ,T(1.0)),
2437 test_ab<T>("(a + b)[0:6][1:5] == 'bc12' ","abc","123" ,T(1.0)),
2438 test_ab<T>("(a + b)[0:6][1:5][1:3] == 'c1' ","abc","123" ,T(1.0)),
2439 test_ab<T>("(a + b)[0:6][1:5][1:3][0:1] == 'c' ","abc","123" ,T(1.0)),
2440 test_ab<T>("(a + b)[0:6][] == 6 ","abc","123" ,T(1.0)),
2441 test_ab<T>("(a + b)[0:6][1:5][] == 4 ","abc","123" ,T(1.0)),
2442 test_ab<T>("(a + b)[0:6][1:5][1:3][] == 2 ","abc","123" ,T(1.0)),
2443 test_ab<T>("(a + b)[0:6][1:5][1:4][0:1][] == 1 ","abc","123" ,T(1.0)),
2444 test_ab<T>("(a[ : ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2445 test_ab<T>("(a[0: ] := b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2446 test_ab<T>("(a[ :10]:= b); (a == 'ABCDEFGHIJ');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2447 test_ab<T>("(a[3: 8]:= b); (a == '012ABCDE89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2448 test_ab<T>("(a[2: 9]:= b); (a == '01ABCDEFG9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2449 test_ab<T>("(a[1:10]:= b); (a == '0ABCDEFGHI');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2450 test_ab<T>("(a[0:1] := b); (a == 'A123456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2451 test_ab<T>("(a[1:2] := b); (a == '0A23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2452 test_ab<T>("(a[2:3] := b); (a == '01A3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2453 test_ab<T>("(a[3:4] := b); (a == '012A456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2454 test_ab<T>("(a[4:5] := b); (a == '0123A56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2455 test_ab<T>("(a[5:6] := b); (a == '01234A6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2456 test_ab<T>("(a[6:7] := b); (a == '012345A789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2457 test_ab<T>("(a[7:8] := b); (a == '0123456A89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2458 test_ab<T>("(a[8:9] := b); (a == '01234567A9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2459 test_ab<T>("(a[9:10]:= b); (a == '012345678A');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2460 test_ab<T>("(a[0:2] := b); (a == 'AB23456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2461 test_ab<T>("(a[1:3] := b); (a == '0AB3456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2462 test_ab<T>("(a[2:4] := b); (a == '01AB456789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2463 test_ab<T>("(a[3:5] := b); (a == '012AB56789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2464 test_ab<T>("(a[4:6] := b); (a == '0123AB6789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2465 test_ab<T>("(a[5:7] := b); (a == '01234AB789');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2466 test_ab<T>("(a[6:8] := b); (a == '012345AB89');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2467 test_ab<T>("(a[7:9] := b); (a == '0123456AB9');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2468 test_ab<T>("(a[8:10]:= b); (a == '01234567AB');", "0123456789","ABCDEFGHIJ" ,T(1.0)),
2469 test_ab<T>("(a[ : ] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2470 test_ab<T>("(a[0: ] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2471 test_ab<T>("(a[ :10] := b[3:b[] - 2]); (a == 'ABCDEFGHIJ');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2472 test_ab<T>("(a[3:8] := b[3:b[] - 2]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2473 test_ab<T>("(a[2:9] := b[3:b[] - 2]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2474 test_ab<T>("(a[1:10] := b[3:b[] - 2]); (a == '0ABCDEFGHI');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2475 test_ab<T>("(a[0:1] := b[3:b[] - 2]); (a == 'A123456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2476 test_ab<T>("(a[1:2] := b[3:b[] - 2]); (a == '0A23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2477 test_ab<T>("(a[2:3] := b[3:b[] - 2]); (a == '01A3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2478 test_ab<T>("(a[3:4] := b[3:b[] - 2]); (a == '012A456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2479 test_ab<T>("(a[4:5] := b[3:b[] - 2]); (a == '0123A56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2480 test_ab<T>("(a[5:6] := b[3:b[] - 2]); (a == '01234A6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2481 test_ab<T>("(a[6:7] := b[3:b[] - 2]); (a == '012345A789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2482 test_ab<T>("(a[7:8] := b[3:b[] - 2]); (a == '0123456A89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2483 test_ab<T>("(a[8:9] := b[3:b[] - 2]); (a == '01234567A9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2484 test_ab<T>("(a[9:10] := b[3:b[] - 2]); (a == '012345678A');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2485 test_ab<T>("(a[0:2] := b[3:b[] - 2]); (a == 'AB23456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2486 test_ab<T>("(a[1:3] := b[3:b[] - 2]); (a == '0AB3456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2487 test_ab<T>("(a[2:4] := b[3:b[] - 2]); (a == '01AB456789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2488 test_ab<T>("(a[3:5] := b[3:b[] - 2]); (a == '012AB56789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2489 test_ab<T>("(a[4:6] := b[3:b[] - 2]); (a == '0123AB6789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2490 test_ab<T>("(a[5:7] := b[3:b[] - 2]); (a == '01234AB789');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2491 test_ab<T>("(a[6:8] := b[3:b[] - 2]); (a == '012345AB89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2492 test_ab<T>("(a[7:9] := b[3:b[] - 2]); (a == '0123456AB9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2493 test_ab<T>("(a[8:10] := b[3:b[] - 2]); (a == '01234567AB');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2494 test_ab<T>("(a[0:10] := b); (a == 'A123456789');", "0123456789","A" ,T(1.0)),
2495 test_ab<T>("(a[0:10] := b); (a == 'AB23456789');", "0123456789","AB" ,T(1.0)),
2496 test_ab<T>("(a[0:10] := b); (a == 'ABC3456789');", "0123456789","ABC" ,T(1.0)),
2497 test_ab<T>("(a[0:10] := b); (a == 'ABCD456789');", "0123456789","ABCD" ,T(1.0)),
2498 test_ab<T>("(a[0:10] := b); (a == 'ABCDE56789');", "0123456789","ABCDE" ,T(1.0)),
2499 test_ab<T>("(a[0:10] := b); (a == 'ABCDEF6789');", "0123456789","ABCDEF" ,T(1.0)),
2500 test_ab<T>("(a[0:10] := b); (a == 'ABCDEFG789');", "0123456789","ABCDEFG" ,T(1.0)),
2501 test_ab<T>("(a[0:10] := b); (a == 'ABCDEFGH89');", "0123456789","ABCDEFGH" ,T(1.0)),
2502 test_ab<T>("(a[0:10] := b); (a == 'ABCDEFGHI9');", "0123456789","ABCDEFGHI" ,T(1.0)),
2503 test_ab<T>("(a[3:10] := b); (a == '012A456789');", "0123456789","A" ,T(1.0)),
2504 test_ab<T>("(a[3:10] := b); (a == '012AB56789');", "0123456789","AB" ,T(1.0)),
2505 test_ab<T>("(a[3:10] := b); (a == '012ABC6789');", "0123456789","ABC" ,T(1.0)),
2506 test_ab<T>("(a[3:10] := b); (a == '012ABCD789');", "0123456789","ABCD" ,T(1.0)),
2507 test_ab<T>("(a[3:10] := b); (a == '012ABCDE89');", "0123456789","ABCDE" ,T(1.0)),
2508 test_ab<T>("(a[3:10] := b); (a == '012ABCDEF9');", "0123456789","ABCDEF" ,T(1.0)),
2509 test_ab<T>("(a[r1 / r0:r2 + 1] := b[3:b[] - r3 + 1]); (a == '012ABCDE89');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2510 test_ab<T>("(a[r0:r2 + 2] := b[r3:b[] - r3 + 1]); (a == '01ABCDEFG9');", "0123456789","xyzABCDEFGHIJxyz",T(1.0)),
2511 test_ab<T>("'\\0x30\\0x31\\0x32\\0x33\\0x34\\0x35\\0x36\\0x37\\0x38\\0x39' == '0123456789'","","",T(1.0)),
2512 test_ab<T>("'abc\\0x30\\0x31\\0x32\\0x33xyz' == 'abc0123xyz'" ,"","",T(1.0)),
2513 test_ab<T>("'\\0x30\\n\\0x31\\n\\0x32\\n\\0x33' == '0\\n1\\n2\\n3'" ,"","",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' + '') == ''+ '0'" ,"","",T(1.0)),
2526 test_ab<T>("('\\0x30' + '\\0x31\\0x32') == '012'" ,"","",T(1.0)),
2527 test_ab<T>("('\\0x30' + '\\0x31\\0x32' + '\\0x33\\0x34\\0x35') == '012345'" ,"","",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\\'\\\\\\\\b' == a" ,"a'\\\\b","",T(1.0)),
2531 test_ab<T>("'a\\0x30\\'\\0x31\\\\\\0x32b' == a" ,"a0'1\\2b","",T(1.0)),
2532
2533 test_ab<T>("var x := 3; x > 2 and 'abc' like '*bc'" ,"","",T(1.0)),
2534 test_ab<T>("var x := 3; x > 2 and 'abc' ilike '*Bc'" ,"","",T(1.0)),
2535 test_ab<T>("var x := 3; x > 2 and 'abc' in '123abc123'","","",T(1.0)),
2536
2537 test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s like '*bc'" ,"","",T(1.0)),
2538 test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s ilike '*Bc'" ,"","",T(1.0)),
2539 test_ab<T>("var x := 3; var s := 'abc'; x > 2 and s in '123abc123'","","",T(1.0)),
2540
2541 test_ab<T>("var x := 3; var s := 'abc'; var t := '*bc'; x > 2 and s like t" ,"","",T(1.0)),
2542 test_ab<T>("var x := 3; var s := 'abc'; var t := '*Bc'; x > 2 and s ilike t" ,"","",T(1.0)),
2543 test_ab<T>("var x := 3; var s := 'abc'; var t := '123abc123'; x > 2 and s in t","","",T(1.0)),
2544
2545 test_ab<T>("var x := 3; x > 2 and a like '*bc'" ,"abc","",T(1.0)),
2546 test_ab<T>("var x := 3; x > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
2547 test_ab<T>("var x := 3; x > 2 and a in '123abc123'","abc","",T(1.0)),
2548
2549 test_ab<T>("var x := 3; x > 2 and a like b ","abc","*bc",T(1.0)),
2550 test_ab<T>("var x := 3; x > 2 and a ilike b","abc","*Bc",T(1.0)),
2551 test_ab<T>("var x := 3; x > 2 and a in b ","abc","123abc123",T(1.0)),
2552
2553 test_ab<T>("a[] > 2 and a like '*bc'" ,"abc","",T(1.0)),
2554 test_ab<T>("a[] > 2 and a ilike '*Bc'" ,"abc","",T(1.0)),
2555 test_ab<T>("a[] > 2 and a in '123abc123'","abc","",T(1.0)),
2556
2557 test_ab<T>("a[] > 2 and a like b ","abc","*bc",T(1.0)),
2558 test_ab<T>("a[] > 2 and a ilike b","abc","*Bc",T(1.0)),
2559 test_ab<T>("a[] > 2 and a in b ","abc","123abc123",T(1.0)),
2560
2561 test_ab<T>("a[0:1] := b[ :]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
2562 test_ab<T>("a[0:2] := b[ :]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
2563 test_ab<T>("a[0:3] := b[ :]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
2564 test_ab<T>("a[0:4] := b[ :]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
2565 test_ab<T>("a[0:5] := b[ :]; a == '01234'", "XXXXX","01234567890",T(1.0)),
2566 test_ab<T>("a[0:1] := b[6:]; a == '6XXXX'", "XXXXX","01234567890",T(1.0)),
2567 test_ab<T>("a[0:2] := b[6:]; a == '67XXX'", "XXXXX","01234567890",T(1.0)),
2568 test_ab<T>("a[0:3] := b[6:]; a == '678XX'", "XXXXX","01234567890",T(1.0)),
2569 test_ab<T>("a[0:4] := b[6:]; a == '6789X'", "XXXXX","01234567890",T(1.0)),
2570 test_ab<T>("a[0:5] := b[6:]; a == '67890'", "XXXXX","01234567890",T(1.0)),
2571 test_ab<T>("a[0:1] <=> b[ :]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
2572 test_ab<T>("a[0:2] <=> b[ :]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
2573 test_ab<T>("a[0:3] <=> b[ :]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
2574 test_ab<T>("a[0:4] <=> b[ :]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
2575 test_ab<T>("a[0:5] <=> b[ :]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
2576 test_ab<T>("a[0:1] <=> b[6:]; (a == '6XXXX') and (b == '012345X7890')", "XXXXX","01234567890",T(1.0)),
2577 test_ab<T>("a[0:2] <=> b[6:]; (a == '67XXX') and (b == '012345XX890')", "XXXXX","01234567890",T(1.0)),
2578 test_ab<T>("a[0:3] <=> b[6:]; (a == '678XX') and (b == '012345XXX90')", "XXXXX","01234567890",T(1.0)),
2579 test_ab<T>("a[0:4] <=> b[6:]; (a == '6789X') and (b == '012345XXXX0')", "XXXXX","01234567890",T(1.0)),
2580 test_ab<T>("a[0:5] <=> b[6:]; (a == '67890') and (b == '012345XXXXX')", "XXXXX","01234567890",T(1.0)),
2581 test_ab<T>("var i := 0; a[0:i+1] := b[:]; a == '0XXXX'", "XXXXX","01234567890",T(1.0)),
2582 test_ab<T>("var i := 0; a[0:i+2] := b[:]; a == '01XXX'", "XXXXX","01234567890",T(1.0)),
2583 test_ab<T>("var i := 0; a[0:i+3] := b[:]; a == '012XX'", "XXXXX","01234567890",T(1.0)),
2584 test_ab<T>("var i := 0; a[0:i+4] := b[:]; a == '0123X'", "XXXXX","01234567890",T(1.0)),
2585 test_ab<T>("var i := 0; a[0:i+5] := b[:]; a == '01234'", "XXXXX","01234567890",T(1.0)),
2586 test_ab<T>("var i := 0; a[0:i+1] <=> b[:]; (a == '0XXXX') and (b == 'X1234567890')", "XXXXX","01234567890",T(1.0)),
2587 test_ab<T>("var i := 0; a[0:i+2] <=> b[:]; (a == '01XXX') and (b == 'XX234567890')", "XXXXX","01234567890",T(1.0)),
2588 test_ab<T>("var i := 0; a[0:i+3] <=> b[:]; (a == '012XX') and (b == 'XXX34567890')", "XXXXX","01234567890",T(1.0)),
2589 test_ab<T>("var i := 0; a[0:i+4] <=> b[:]; (a == '0123X') and (b == 'XXXX4567890')", "XXXXX","01234567890",T(1.0)),
2590 test_ab<T>("var i := 0; a[0:i+5] <=> b[:]; (a == '01234') and (b == 'XXXXX567890')", "XXXXX","01234567890",T(1.0)),
2591
2592 test_ab<T>("var y:= 2; '01234567890'[y:] == a ", "234567890","" ,T(1.0)),
2593 test_ab<T>("var y:= 2; '01234567890'[y:][y:] == a ", "4567890" ,"" ,T(1.0)),
2594 test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:] == a ", "67890" ,"" ,T(1.0)),
2595 test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:][y:] == a ", "890" ,"" ,T(1.0)),
2596 test_ab<T>("var y:= 2; '01234567890'[y:][y:][y:][y:][y:] == a", "0" ,"" ,T(1.0)),
2597 test_ab<T>("var y:= 2; '0123456789'[y:] == a ", "23456789" ,"" ,T(1.0)),
2598 test_ab<T>("var y:= 2; '0123456789'[y:][y:] == a ", "456789" ,"" ,T(1.0)),
2599 test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:] == a ", "6789" ,"" ,T(1.0)),
2600 test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:][y:] == a ", "89" ,"" ,T(1.0)),
2601 test_ab<T>("var y:= 2; '0123456789'[y:][y:][y:][y:][y:] == a ", "" ,"" ,T(1.0)),
2602
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[:] ", "" ,"" ,T(1.0)),
2607 test_ab<T>("var s:= ''; s := ''; s[:s[]] == '' ", "" ,"" ,T(1.0)),
2608 test_ab<T>("var s:= ''; s := ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2609
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:= ''; s += ''; '' == s ", "" ,"" ,T(1.0)),
2614 test_ab<T>("var s:= '1'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2615 test_ab<T>("var s:= '1'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2616 test_ab<T>("var s:= '12'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2617 test_ab<T>("var s:= '12'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2618 test_ab<T>("var s:= '123'; s := '' + ''; s == '' ", "" ,"" ,T(1.0)),
2619 test_ab<T>("var s:= '123'; s := '' + ''; '' == s ", "" ,"" ,T(1.0)),
2620 test_ab<T>("var s:= '1'; s += ''; s == '1' ", "" ,"" ,T(1.0)),
2621 test_ab<T>("var s:= '1'; s += ''; '1' == s ", "" ,"" ,T(1.0)),
2622 test_ab<T>("var s:= '12'; s += ''; s == '12' ", "" ,"" ,T(1.0)),
2623 test_ab<T>("var s:= '12'; s += ''; '12' == s ", "" ,"" ,T(1.0)),
2624 test_ab<T>("var s:= '123'; s += ''; s == '123' ", "" ,"" ,T(1.0)),
2625 test_ab<T>("var s:= '123'; s += ''; '123' == s ", "" ,"" ,T(1.0)),
2626
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:= ''; s += ''; '' == s[:] ", "" ,"" ,T(1.0)),
2631 test_ab<T>("var s:= '1'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2632 test_ab<T>("var s:= '1'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2633 test_ab<T>("var s:= '12'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2634 test_ab<T>("var s:= '12'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2635 test_ab<T>("var s:= '123'; s := '' + ''; s[:] == '' ", "" ,"" ,T(1.0)),
2636 test_ab<T>("var s:= '123'; s := '' + ''; '' == s[:] ", "" ,"" ,T(1.0)),
2637 test_ab<T>("var s:= '1'; s += ''; s[:] == '1' ", "" ,"" ,T(1.0)),
2638 test_ab<T>("var s:= '1'; s += ''; '1' == s[:] ", "" ,"" ,T(1.0)),
2639 test_ab<T>("var s:= '12'; s += ''; s[:] == '12' ", "" ,"" ,T(1.0)),
2640 test_ab<T>("var s:= '12'; s += ''; '12' == s[:] ", "" ,"" ,T(1.0)),
2641 test_ab<T>("var s:= '123'; s += ''; s[:] == '123' ", "" ,"" ,T(1.0)),
2642 test_ab<T>("var s:= '123'; s += ''; '123' == s[:] ", "" ,"" ,T(1.0)),
2643
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:= ''; 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:= '1'; 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:= '12'; 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:= '123'; s := '' + ''; '' == s[:s[]] ", "" ,"" ,T(1.0)),
2654 test_ab<T>("var s:= '1'; s += ''; s[:s[]] == '1' ", "" ,"" ,T(1.0)),
2655 test_ab<T>("var s:= '1'; s += ''; '1' == s[:s[]] ", "" ,"" ,T(1.0)),
2656 test_ab<T>("var s:= '12'; s += ''; s[:s[]] == '12' ", "" ,"" ,T(1.0)),
2657 test_ab<T>("var s:= '12'; s += ''; '12' == s[:s[]] ", "" ,"" ,T(1.0)),
2658 test_ab<T>("var s:= '123'; s += ''; s[:s[]] == '123' ", "" ,"" ,T(1.0)),
2659 test_ab<T>("var s:= '123'; s += ''; '123' == s[:s[]] ", "" ,"" ,T(1.0)),
2660
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:= ''; for(var i:=0; i < 10; i+=1) {s += '';}; '' == s ", "" ,"" ,T(1.0)),
2663 test_ab<T>("var s:= '1'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '1' ", "" ,"" ,T(1.0)),
2664 test_ab<T>("var s:= '1'; for(var i:=0; i < 10; i+=1) {s += '';}; '1' == s ", "" ,"" ,T(1.0)),
2665 test_ab<T>("var s:= '12'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '12' ", "" ,"" ,T(1.0)),
2666 test_ab<T>("var s:= '12'; for(var i:=0; i < 10; i+=1) {s += '';}; '12' == s ", "" ,"" ,T(1.0)),
2667 test_ab<T>("var s:= '123'; for(var i:=0; i < 10; i+=1) {s += '';}; s == '123' ", "" ,"" ,T(1.0)),
2668 test_ab<T>("var s:= '123'; for(var i:=0; i < 10; i+=1) {s += '';}; '123' == s ", "" ,"" ,T(1.0)),
2669
2670 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s += '1';}; s == '1111' ", "" ,"" ,T(1.0)),
2671 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s += '1';}; '1111' == s ", "" ,"" ,T(1.0)),
2672 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '22';}; s == '2222' ", "" ,"" ,T(1.0)),
2673 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '22';}; '2222' == s ", "" ,"" ,T(1.0)),
2674 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '333';}; s == '333333' ", "" ,"" ,T(1.0)),
2675 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s += '333';}; '333333' == s ", "" ,"" ,T(1.0)),
2676
2677 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := s + '1';}; s == '1111' ", "" ,"" ,T(1.0)),
2678 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := s + '1';}; '1111' == s ", "" ,"" ,T(1.0)),
2679 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '22';}; s == '2222' ", "" ,"" ,T(1.0)),
2680 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '22';}; '2222' == s ", "" ,"" ,T(1.0)),
2681 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '333';}; s == '333333'", "" ,"" ,T(1.0)),
2682 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := s + '333';}; '333333' == s", "" ,"" ,T(1.0)),
2683
2684 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := '1' + s;}; s == '1111' ", "" ,"" ,T(1.0)),
2685 test_ab<T>("var s:= ''; for(var i:=0; i < 4; i+=1) {s := '1' + s;}; '1111' == s ", "" ,"" ,T(1.0)),
2686 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '22' + s;}; s == '2222' ", "" ,"" ,T(1.0)),
2687 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '22' + s;}; '2222' == s ", "" ,"" ,T(1.0)),
2688 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '333' + s;}; s == '333333'", "" ,"" ,T(1.0)),
2689 test_ab<T>("var s:= ''; for(var i:=0; i < 2; i+=1) {s := '333' + s;}; '333333' == s", "" ,"" ,T(1.0)),
2690
2691 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[:]; x == '0XXXX'", "","",T(1.0)),
2692 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[:]; x == '01XXX'", "","",T(1.0)),
2693 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[:]; x == '012XX'", "","",T(1.0)),
2694 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[:]; x == '0123X'", "","",T(1.0)),
2695 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] := y[:]; x == '01234'", "","",T(1.0)),
2696 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] := y[6:]; x == '6XXXX'", "","",T(1.0)),
2697 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] := y[6:]; x == '67XXX'", "","",T(1.0)),
2698 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] := y[6:]; x == '678XX'", "","",T(1.0)),
2699 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] := y[6:]; x == '6789X'", "","",T(1.0)),
2700 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] := y[6:]; x == '67890'", "","",T(1.0)),
2701 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] <=> y[:]; (x == '0XXXX') and (y == 'X1234567890')", "","",T(1.0)),
2702 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] <=> y[:]; (x == '01XXX') and (y == 'XX234567890')", "","",T(1.0)),
2703 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] <=> y[:]; (x == '012XX') and (y == 'XXX34567890')", "","",T(1.0)),
2704 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] <=> y[:]; (x == '0123X') and (y == 'XXXX4567890')", "","",T(1.0)),
2705 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] <=> y[:]; (x == '01234') and (y == 'XXXXX567890')", "","",T(1.0)),
2706 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:1] <=> y[6:]; (x == '6XXXX') and (y == '012345X7890')", "","",T(1.0)),
2707 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:2] <=> y[6:]; (x == '67XXX') and (y == '012345XX890')", "","",T(1.0)),
2708 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:3] <=> y[6:]; (x == '678XX') and (y == '012345XXX90')", "","",T(1.0)),
2709 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:4] <=> y[6:]; (x == '6789X') and (y == '012345XXXX0')", "","",T(1.0)),
2710 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; x[0:5] <=> y[6:]; (x == '67890') and (y == '012345XXXXX')", "","",T(1.0)),
2711 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+1] := y[:]; x == '0XXXX'", "","",T(1.0)),
2712 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+2] := y[:]; x == '01XXX'", "","",T(1.0)),
2713 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+3] := y[:]; x == '012XX'", "","",T(1.0)),
2714 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+4] := y[:]; x == '0123X'", "","",T(1.0)),
2715 test_ab<T>("var x := 'XXXXX'; var y := '01234567890'; var i := 0; x[0:i+5] := y[:]; x == '01234'", "","",T(1.0)),
2716 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)),
2717 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)),
2718 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)),
2719 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)),
2720 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)),
2721
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) - (v[] * 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 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)),
2726
2727 test_ab<T>("a like b", "abcd", "abcd*", T(1.0)),
2728 test_ab<T>("a like b", "abcd", "abcd" , T(1.0)),
2729 test_ab<T>("a like b", "abcd", "abc*" , T(1.0)),
2730 test_ab<T>("a like b", "abcd", "*bcd" , T(1.0)),
2731 test_ab<T>("a like b", "abcd", "abc?" , T(1.0)),
2732 test_ab<T>("a like b", "abcd", "?bcd" , T(1.0)),
2733 test_ab<T>("a like b", "abcd", "ab?d" , T(1.0)),
2734 test_ab<T>("a like b", "abcd", "ab*d" , 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*cd" , T(1.0)),
2737 test_ab<T>("a like b", "abcd", "a??d" , T(1.0)),
2738 test_ab<T>("a like b", "abcd", "a*?d" , T(1.0)),
2739 test_ab<T>("a like b", "abcd", "*bc*" , T(1.0)),
2740 test_ab<T>("a like b", "abcd", "?bc?" , T(1.0)),
2741 test_ab<T>("a like b", "abcd", "????" , T(1.0)),
2742 test_ab<T>("a like b", "abcd", "a???" , T(1.0)),
2743 test_ab<T>("a like b", "abcd", "ab??" , T(1.0)),
2744 test_ab<T>("a like b", "abcd", "abc?" , T(1.0)),
2745 test_ab<T>("a like b", "abcd", "???d" , T(1.0)),
2746 test_ab<T>("a like b", "abcd", "??cd" , T(1.0)),
2747 test_ab<T>("a like b", "abcd", "?bcd" , T(1.0)),
2748 test_ab<T>("a like b", "abcd", "?b?d" , T(1.0)),
2749 test_ab<T>("a like b", "abcd", "a?c?" , T(1.0)),
2750 test_ab<T>("a like b", "abcd", "a??d" , T(1.0)),
2751 test_ab<T>("a like b", "abcd", "?bc?" , T(1.0)),
2752 test_ab<T>("a like b", "abcd", "ab**" , T(1.0)),
2753 test_ab<T>("a like b", "abcd", "ab*?" , T(1.0)),
2754 test_ab<T>("a like b", "abcd", "a***" , T(1.0)),
2755 test_ab<T>("a like b", "abcd", "**cd" , T(1.0)),
2756 test_ab<T>("a like b", "abcd", "*?cd" , T(1.0)),
2757 test_ab<T>("a like b", "abcd", "***d" , T(1.0)),
2758 test_ab<T>("a like b", "abcd", "*bc*" , T(1.0)),
2759 test_ab<T>("a like b", "abcd", "*bc?" , T(1.0)),
2760 test_ab<T>("a like b", "abcd", "*b??" , T(1.0)),
2761 test_ab<T>("a like b", "abcd", "?bc*" , T(1.0)),
2762 test_ab<T>("a like b", "abcd", "??c*" , T(1.0)),
2763 test_ab<T>("a like b", "abcd", "*b?*" , T(1.0)),
2764 test_ab<T>("a like b", "ab" , "a*" , T(1.0)),
2765 test_ab<T>("a like b", "ab" , "a?" , T(1.0)),
2766
2767 test_ab<T>("a ilike b", "aBcD", "abcd*", T(1.0)),
2768 test_ab<T>("a ilike b", "aBcD", "abcd" , T(1.0)),
2769 test_ab<T>("a ilike b", "aBcD", "abc*" , T(1.0)),
2770 test_ab<T>("a ilike b", "aBcD", "*bcd" , T(1.0)),
2771 test_ab<T>("a ilike b", "aBcD", "abc?" , T(1.0)),
2772 test_ab<T>("a ilike b", "aBcD", "?bcd" , T(1.0)),
2773 test_ab<T>("a ilike b", "aBcD", "ab?d" , T(1.0)),
2774 test_ab<T>("a ilike b", "aBcD", "ab*d" , 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*cd" , T(1.0)),
2777 test_ab<T>("a ilike b", "aBcD", "a??d" , T(1.0)),
2778 test_ab<T>("a ilike b", "aBcD", "a*?d" , T(1.0)),
2779 test_ab<T>("a ilike b", "aBcD", "*bc*" , T(1.0)),
2780 test_ab<T>("a ilike b", "aBcD", "?bc?" , T(1.0)),
2781 test_ab<T>("a ilike b", "aBcD", "????" , T(1.0)),
2782 test_ab<T>("a ilike b", "aBcD", "a???" , T(1.0)),
2783 test_ab<T>("a ilike b", "aBcD", "ab??" , T(1.0)),
2784 test_ab<T>("a ilike b", "aBcD", "abc?" , T(1.0)),
2785 test_ab<T>("a ilike b", "aBcD", "???d" , T(1.0)),
2786 test_ab<T>("a ilike b", "aBcD", "??cd" , T(1.0)),
2787 test_ab<T>("a ilike b", "aBcD", "?bcd" , T(1.0)),
2788 test_ab<T>("a ilike b", "aBcD", "?b?d" , T(1.0)),
2789 test_ab<T>("a ilike b", "aBcD", "a?c?" , T(1.0)),
2790 test_ab<T>("a ilike b", "aBcD", "a??d" , T(1.0)),
2791 test_ab<T>("a ilike b", "aBcD", "?bc?" , T(1.0)),
2792 test_ab<T>("a ilike b", "aBcD", "ab**" , T(1.0)),
2793 test_ab<T>("a ilike b", "aBcD", "ab*?" , T(1.0)),
2794 test_ab<T>("a ilike b", "aBcD", "a***" , T(1.0)),
2795 test_ab<T>("a ilike b", "aBcD", "**cd" , T(1.0)),
2796 test_ab<T>("a ilike b", "aBcD", "*?cd" , T(1.0)),
2797 test_ab<T>("a ilike b", "aBcD", "***d" , T(1.0)),
2798 test_ab<T>("a ilike b", "aBcD", "*bc*" , T(1.0)),
2799 test_ab<T>("a ilike b", "aBcD", "*bc?" , T(1.0)),
2800 test_ab<T>("a ilike b", "aBcD", "*b??" , T(1.0)),
2801 test_ab<T>("a ilike b", "aBcD", "?bc*" , T(1.0)),
2802 test_ab<T>("a ilike b", "aBcD", "??c*" , T(1.0)),
2803 test_ab<T>("a ilike b", "aBcD", "*b?*" , T(1.0)),
2804 test_ab<T>("a ilike b", "aB" , "a*" , T(1.0)),
2805 test_ab<T>("a ilike b", "aB" , "a?" , T(1.0))
2806 };
2807
2808 static const std::size_t test_list_size = sizeof(test_list) / sizeof(test_ab<T>);
2809
2810 {
2811 const std::size_t rounds = 50;
2812
2813 for (std::size_t r = 0; r < rounds; ++r)
2814 {
2815 bool result = true;
2816
2817 for (std::size_t i = 0; i < test_list_size; ++i)
2818 {
2819 test_ab<T>& test = const_cast<test_ab<T>&>(test_list[i]);
2820
2821 std::string str_a;
2822 std::string str_b;
2823 std::string str_c;
2824
2825 T r0 = T(2);
2826 T r1 = T(6);
2827 T r2 = T(7);
2828 T r3 = T(3);
2829
2830 exprtk::symbol_table<T> symbol_table;
2831 symbol_table.add_stringvar("a", str_a);
2832 symbol_table.add_stringvar("b", str_b);
2833 symbol_table.add_stringvar("c", str_c);
2834 symbol_table.add_variable("r0", r0);
2835 symbol_table.add_variable("r1", r1);
2836 symbol_table.add_variable("r2", r2);
2837 symbol_table.add_variable("r3", r3);
2838
2839 exprtk::expression<T> expression;
2840 expression.register_symbol_table(symbol_table);
2841
2842 {
2843 exprtk::parser<T> parser;
2844
2845 if (!parser.compile(test.expr, expression))
2846 {
2847 printf("run_test02() - Error: %s Expression: %s\n",
2848 parser.error().c_str(),
2849 test.expr.c_str());
2850
2851 result = false;
2852 continue;
2853 }
2854 }
2855
2856 str_a = test.a;
2857 str_b = test.b;
2858 str_c = test.c;
2859
2860 T expr_result = expression.value();
2861
2862 if (not_equal(expr_result, test.result))
2863 {
2864 printf("run_test02() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f\t"
2865 "a='%s'\tb='%s'\tc='%s'\n",
2866 test.expr.c_str(),
2867 static_cast<double>(test.result),
2868 static_cast<double>(expr_result),
2869 str_a.c_str(),
2870 str_b.c_str(),
2871 str_c.c_str());
2872
2873 result = false;
2874 continue;
2875 }
2876 }
2877
2878 if (!result)
2879 {
2880 return false;
2881 }
2882 }
2883 }
2884
2885 {
2886 std::string s0;
2887 std::string s1;
2888
2889 const std::string expression_str =
2890 " s0 := 'abc'; "
2891 " s0 := (s1 := '0123456789'[2:8]); "
2892 " s1 := 'xyz'; "
2893 " s0 < s1; ";
2894
2895 exprtk::symbol_table<T> symbol_table;
2896 symbol_table.add_stringvar("s0" ,s0);
2897 symbol_table.add_stringvar("s1" ,s1);
2898
2899 exprtk::expression<T> expression;
2900 expression.register_symbol_table(symbol_table);
2901
2902 {
2903 exprtk::parser<T> parser;
2904
2905 if (!parser.compile(expression_str,expression))
2906 {
2907 printf("run_test02() - [2] Error: %s Expression: %s\n",
2908 parser.error().c_str(),
2909 expression_str.c_str());
2910
2911 return false;
2912 }
2913 }
2914
2915 if (T(0) == expression.value())
2916 {
2917 printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tExpected: True\n",
2918 expression_str.c_str());
2919
2920 return false;
2921 }
2922 else if ("234567" != s0)
2923 {
2924 printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s0\n",
2925 expression_str.c_str());
2926
2927 return false;
2928 }
2929 else if ("xyz" != s1)
2930 {
2931 printf("run_test02() - Evaluation Error [2]: Expression: [%s]\tInvalid value for s1\n",
2932 expression_str.c_str());
2933
2934 return false;
2935 }
2936 }
2937
2938 return true;
2939}
2940
2941template <typename T>
2943{
2944 typedef exprtk::symbol_table<T> symbol_table_t;
2945 typedef exprtk::expression<T> expression_t;
2946 typedef exprtk::parser<T> parser_t;
2947
2948 const std::string expression_string =
2949 "A+A0+aA+Aa0+b+B1+Bb+bB1+A+A0+AA+AA0+B+B1+BB+BB1+a+a0+aa+aa0+b+b1+bb+bb1+"
2950 "c+C2+Cc+Cc2+D+D3+dD+dD3+C+C2+CC+CC2+D+D3+DD+DD3+c+c2+cc+cc2+d+d3+dd+dd3+"
2951 "E+E4+eE+Ee4+f+F5+Ff+fF5+E+E4+EE+EE4+F+F5+FF+FF5+e+e4+ee+ee4+f+f5+ff+ff5+"
2952 "g+G6+Gg+Gg6+H+H7+hH+hH7+G+G6+GG+GG6+H+H7+HH+HH7+g+g6+gg+gg6+h+h7+hh+hh7+"
2953 "I+I8+iI+Ii8+j+J9+Jj+jJ9+I+I8+II+II8+J+J9+JJ+JJ9+i+i8+ii+ii8+j+j9+jj+jj9+"
2954 "k+K0+Kk+Kk0+L+L1+lL+lL1+K+K0+KK+KK0+L+L1+LL+LL1+k+k0+kk+kk0+l+l1+ll+ll1+"
2955 "M+M2+mM+Mm2+n+N3+Nn+nN3+M+M2+MM+MM2+N+N3+NN+NN3+m+m2+mm+mm2+n+n3+nn+nn3+"
2956 "o+O4+Oo+Oo4+P+P5+pP+pP5+O+O4+OO+OO4+P+P5+PP+PP5+o+o4+oo+oo4+p+p5+pp+pp5+"
2957 "Q+Q6+qQ+Qq6+r+R7+Rr+rR7+Q+Q6+QQ+QQ6+R+R7+RR+RR7+q+q6+qq+qq6+r+r7+rr+rr7+"
2958 "s+S8+Ss+Ss8+T+T9+tT+tT9+S+S8+SS+SS8+T+T9+TT+TT9+s+s8+ss+ss8+t+t9+tt+tt9+"
2959 "U+U0+uU+Uu0+v+V1+Vv+vV1+U+U0+UU+UU0+V+V1+VV+VV1+u+u0+uu+uu0+v+v1+vv+vv1+"
2960 "w+W2+Ww+Ww2+X+X3+xX+xX3+W+W2+WW+WW2+X+X3+XX+XX3+w+w2+ww+ww2+x+x3+xx+xx3+"
2961 "Y+Y4+yY+Yy4+z+Z5+Zz+zZ5+Y+Y4+YY+YY4+Z+Z5+ZZ+ZZ5+y+y4+yy+yy4+z+z5+zz+zz5 ";
2962
2963 static const std::string variable_list[] =
2964 {
2965 "A", "A0", "aA", "Aa0", "b", "B1", "Bb", "bB1",
2966 "c", "C2", "Cc", "Cc2", "D", "D3", "dD", "dD3",
2967 "E", "E4", "eE", "Ee4", "f", "F5", "Ff", "fF5",
2968 "g", "G6", "Gg", "Gg6", "H", "H7", "hH", "hH7",
2969 "I", "I8", "iI", "Ii8", "j", "J9", "Jj", "jJ9",
2970 "k", "K0", "Kk", "Kk0", "L", "L1", "lL", "lL1",
2971 "M", "M2", "mM", "Mm2", "n", "N3", "Nn", "nN3",
2972 "o", "O4", "Oo", "Oo4", "P", "P5", "pP", "pP5",
2973 "Q", "Q6", "qQ", "Qq6", "r", "R7", "Rr", "rR7",
2974 "s", "S8", "Ss", "Ss8", "T", "T9", "tT", "tT9",
2975 "U", "U0", "uU", "Uu0", "v", "V1", "Vv", "vV1",
2976 "w", "W2", "Ww", "Ww2", "X", "X3", "xX", "xX3",
2977 "Y", "Y4", "yY", "Yy4", "z", "Z5", "Zz", "zZ5"
2978 };
2979
2980 static const std::size_t variable_list_size = sizeof(variable_list) / sizeof(std::string);
2981
2982 static const std::size_t rounds = 300;
2983
2984 for (std::size_t r = 0; r < rounds; ++r)
2985 {
2986 symbol_table_t symbol_table_0;
2987 symbol_table_t symbol_table_1;
2988 expression_t expression;
2989
2990 std::vector<T> v;
2991 v.resize(variable_list_size);
2992
2993 for (std::size_t i = 0; i < variable_list_size; ++i)
2994 {
2995 v[i] = T(i);
2996 if (i & 1)
2997 symbol_table_0.add_variable(variable_list[i],v[i]);
2998 else
2999 symbol_table_1.add_variable(variable_list[i],v[i]);
3000 }
3001
3002 std::size_t total_symbol_count = symbol_table_0.variable_count() +
3003 symbol_table_1.variable_count();
3004
3005 if (variable_list_size != total_symbol_count)
3006 {
3007 printf("run_test03() - Error - Invalid number of variables in symbol_table! Expected: %d got: %d\n",
3008 static_cast<unsigned int>(variable_list_size),
3009 static_cast<unsigned int>(total_symbol_count));
3010
3011 return false;
3012 }
3013
3014 symbol_table_0.add_constants();
3015
3016 expression.register_symbol_table(symbol_table_0);
3017 expression.register_symbol_table(symbol_table_1);
3018
3019 {
3020 exprtk::parser<T> parser;
3021
3022 if (!parser.compile(expression_string,expression))
3023 {
3024 printf("run_test03() - Error: %s Expression: %s\n",
3025 parser.error().c_str(),
3026 expression_string.c_str());
3027
3028 return false;
3029 }
3030 }
3031
3032 expression.value();
3033 }
3034
3035 {
3036 static const std::string invalid_expr[] =
3037 {
3038 "x y",
3039 "x y z",
3040 "x y z w",
3041 "x 1",
3042 "x 1 2",
3043 "x 1 2 3",
3044 "x 'abc'",
3045 "x 1 'abc'",
3046 "x 'abc' 1",
3047 "1 2",
3048 "1 2 3",
3049 "1 2 3 4",
3050 "'abc' 'xyz'",
3051 "'abc' 1",
3052 "1 'abc'",
3053 "x sin(1)",
3054 "s 'abc'",
3055 "s x",
3056 "s y",
3057 "s 1",
3058 "s 1 x",
3059 "s 1 y",
3060 "s x 1",
3061 "s y 1",
3062 "x s ",
3063 "y s ",
3064 "1 s ",
3065 "1 s x",
3066 "1 s y",
3067 "x s 1",
3068 "y s 1",
3069 "v 'abc'",
3070 "v x ",
3071 "v y ",
3072 "v s ",
3073 "v 1 ",
3074 "v 1 x",
3075 "v 1 y",
3076 "v 1 s",
3077 "v x 1",
3078 "v y 1",
3079 "v s 1",
3080 "x v ",
3081 "y v ",
3082 "1 v ",
3083 "1 v x",
3084 "1 v y",
3085 "x v 1",
3086 "y v 1",
3087
3088 "(x == 'a string' )",
3089 "(x == 'a string'[1:3] )",
3090 "(x == 'a string' + 'b string' )",
3091 "(x == ('a string' + 'b string')[3:6])",
3092 "('a string' == x )",
3093 "('a string'[1:3] == x )",
3094 "('a string' + 'b string' == x )",
3095 "(('a string' + 'b string')[3:6] == x)",
3096
3097 "var a; var b; 3in(a)+sin(b) ",
3098 "var a; var b; sin(a)+3in(b) ",
3099 "var a; var b; sqrt(a)<3in(8) ",
3100 "var a; var b; (1.99-3in((b-b))) ",
3101 "var a; var b; ((3in(sin((b+b)))/1.06)-a) ",
3102 "var a; var b; ((sin(3in((b+b)))/1.06)-a) ",
3103 "var a; var b; (3in(x*(y+z))+cos(x*(y-z))) ",
3104 "var a; var b; (cos(x*(y+z))+3in(x*(y-z))) ",
3105
3106 "1++++",
3107 "1+-+-+",
3108 "1===",
3109 "1====",
3110 "[*][*][*][*][*]",
3111
3112 "var v[1] := {}; var s0appe0 := false; repeat s0appe0 false for(){(){}}",
3113 "var v[2] := {}; repeat var s0appe0 := false; s0appe0 false for(){(){}}",
3114 "var v[3] := {}; repeat var s0appe0 := false; for(){(){}} s0appe0 false",
3115 "var v[4] := {}; repeat var s0appe0 := false; s0appe0 for(){(){}} false",
3116 "var v[5] := {}; repeat for(){(){}} var s0appe0 := false; s0appe0 false",
3117 "var v{};v ;v 60;v 60;v o5",
3118
3119 "var vv[4] := [0]; v[k]",
3120 "var vv[4] := [0]; v[k + 1]",
3121 "var vv[4] := [0]; v[1 + k]"
3122 };
3123
3124 const std::size_t invalid_expr_size = sizeof(invalid_expr) / sizeof(std::string);
3125
3126 {
3127 for (std::size_t i = 0; i < invalid_expr_size; ++i)
3128 {
3129 symbol_table_t symbol_table;
3130 expression_t expression;
3131 parser_t parser;
3132
3133 T x = T(0);
3134 std::string s;
3135 std::vector<T> v(10, T(1.234));
3136
3137 symbol_table.add_variable ("x",x);
3138 symbol_table.add_stringvar("s",s);
3139 symbol_table.add_vector ("v",v);
3140
3141 if (parser.compile(invalid_expr[i],expression))
3142 {
3143 printf("run_test03() - Error: [1] Invalid expression compiled successfully. Expression: %s\n",
3144 invalid_expr[i].c_str());
3145
3146 return false;
3147 }
3148 }
3149 }
3150
3151 {
3152 T x = T(0);
3153 std::string s;
3154 std::vector<T> v(10, T(1.234));
3155
3156 symbol_table_t symbol_table;
3157 parser_t parser;
3158
3159 symbol_table.add_variable ("x",x);
3160 symbol_table.add_stringvar("s",s);
3161 symbol_table.add_vector ("v",v);
3162
3163 for (std::size_t i = 0; i < invalid_expr_size; ++i)
3164 {
3165 exprtk::expression<T> expression;
3166
3167 if (parser.compile(invalid_expr[i],expression))
3168 {
3169 printf("run_test03() - Error: [2] Invalid expression compiled successfully. Expression: %s\n",
3170 invalid_expr[i].c_str());
3171
3172 return false;
3173 }
3174 }
3175 }
3176
3177 {
3178 const std::string base_expression =
3179 "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)+"
3180 "(((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)";
3181
3182 const std::string mod =
3183 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789^+-/*,;:<>=%?[]{}() #&'\"\\\t\r\n";
3184
3185 symbol_table_t symbol_table;
3186 expression_t expression;
3187 parser_t parser;
3188
3189 T a = T(1.1 );
3190 T b = T(2.2 );
3191 T c = T(3.3 );
3192 T d = T(4.5 );
3193 T e = T(4.5 );
3194 T x = T(2.123456);
3195 T y = T(3.123456);
3196 T z = T(4.123456);
3197 T w = T(5.123456);
3198
3199 symbol_table.add_variable("a", a);
3200 symbol_table.add_variable("b", b);
3201 symbol_table.add_variable("c", c);
3202 symbol_table.add_variable("d", d);
3203 symbol_table.add_variable("e", e);
3204
3205 symbol_table.add_variable("x", x);
3206 symbol_table.add_variable("y", y);
3207 symbol_table.add_variable("z", z);
3208 symbol_table.add_variable("w", w);
3209
3210 expression.register_symbol_table(symbol_table);
3211
3212 T total = T(0);
3213
3214 for (std::size_t j = 0; j < base_expression.size(); ++j)
3215 {
3216 std::string expression_str = base_expression;
3217 const char old_c = base_expression[j];
3218
3219 for (std::size_t i = 0; i < mod.size(); ++i)
3220 {
3221 expression_str[j] = mod[i];
3222
3223 if (parser.compile(expression_str, expression))
3224 {
3225 total += expression.value();
3226 }
3227 }
3228
3229 expression_str[j] = old_c;
3230 }
3231
3232 if (total == T(12345.6789)) { printf(" "); }
3233 }
3234 }
3235
3236 return true;
3237}
3238
3239template <typename T>
3240inline T clamp(const T& l, const T& v, const T& u)
3241{
3242 return (v < l) ? l : ((v > u) ? u : v);
3243}
3244
3245template <typename T>
3247{
3248 const std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(y / 2 * pi),+1.0)";
3249
3250 exprtk::symbol_table<T> symbol_table;
3251 exprtk::expression<T> expression;
3252
3253 T x = T(-1000);
3254 T y = T(-1000);
3255
3256 symbol_table.add_variable("x",x);
3257 symbol_table.add_variable("y",y);
3258 symbol_table.add_constants();
3259
3260 expression.register_symbol_table(symbol_table);
3261
3262 {
3263 exprtk::parser<T> parser;
3264
3265 if (!parser.compile(expression_string,expression))
3266 {
3267 printf("run_test04() - Error: %s Expression: %s\n",
3268 parser.error().c_str(),
3269 expression_string.c_str());
3270
3271 return false;
3272 }
3273 }
3274
3275 const T pi = T(3.141592653589793238462643383279502);
3276 const T increment = T(0.0001);
3277
3278 while ((x <= T(+1000)) && (y <= T(+1000)))
3279 {
3280 T result1 = expression.value();
3281 T result2 = clamp<T>(-1.0,real::sin(2 * pi * x) + real::cos(y / 2 * pi),+1.0);
3282
3283 if (not_equal(result1,result2))
3284 {
3285 printf("run_test04() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\n",
3286 expression_string.c_str(),
3287 static_cast<double>(result1),
3288 static_cast<double>(result2),
3289 static_cast<double>(x),
3290 static_cast<double>(y));
3291
3292 return false;
3293 }
3294
3295 x += increment;
3296 y += increment;
3297 }
3298
3299 return true;
3300}
3301
3302template <typename T>
3304{
3305 typedef exprtk::expression<T> expression_t;
3306
3307 const std::string expression_string = "clamp(-1.0,sin(2 * pi * x_var123) + cos(y_var123 / 2 * pi),+1.0)";
3308
3309 exprtk::symbol_table<T> symbol_table;
3310 std::deque<expression_t> expression_list;
3311
3312 T x = T(-1000);
3313 T y = T(-1000);
3314
3315 symbol_table.add_variable("x_var123",x);
3316 symbol_table.add_variable("y_var123",y);
3317 symbol_table.add_constants();
3318
3319 const std::size_t expression_count = 10;
3320 for (std::size_t i = 0; i < expression_count; ++i)
3321 {
3322 expression_t e;
3323 e.register_symbol_table(symbol_table);
3324
3325 {
3326 exprtk::parser<T> parser;
3327
3328 if (!parser.compile(expression_string,e))
3329 {
3330 printf("run_test05() - Error: %s Expression: %s\n",
3331 parser.error().c_str(),
3332 expression_string.c_str());
3333
3334 return false;
3335 }
3336 }
3337
3338 expression_list.push_back(e);
3339 }
3340
3341 const T pi = T(3.141592653589793238462643383279502);
3342 const T increment = T(0.001);
3343
3344 while ((x <= T(+1000)) && (y <= T(+1000)))
3345 {
3346 T real_result = clamp<T>(-1.0,real::sin(2 * pi * x) + real::cos(y / 2 * pi),+1.0);
3347
3348 for (std::size_t i = 0; i < expression_list.size(); ++i)
3349 {
3350 expression_t& expr = expression_list[i];
3351
3352 T result = expr.value();
3353
3354 if (not_equal(result,real_result))
3355 {
3356 printf("run_test05() - Computation Error: Expression: [%s]\tExpected: %19.15f\tResult: %19.15f x:%19.15f\ty:%19.15f\tIndex:%d\n",
3357 expression_string.c_str(),
3358 static_cast<double>(real_result),
3359 static_cast<double>(result),
3360 static_cast<double>(x),
3361 static_cast<double>(y),
3362 static_cast<unsigned int>(i));
3363
3364 return false;
3365 }
3366 }
3367
3368 x += increment;
3369 y += increment;
3370 }
3371
3372 return true;
3373}
3374
3375template <typename T>
3377{
3378 typedef exprtk::expression<T> expression_t;
3379
3380 const std::string expression_string = "sqrt(1 - (x^2))";
3381
3382 T x = T(0);
3383
3384 exprtk::symbol_table<T> symbol_table;
3385 symbol_table.add_variable("x",x);
3386
3387 expression_t expression;
3388 expression.register_symbol_table(symbol_table);
3389
3390 {
3391 exprtk::parser<T> parser;
3392
3393 if (!parser.compile(expression_string,expression))
3394 {
3395 printf("run_test06() - Error: %s Expression: %s\n",
3396 parser.error().c_str(),
3397 expression_string.c_str());
3398
3399 return false;
3400 }
3401 }
3402
3403 T total_area1 = exprtk::integrate(expression,x,T(-1),T(1));
3404 T total_area2 = exprtk::integrate(expression,"x",T(-1),T(1));
3405 const T pi = T(3.141592653589793238462643383279502);
3406
3407 if (not_equal(total_area1,total_area2,T(0.000001)))
3408 {
3409 printf("run_test06() - Integration Error: area1 != area2\n");
3410 return false;
3411 }
3412
3413 if (not_equal(total_area1,T(pi) / T(2),T(0.000001)))
3414 {
3415 printf("run_test06() - Integration Error: Expected: %19.15f\tResult: %19.15f\n",
3416 static_cast<double>(pi / T(2)),
3417 static_cast<double>(total_area1));
3418
3419 return false;
3420 }
3421
3422 return true;
3423}
3424
3425template <typename T>
3427{
3428 typedef exprtk::expression<T> expression_t;
3429
3430 const std::string expression_string = "sin(2x + 1 / 3)";
3431
3432 T x = T(0);
3433
3434 exprtk::symbol_table<T> symbol_table;
3435 symbol_table.add_variable("x",x);
3436
3437 expression_t expression;
3438 expression.register_symbol_table(symbol_table);
3439
3440 {
3441 exprtk::parser<T> parser;
3442
3443 if (!parser.compile(expression_string,expression))
3444 {
3445 printf("run_test07() - Error: %s Expression: %s\n",
3446 parser.error().c_str(),
3447 expression_string.c_str());
3448
3449 return false;
3450 }
3451 }
3452
3453 for (x = T(-200); x < T(200); x += T(0.0001))
3454 {
3455 {
3456 T deriv1_real_result = T(2) * real::cos(T(2) * x + T(1.0 / 3.0));
3457 T deriv1_result1 = exprtk::derivative(expression,x);
3458 T deriv1_result2 = exprtk::derivative(expression,"x");
3459
3460 if (not_equal(deriv1_result1,deriv1_result2,T(0.00001)))
3461 {
3462 printf("run_test07() - 1st Derivative Error: result1 != result2\n");
3463 return false;
3464 }
3465
3466 if (not_equal(deriv1_result1,deriv1_real_result,T(0.00001)))
3467 {
3468 printf("run_test07() - 1st Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3469 static_cast<double>(x),
3470 static_cast<double>(deriv1_real_result),
3471 static_cast<double>(deriv1_result1));
3472
3473 return false;
3474 }
3475 }
3476
3477 {
3478 T deriv2_real_result = T(-4) * real::sin(T(2) * x + T(1.0 / 3.0));
3479 T deriv2_result1 = exprtk::second_derivative(expression,x);
3480 T deriv2_result2 = exprtk::second_derivative(expression,"x");
3481
3482 if (not_equal(deriv2_result1,deriv2_result2,T(0.0000001)))
3483 {
3484 printf("run_test07() - 2nd Derivative Error: result1 != result2\n");
3485 return false;
3486 }
3487
3488 if (not_equal(deriv2_result1,deriv2_real_result,T(0.01)))
3489 {
3490 printf("run_test07() - 2nd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3491 static_cast<double>(x),
3492 static_cast<double>(deriv2_real_result),
3493 static_cast<double>(deriv2_result1));
3494
3495 return false;
3496 }
3497 }
3498
3499 {
3500 T deriv3_real_result = T(-8) * real::cos(T(2) * x + T(1.0 / 3.0));
3501 T deriv3_result1 = exprtk::third_derivative(expression,x);
3502 T deriv3_result2 = exprtk::third_derivative(expression,"x");
3503
3504 if (not_equal(deriv3_result1,deriv3_result2,T(0.0000001)))
3505 {
3506 printf("run_test07() - 3rd Derivative Error: result1 != result2\n");
3507 return false;
3508 }
3509
3510 if (not_equal(deriv3_result1,deriv3_real_result,T(0.01)))
3511 {
3512 printf("run_test07() - 3rd Derivative Error: x: %19.15f\tExpected: %19.15f\tResult: %19.15f\n",
3513 static_cast<double>(x),
3514 static_cast<double>(deriv3_real_result),
3515 static_cast<double>(deriv3_result1));
3516
3517 return false;
3518 }
3519 }
3520 }
3521
3522 return true;
3523}
3524
3525template <typename T>
3527{
3528
3529 static const std::string expr_str[] =
3530 {
3531 "x", "y", "z", "w", "u",
3532 "x + y + z + w + u",
3533 "x + y / z * w ^ u",
3534 "x:=1.1", "y:=2.2", "z:=3.3", "w:=4.4", "u:=5.5",
3535 "x:=x+1.1", "y:=y+2.2", "z:=z+3.3", "w:=w+4.4", "u:=u+5.5",
3536 "x:=1.1+x", "y:=2.2+y", "z:=3.3+z", "w:=4.4+w", "u:=5.5+u",
3537 "x:=(x <= 1.1)",
3538 "y:=(2.2 >= y)",
3539 "z:=(3.3 and z)",
3540 "w:=(4.4 or w)",
3541 "u:=(u xor 5.5)",
3542 "min(x,y) + min(x,y,z) + min(x,y,z,w) + min(x,y,z,w,y)",
3543 "max(x,y) + max(x,y,z) + max(x,y,z,w) + max(x,y,z,w,y)",
3544 "avg(x,y)",
3545 "avg(x,y,z)",
3546 "avg(x,y,z,w)",
3547 "avg(x,y,z,w,u)",
3548 "(u := u := min(x:=1,y:=2,z:=3)) == 1",
3549 "(2x+3y+4z+5w)==(2*x+3*y+4*z+5*w)",
3550 "(3(x+y)/2+1)==(3*(x+y)/2+1)",
3551 "((x+y)3+1/4)==((x+y)*3+1/4)",
3552 "((x+y)z+1/2)==((x+y)*z+1/2)",
3553 "(x+y^3/z) == (x+(y*y*y)/z)",
3554 "(z-x^3+y^2*7) == (z-(x*x*x)+(y*y)*7)",
3555 "(3min(x,y))==(3*min(x,y))",
3556 "(sin(x)y)==(sin(x)*y)",
3557 "(sin(x)cos(y)+1)==(sin(x)*cos(y)+1)",
3558 "(sgn(sin(x))cos(sgn(y))+1)==(sgn(sin(x))*cos(sgn(y))+1)",
3559 "equal($f00(x,y,z),(x+y)/z)",
3560 "equal($f01(x,y,z),(x+y)*z)",
3561 "equal($f02(x,y,z),(x+y)-z)",
3562 "equal($f03(x,y,z),(x+y)+z)",
3563 "equal($f04(x,y,z),(x-y)+z)",
3564 "equal($f05(x,y,z),(x-y)/z)",
3565 "equal($f06(x,y,z),(x-y)*z)",
3566 "equal($f07(x,y,z),(x*y)+z)",
3567 "equal($f08(x,y,z),(x*y)-z)",
3568 "equal($f09(x,y,z),(x*y)/z)",
3569 "equal($f10(x,y,z),(x*y)*z)",
3570 "equal($f11(x,y,z),(x/y)+z)",
3571 "equal($f12(x,y,z),(x/y)-z)",
3572 "equal($f13(x,y,z),(x/y)/z)",
3573 "equal($f14(x,y,z),(x/y)*z)",
3574 "equal($f15(x,y,z),x/(y+z))",
3575 "equal($f16(x,y,z),x/(y-z))",
3576 "equal($f17(x,y,z),x/(y*z))",
3577 "equal($f18(x,y,z),x/(y/z))",
3578 "equal($f19(x,y,z),x*(y+z))",
3579 "equal($f20(x,y,z),x*(y-z))",
3580 "equal($f21(x,y,z),x*(y*z))",
3581 "equal($f22(x,y,z),x*(y/z))",
3582 "equal($f23(x,y,z),x-(y+z))",
3583 "equal($f24(x,y,z),x-(y-z))",
3584 "equal($f25(x,y,z),x-(y/z))",
3585 "equal($f26(x,y,z),x-(y*z))",
3586 "equal($f27(x,y,z),x+(y*z))",
3587 "equal($f28(x,y,z),x+(y/z))",
3588 "equal($f29(x,y,z),x+(y+z))",
3589 "equal($f30(x,y,z),x+(y-z))",
3590 "equal($f31(x,y,z),x*y^2+z)",
3591 "equal($f32(x,y,z),x*y^3+z)",
3592 "equal($f33(x,y,z),x*y^4+z)",
3593 "equal($f34(x,y,z),x*y^5+z)",
3594 "equal($f35(x,y,z),x*y^6+z)",
3595 "equal($f36(x,y,z),x*y^7+z)",
3596 "equal($f37(x,y,z),x*y^8+z)",
3597 "equal($f38(x,y,z),x*y^9+z)",
3598 "equal($f39(x,y,z),x*log(y)+z)",
3599 "equal($f40(x,y,z),x*log(y)-z)",
3600 "equal($f41(x,y,z),x*log10(y)+z)",
3601 "equal($f42(x,y,z),x*log10(y)-z)",
3602 "equal($f43(x,y,z),x*sin(y)+z)",
3603 "equal($f44(x,y,z),x*sin(y)-z)",
3604 "equal($f45(x,y,z),x*cos(y)+z)",
3605 "equal($f46(x,y,z),x*cos(y)-z)",
3606 "equal($f47(x,y,z),if(0!=x,y,z))",
3607 "equal($f48(x,y,z,w),x+((y+z)/w))",
3608 "equal($f49(x,y,z,w),x+((y+z)*w))",
3609 "equal($f50(x,y,z,w),x+((y-z)/w))",
3610 "equal($f51(x,y,z,w),x+((y-z)*w))",
3611 "equal($f52(x,y,z,w),x+((y*z)/w))",
3612 "equal($f53(x,y,z,w),x+((y*z)*w))",
3613 "equal($f54(x,y,z,w),x+((y/z)+w))",
3614 "equal($f55(x,y,z,w),x+((y/z)/w))",
3615 "equal($f56(x,y,z,w),x+((y/z)*w))",
3616 "equal($f57(x,y,z,w),x-((y+z)/w))",
3617 "equal($f58(x,y,z,w),x-((y+z)*w))",
3618 "equal($f59(x,y,z,w),x-((y-z)/w))",
3619 "equal($f60(x,y,z,w),x-((y-z)*w))",
3620 "equal($f61(x,y,z,w),x-((y*z)/w))",
3621 "equal($f62(x,y,z,w),x-((y*z)*w))",
3622 "equal($f63(x,y,z,w),x-((y/z)/w))",
3623 "equal($f64(x,y,z,w),x-((y/z)*w))",
3624 "equal($f65(x,y,z,w),((x+y)*z)-w)",
3625 "equal($f66(x,y,z,w),((x-y)*z)-w)",
3626 "equal($f67(x,y,z,w),((x*y)*z)-w)",
3627 "equal($f68(x,y,z,w),((x/y)*z)-w)",
3628 "equal($f69(x,y,z,w),((x+y)/z)-w)",
3629 "equal($f70(x,y,z,w),((x-y)/z)-w)",
3630 "equal($f71(x,y,z,w),((x*y)/z)-w)",
3631 "equal($f72(x,y,z,w),((x/y)/z)-w)",
3632 "equal($f73(x,y,z,w),(x*y)+(z*w))",
3633 "equal($f74(x,y,z,w),(x*y)-(z*w))",
3634 "equal($f75(x,y,z,w),(x*y)+(z/w))",
3635 "equal($f76(x,y,z,w),(x*y)-(z/w))",
3636 "equal($f77(x,y,z,w),(x/y)+(z/w))",
3637 "equal($f78(x,y,z,w),(x/y)-(z/w))",
3638 "equal($f79(x,y,z,w),(x/y)-(z*w))",
3639 "equal($f80(x,y,z,w),x/(y+(z*w)))",
3640 "equal($f81(x,y,z,w),x/(y-(z*w)))",
3641 "equal($f82(x,y,z,w),x*(y+(z*w)))",
3642 "equal($f83(x,y,z,w),x*(y-(z*w)))",
3643 "equal($f84(x,y,z,w),x*y^2+z*w^2)",
3644 "equal($f85(x,y,z,w),x*y^3+z*w^3)",
3645 "equal($f86(x,y,z,w),x*y^4+z*w^4)",
3646 "equal($f87(x,y,z,w),x*y^5+z*w^5)",
3647 "equal($f88(x,y,z,w),x*y^6+z*w^6)",
3648 "equal($f89(x,y,z,w),x*y^7+z*w^7)",
3649 "equal($f90(x,y,z,w),x*y^8+z*w^8)",
3650 "equal($f91(x,y,z,w),x*y^9+z*w^9)",
3651 "equal($f92(x,y,z,w),if(x and y,z,w))",
3652 "equal($f93(x,y,z,w),if(x or y,z,w))",
3653 "equal($f94(x,y,z,w),if(x < y,z,w))",
3654 "equal($f95(x,y,z,w),if(x <= y,z,w))",
3655 "equal($f96(x,y,z,w),if(x > y,z,w))",
3656 "equal($f97(x,y,z,w),if(x >= y,z,w))",
3657 "equal($f98(x,y,z,w),if(equal(x,y),z,w))",
3658 "equal($f92(x,y,z,w),x and y ? z : w)",
3659 "equal($f93(x,y,z,w),x or y ? z : w)",
3660 "equal($f94(x,y,z,w),x < y ? z : w)",
3661 "equal($f95(x,y,z,w),x <= y ? z : w)",
3662 "equal($f96(x,y,z,w),x > y ? z : w)",
3663 "equal($f97(x,y,z,w),x >= y ? z : w)",
3664 "equal($f98(x,y,z,w),equal(x,y) ? z : w)",
3665 "equal($f99(x,y,z,w),x*sin(y)+z*cos(w))"
3666 };
3667
3668 static const std::size_t expr_str_size = sizeof(expr_str) / sizeof(std::string);
3669
3670 static const std::size_t rounds = 25;
3671
3672 for (std::size_t i = 0; i < rounds; ++i)
3673 {
3674 for (std::size_t j = 0; j < expr_str_size; ++j)
3675 {
3676 typedef exprtk::expression<T> expression_t;
3677
3678 T x = T(1.12345);
3679 T y = T(2.12345);
3680 T z = T(3.12345);
3681 T w = T(4.12345);
3682 T u = T(5.12345);
3683
3684 exprtk::symbol_table<T> symbol_table;
3685 symbol_table.add_variable("x",x);
3686 symbol_table.add_variable("y",y);
3687 symbol_table.add_variable("z",z);
3688 symbol_table.add_variable("w",w);
3689 symbol_table.add_variable("u",u);
3690
3691 expression_t expression;
3692 expression.register_symbol_table(symbol_table);
3693
3694 {
3695 exprtk::parser<T> parser;
3696
3697 if (!parser.compile(expr_str[j],expression))
3698 {
3699 printf("run_test08() - Error: %s Expression: %s\n",
3700 parser.error().c_str(),
3701 expr_str[j].c_str());
3702
3703 return false;
3704 }
3705 }
3706
3707 expression.value();
3708 }
3709 }
3710
3711 return true;
3712}
3713
3714template <typename T>
3716{
3717 using exprtk::ifunction<T>::operator();
3718
3720
3721 inline T operator()(const T& v1, const T& v2)
3722 {
3723 return T(1) + (v1 * v2) / T(3);
3724 }
3725};
3726
3727#define define_free_functions(N,Type) \
3728inline Type N##1(Type v0) { return v0; } \
3729inline Type N##2(Type v0, Type v1) { return v0 + v1; } \
3730inline Type N##3(Type v0, Type v1, Type v2) { return v0 + v1 + v2; } \
3731inline Type N##4(Type v0, Type v1, Type v2, Type v3) { return v0 + v1 + v2 + v3; } \
3732inline Type N##5(Type v0, Type v1, Type v2, Type v3, Type v4) { return v0 + v1 + v2 + v3 + v4; } \
3733inline Type N##6(Type v0, Type v1, Type v2, Type v3, Type v4, Type v5) { return v0 + v1 + v2 + v3 + v4 + v5; } \
3734
3736#undef define_free_functions
3737
3738template <typename T>
3740{
3741 {
3742 static const std::size_t rounds = 1000;
3743
3744 for (std::size_t i = 0; i < rounds; ++i)
3745 {
3746 typedef exprtk::expression<T> expression_t;
3747 const std::string expression_string =
3748 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3749 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3750 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3751 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3752 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3753 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3754 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3755 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3756 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3757 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3758 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3759 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3760 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3761 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3762 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)+"
3763 "myfunc0(sin(x * pi),y / 2) + myfunc1(sin(x * pi),y / 2)+"
3764 "myfunc2(sin(x * pi),y / 2) + myfunc3(sin(x * pi),y / 2)+"
3765 "myfunc4(sin(x * pi),y / 2) + myfunc5(sin(x * pi),y / 2)+"
3766 "myfunc6(sin(x * pi),y / 2) + myfunc7(sin(x * pi),y / 2)+"
3767 "myfunc8(sin(x * pi),y / 2) + myfunc9(sin(x * pi),y / 2)";
3768
3769 T x = T(1) + (i / T(10000));
3770 T y = T(2) + (i / T(10000));
3771 myfunc<T> mf;
3772
3773 exprtk::symbol_table<T> symbol_table;
3774 symbol_table.add_variable("x",x);
3775 symbol_table.add_variable("y",y);
3776 symbol_table.add_function("myfunc0",mf);
3777 symbol_table.add_function("myfunc1",mf);
3778 symbol_table.add_function("myfunc2",mf);
3779 symbol_table.add_function("myfunc3",mf);
3780 symbol_table.add_function("myfunc4",mf);
3781 symbol_table.add_function("myfunc5",mf);
3782 symbol_table.add_function("myfunc6",mf);
3783 symbol_table.add_function("myfunc7",mf);
3784 symbol_table.add_function("myfunc8",mf);
3785 symbol_table.add_function("myfunc9",mf);
3786 symbol_table.add_constants();
3787
3788 expression_t expression;
3789 expression.register_symbol_table(symbol_table);
3790
3791 {
3792 exprtk::parser<T> parser;
3793
3794 if (!parser.compile(expression_string,expression))
3795 {
3796 printf("run_test09() - Error: %s Expression: %s\n",
3797 parser.error().c_str(),
3798 expression_string.c_str());
3799
3800 return false;
3801 }
3802 }
3803
3804 const T pi = T(3.141592653589793238462643383279502);
3805
3806 const T result = expression.value();
3807
3808 const T expected =
3809 T(4) *
3810 (
3811 mf(sin(x * pi), y / T(2)) +
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 );
3822
3823 if (not_equal(result,expected,T(0.0000001)))
3824 {
3825 printf("run_test09() - Error Expected: %19.15f\tResult: %19.15f\n",
3826 static_cast<double>(expected),
3827 static_cast<double>(result));
3828
3829 return false;
3830 }
3831 }
3832 }
3833
3834 {
3835 typedef exprtk::expression<T> expression_t;
3836 typedef exprtk::symbol_table<T> symbol_table_t;
3837
3838 bool result = true;
3839
3840 const std::string expression_list[] =
3841 {
3842 "foo1(1) == 1",
3843 "foo2(1,2) == (1 + 2)",
3844 "foo3(1,2,3) == (1 + 2 + 3)",
3845 "foo4(1,2,3,4) == (1 + 2 + 3 + 4)",
3846 "foo5(1,2,3,4,5) == (1 + 2 + 3 + 4 + 5)",
3847 "foo6(1,2,3,4,5,6) == (1 + 2 + 3 + 4 + 5 + 6)"
3848 };
3849
3850 const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
3851
3852 symbol_table_t symbol_table;
3853
3854 symbol_table.add_function("foo1",foo1);
3855 symbol_table.add_function("foo2",foo2);
3856 symbol_table.add_function("foo3",foo3);
3857 symbol_table.add_function("foo4",foo4);
3858 symbol_table.add_function("foo5",foo5);
3859 symbol_table.add_function("foo6",foo6);
3860
3861 for (std::size_t i = 0; i < expression_list_size; ++i)
3862 {
3863 expression_t expression;
3864 expression.register_symbol_table(symbol_table);
3865
3866 exprtk::parser<T> parser;
3867
3868 if (!parser.compile(expression_list[i],expression))
3869 {
3870 printf("run_test09() - Error: %s Expression: %s\n",
3871 parser.error().c_str(),
3872 expression_list[i].c_str());
3873
3874 result = false;
3875 }
3876 }
3877
3878 if (!result)
3879 return false;
3880 }
3881
3882 return true;
3883}
3884
3885template <typename T>
3887{
3888 typedef exprtk::expression<T> expression_t;
3889
3890 T x = T(1.1);
3891 T y = T(2.2);
3892 T xx = T(3.3);
3893 T yy = T(4.4);
3894
3895 std::string i_s = "A String";
3896 std::string j_s = "Another String";
3897 std::string ii_s = "A String";
3898 std::string jj_s = "Another String";
3899
3900 struct test
3901 {
3902 static inline bool variable(exprtk::symbol_table<T>& symbol_table, const std::string& variable_name, const T& value)
3903 {
3904 exprtk::details::variable_node<T>* var = symbol_table.get_variable(variable_name);
3905
3906 if (var)
3907 return (!not_equal(var->ref(),value));
3908 else
3909 return false;
3910 }
3911
3912 static inline bool string(exprtk::symbol_table<T>& symbol_table, const std::string& string_name, const std::string& str)
3913 {
3914 exprtk::details::stringvar_node<T>* str_node = symbol_table.get_stringvar(string_name);
3915
3916 if (str_node)
3917 return (str_node->ref() == str);
3918 else
3919 return false;
3920 }
3921 };
3922
3923 {
3924 static const std::size_t rounds = 10;
3925
3926 exprtk::symbol_table<T> symbol_table;
3927
3928 for (std::size_t r = 0; r < rounds; ++r)
3929 {
3930 symbol_table.add_variable("x" , x );
3931 symbol_table.add_variable("y" , y );
3932 symbol_table.add_variable("xx", xx);
3933 symbol_table.add_variable("yy", yy);
3934
3935 if (!symbol_table.symbol_exists("x"))
3936 {
3937 printf("run_test10() - Symbol 'x' does not exist!\n");
3938 return false;
3939 }
3940 else if (!symbol_table.symbol_exists("y"))
3941 {
3942 printf("run_test10() - Symbol 'y' does not exist!\n");
3943 return false;
3944 }
3945 else if (!symbol_table.symbol_exists("xx"))
3946 {
3947 printf("run_test10() - Symbol 'xx' does not exist!\n");
3948 return false;
3949 }
3950 else if (!symbol_table.symbol_exists("yy"))
3951 {
3952 printf("run_test10() - Symbol 'yy' does not exist!\n");
3953 return false;
3954 }
3955 else if (!test::variable(symbol_table, "x", x))
3956 {
3957 printf("run_test10() - Symbol 'x' value failure!\n");
3958 return false;
3959 }
3960 else if (!test::variable(symbol_table, "y", y))
3961 {
3962 printf("run_test10() - Symbol 'y' value failure!\n");
3963 return false;
3964 }
3965 else if (!test::variable(symbol_table, "xx", xx))
3966 {
3967 printf("run_test10() - Symbol 'xx' value failure!\n");
3968 return false;
3969 }
3970 else if (!test::variable(symbol_table, "yy", yy))
3971 {
3972 printf("run_test10() - Symbol 'yy' value failure!\n");
3973 return false;
3974 }
3975
3976 if (!symbol_table.remove_variable("x"))
3977 {
3978 printf("run_test10() - Failed to remove symbol 'x'!\n");
3979 return false;
3980 }
3981 else if (!symbol_table.remove_variable("y"))
3982 {
3983 printf("run_test10() - Failed to remove symbol 'y'!\n");
3984 return false;
3985 }
3986 else if (!symbol_table.remove_variable("xx"))
3987 {
3988 printf("run_test10() - Failed to remove symbol 'xx'!\n");
3989 return false;
3990 }
3991 else if (!symbol_table.remove_variable("yy"))
3992 {
3993 printf("run_test10() - Failed to remove symbol 'yy'!\n");
3994 return false;
3995 }
3996 }
3997
3998 for (std::size_t r = 0; r < rounds; ++r)
3999 {
4000 myfunc<T> mf;
4001
4002 symbol_table.add_function("f", mf);
4003 symbol_table.add_function("f1", mf);
4004
4005 if (!symbol_table.symbol_exists("f"))
4006 {
4007 printf("run_test10() - function 'f' does not exist!\n");
4008 return false;
4009 }
4010 else if (!symbol_table.symbol_exists("f1"))
4011 {
4012 printf("run_test10() - function 'f1' does not exist!\n");
4013 return false;
4014 }
4015
4016 if (!symbol_table.remove_function("f"))
4017 {
4018 printf("run_test10() - Failed to remove function 'f'!\n");
4019 return false;
4020 }
4021 else if (!symbol_table.remove_function("f1"))
4022 {
4023 printf("run_test10() - Failed to remove function 'f1'!\n");
4024 return false;
4025 }
4026 }
4027
4028 for (std::size_t r = 0; r < rounds; ++r)
4029 {
4030 symbol_table.add_stringvar("i", i_s);
4031 symbol_table.add_stringvar("j", j_s);
4032
4033 symbol_table.add_stringvar("ii", ii_s);
4034 symbol_table.add_stringvar("jj", jj_s);
4035
4036 if (!symbol_table.symbol_exists("i"))
4037 {
4038 printf("run_test10() - String 'i' does not exist!\n");
4039 return false;
4040 }
4041 else if (!symbol_table.symbol_exists("j"))
4042 {
4043 printf("run_test10() - String 'j' does not exist!\n");
4044 return false;
4045 }
4046 else if (!symbol_table.symbol_exists("ii"))
4047 {
4048 printf("run_test10() - String 'ii' does not exist!\n");
4049 return false;
4050 }
4051 else if (!symbol_table.symbol_exists("jj"))
4052 {
4053 printf("run_test10() - String 'jj' does not exist!\n");
4054 return false;
4055 }
4056 else if (!test::string(symbol_table, "i", i_s))
4057 {
4058 printf("run_test10() - String 'i' value failure!\n");
4059 return false;
4060 }
4061 else if (!test::string(symbol_table, "j", j_s))
4062 {
4063 printf("run_test10() - String 'j' value failure!\n");
4064 return false;
4065 }
4066 else if (!test::string(symbol_table, "ii", ii_s))
4067 {
4068 printf("run_test10() - String 'ii' value failure!\n");
4069 return false;
4070 }
4071 else if (!test::string(symbol_table, "jj", jj_s))
4072 {
4073 printf("run_test10() - String 'jj' value failure!\n");
4074 return false;
4075 }
4076 else if (!symbol_table.remove_stringvar("i"))
4077 {
4078 printf("run_test10() - Failed to remove String 'i'!\n");
4079 return false;
4080 }
4081 else if (!symbol_table.remove_stringvar("j"))
4082 {
4083 printf("run_test10() - Failed to remove String 'j'!\n");
4084 return false;
4085 }
4086 else if (!symbol_table.remove_stringvar("ii"))
4087 {
4088 printf("run_test10() - Failed to remove String 'ii'!\n");
4089 return false;
4090 }
4091 else if (!symbol_table.remove_stringvar("jj"))
4092 {
4093 printf("run_test10() - Failed to remove String 'jj'!\n");
4094 return false;
4095 }
4096 }
4097
4098 for (std::size_t r = 0; r < rounds; ++r)
4099 {
4100 symbol_table.add_variable("x" , x );
4101 symbol_table.add_variable("y" , y );
4102 symbol_table.add_variable("xx", xx);
4103 symbol_table.add_variable("yy", yy);
4104
4105 std::vector<std::string> expected_var_list;
4106
4107 expected_var_list.push_back("x" );
4108 expected_var_list.push_back("y" );
4109 expected_var_list.push_back("xx");
4110 expected_var_list.push_back("yy");
4111
4112 std::deque<std::pair<std::string, T> > variable_list;
4113
4114 symbol_table.get_variable_list(variable_list);
4115
4116 if (variable_list.size() != expected_var_list.size())
4117 {
4118 printf("run_test10() - Failed to get variable list (1)\n");
4119 return false;
4120 }
4121
4122 std::size_t found_count = 0;
4123
4124 for (std::size_t i = 0; i < variable_list.size(); ++i)
4125 {
4126 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4127 {
4128 if (variable_list[i].first == expected_var_list[j])
4129 {
4130 ++found_count;
4131 break;
4132 }
4133 }
4134 }
4135
4136 if (found_count != expected_var_list.size())
4137 {
4138 printf("run_test10() - Failed to get variable list (2)\n");
4139 return false;
4140 }
4141 }
4142
4143 for (std::size_t r = 0; r < rounds; ++r)
4144 {
4145 symbol_table.add_variable("x" , x );
4146 symbol_table.add_variable("y" , y );
4147 symbol_table.add_variable("xx", xx);
4148 symbol_table.add_variable("yy", yy);
4149
4150 std::vector<std::string> expected_var_list;
4151
4152 expected_var_list.push_back("x" );
4153 expected_var_list.push_back("y" );
4154 expected_var_list.push_back("xx");
4155 expected_var_list.push_back("yy");
4156
4157 std::deque<std::string> variable_list;
4158
4159 symbol_table.get_variable_list(variable_list);
4160
4161 if (variable_list.size() != expected_var_list.size())
4162 {
4163 printf("run_test10() - Failed to get variable list (3)\n");
4164 return false;
4165 }
4166
4167 std::size_t found_count = 0;
4168
4169 for (std::size_t i = 0; i < variable_list.size(); ++i)
4170 {
4171 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4172 {
4173 if (variable_list[i] == expected_var_list[j])
4174 {
4175 ++found_count;
4176 break;
4177 }
4178 }
4179 }
4180
4181 if (found_count != expected_var_list.size())
4182 {
4183 printf("run_test10() - Failed to get variable list (4)\n");
4184 return false;
4185 }
4186 }
4187
4188 for (std::size_t r = 0; r < rounds; ++r)
4189 {
4190 symbol_table.add_stringvar("i" , i_s );
4191 symbol_table.add_stringvar("j" , j_s );
4192 symbol_table.add_stringvar("ii", ii_s);
4193 symbol_table.add_stringvar("jj", jj_s);
4194
4195 std::vector<std::string> expected_var_list;
4196
4197 expected_var_list.push_back("i" );
4198 expected_var_list.push_back("j" );
4199 expected_var_list.push_back("ii");
4200 expected_var_list.push_back("jj");
4201
4202 std::deque<std::pair<std::string, std::string> > stringvar_list;
4203
4204 symbol_table.get_stringvar_list(stringvar_list);
4205
4206 if (stringvar_list.size() != expected_var_list.size())
4207 {
4208 printf("run_test10() - Failed to get stringvar list (1)\n");
4209 return false;
4210 }
4211
4212 std::size_t found_count = 0;
4213
4214 for (std::size_t i = 0; i < stringvar_list.size(); ++i)
4215 {
4216 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4217 {
4218 if (stringvar_list[i].first == expected_var_list[j])
4219 {
4220 ++found_count;
4221 break;
4222 }
4223 }
4224 }
4225
4226 if (found_count != expected_var_list.size())
4227 {
4228 printf("run_test10() - Failed to get stringvar list (2)\n");
4229 return false;
4230 }
4231 }
4232
4233 for (std::size_t r = 0; r < rounds; ++r)
4234 {
4235 symbol_table.add_stringvar("i" , i_s );
4236 symbol_table.add_stringvar("j" , j_s );
4237 symbol_table.add_stringvar("ii", ii_s);
4238 symbol_table.add_stringvar("jj", jj_s);
4239
4240 std::vector<std::string> expected_var_list;
4241
4242 expected_var_list.push_back("i" );
4243 expected_var_list.push_back("j" );
4244 expected_var_list.push_back("ii");
4245 expected_var_list.push_back("jj");
4246
4247 std::deque<std::string> stringvar_list;
4248
4249 symbol_table.get_stringvar_list(stringvar_list);
4250
4251 if (stringvar_list.size() != expected_var_list.size())
4252 {
4253 printf("run_test10() - Failed to get stringvar list (3.0)\n");
4254 return false;
4255 }
4256
4257 if (symbol_table.stringvar_count() != expected_var_list.size())
4258 {
4259 printf("run_test10() - Failed to get stringvar list (3.1)\n");
4260 return false;
4261 }
4262
4263 std::size_t found_count = 0;
4264
4265 for (std::size_t i = 0; i < stringvar_list.size(); ++i)
4266 {
4267 for (std::size_t j = 0; j < expected_var_list.size(); ++j)
4268 {
4269 if (stringvar_list[i] == expected_var_list[j])
4270 {
4271 ++found_count;
4272 break;
4273 }
4274 }
4275 }
4276
4277 if (found_count != expected_var_list.size())
4278 {
4279 printf("run_test10() - Failed to get stringvar list (4)\n");
4280 return false;
4281 }
4282 }
4283 }
4284
4285 {
4286 T x0 = T(0);
4287 T y0 = T(0);
4288 T z0 = T(0);
4289
4290 std::string expression_string = "(x0 + y0) / z0";
4291
4292 static const std::size_t rounds = 100;
4293
4294 for (std::size_t i = 0; i < rounds; ++i)
4295 {
4296 expression_t expression0;
4297
4298 x0 = T(i + 1.11);
4299 y0 = T(i + 2.22);
4300 z0 = T(i + 3.33);
4301
4303
4304 st0.add_variable("x0",x0);
4305 st0.add_variable("y0",y0);
4306 st0.add_variable("z0",z0);
4307
4308 expression0.register_symbol_table(st0);
4309
4310 {
4311 exprtk::parser<T> parser;
4312
4313 if (!parser.compile(expression_string,expression0))
4314 {
4315 printf("run_test10() - Error: %s Expression: %s\n",
4316 parser.error().c_str(),
4317 expression_string.c_str());
4318
4319 return false;
4320 }
4321 }
4322
4323 {
4324 expression_t expression1;
4325 exprtk::symbol_table<T> st1 = st0;
4326 expression1.register_symbol_table(st1);
4327
4328 {
4329 exprtk::parser<T> parser;
4330
4331 if (!parser.compile(expression_string,expression1))
4332 {
4333 printf("run_test10() - Error: %s Expression: %s\n",
4334 parser.error().c_str(),
4335 expression_string.c_str());
4336
4337 return false;
4338 }
4339 }
4340
4341 st1.remove_variable("x0");
4342 st1.remove_variable("y0");
4343 st1.remove_variable("z0");
4344 }
4345 }
4346 }
4347
4348 {
4349 T a = T(1);
4350 T b = T(2);
4351 T c = T(3);
4352 T d = T(4);
4353
4354 std::string e = "string";
4355
4356 exprtk::symbol_table<T> symbol_table;
4357
4358 symbol_table.add_variable ("a",a);
4359 symbol_table.add_variable ("b",b);
4360 symbol_table.add_variable ("c",c);
4361 symbol_table.add_variable ("d",d);
4362 symbol_table.add_stringvar("e",e);
4363
4364 expression_t expression;
4365 expression.register_symbol_table(symbol_table);
4366
4367 std::string expression_string = "(E == '1234') and (sin(a) + C) / b";
4368
4369 typedef exprtk::parser<T> parser_t;
4370 typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
4371
4372 std::deque<symbol_t> symbol_list;
4373
4374 {
4375 parser_t parser;
4376
4377 parser.dec().collect_variables() = true;
4378 parser.dec().collect_functions() = true;
4379
4380 if (!parser.compile(expression_string,expression))
4381 {
4382 printf("run_test10() - Error: %s Expression: %s\n",
4383 parser.error().c_str(),
4384 expression_string.c_str());
4385
4386 return false;
4387 }
4388
4389 parser.dec().symbols(symbol_list);
4390 }
4391
4392 std::deque<symbol_t> expected_symbol_list;
4393
4394 expected_symbol_list.push_back(symbol_t("a" ,parser_t::e_st_variable));
4395 expected_symbol_list.push_back(symbol_t("b" ,parser_t::e_st_variable));
4396 expected_symbol_list.push_back(symbol_t("c" ,parser_t::e_st_variable));
4397 expected_symbol_list.push_back(symbol_t("e" ,parser_t::e_st_string ));
4398 expected_symbol_list.push_back(symbol_t("sin",parser_t::e_st_function));
4399
4400 bool result = (symbol_list.size() == expected_symbol_list.size()) &&
4401 std::equal(symbol_list.begin(),
4402 symbol_list.end(),
4403 expected_symbol_list.begin());
4404 if (!result)
4405 {
4406 printf("run_test10() - Failed variable list comparison.(5)\n");
4407 return false;
4408 }
4409 }
4410
4411 {
4412 T a = T(1);
4413 T b = T(2);
4414 T c = T(3);
4415 T d = T(4);
4416
4417 std::string e = "string";
4418
4419 exprtk::symbol_table<T> symbol_table;
4420
4421 symbol_table.add_variable ("a",a);
4422 symbol_table.add_variable ("b",b);
4423 symbol_table.add_variable ("c",c);
4424 symbol_table.add_variable ("d",d);
4425 symbol_table.add_stringvar("e",e);
4426
4427 expression_t expression;
4428 expression.register_symbol_table(symbol_table);
4429
4430 const std::string expression_string =
4431 "a := b + c; "
4432 "b := c + d; "
4433 "c := d + 1; "
4434 "e := e + 'abc'; ";
4435
4436 typedef exprtk::parser<T> parser_t;
4437 typedef typename parser_t::dependent_entity_collector::symbol_t symbol_t;
4438
4439 std::deque<symbol_t> variable_list;
4440
4441 {
4442 parser_t parser;
4443
4444 parser.dec().collect_assignments() = true;
4445
4446 if (!parser.compile(expression_string,expression))
4447 {
4448 printf("run_test10() - Error: %s Expression: %s\n",
4449 parser.error().c_str(),
4450 expression_string.c_str());
4451
4452 return false;
4453 }
4454
4455 parser.dec().assignment_symbols(variable_list);
4456 }
4457
4458 std::deque<symbol_t> expected_assignment_list;
4459
4460 expected_assignment_list.push_back(symbol_t("a",parser_t::e_st_variable));
4461 expected_assignment_list.push_back(symbol_t("b",parser_t::e_st_variable));
4462 expected_assignment_list.push_back(symbol_t("c",parser_t::e_st_variable));
4463 expected_assignment_list.push_back(symbol_t("e",parser_t::e_st_string ));
4464
4465 bool result = (variable_list.size() == expected_assignment_list.size()) &&
4466 std::equal(variable_list.begin(),
4467 variable_list.end(),
4468 expected_assignment_list.begin());
4469 if (!result)
4470 {
4471 printf("run_test10() - Failed variable list comparison.(6)\n");
4472 return false;
4473 }
4474 }
4475
4476 {
4477 exprtk::symbol_table<T> symbol_table0;
4478 exprtk::symbol_table<T> symbol_table1;
4479
4480 if (symbol_table0 == symbol_table1)
4481 {
4482 printf("run_test10() - Error symbol_table0 and symbol_table1 are equal\n");
4483 return false;
4484 }
4485
4486 symbol_table0 = symbol_table1;
4487 symbol_table1 = symbol_table0;
4488
4489 if (!(symbol_table0 == symbol_table1))
4490 {
4491 printf("run_test10() - Error symbol_table0 and symbol_table1 are not equal\n");
4492 return false;
4493 }
4494 }
4495
4496 {
4497 T a = T(1);
4498 T b = T(2);
4499 T c = T(3);
4500 T d = T(4);
4501
4502 std::string e = "a string";
4503
4504 exprtk::symbol_table<T> symbol_table0;
4505 exprtk::symbol_table<T> symbol_table1;
4506 expression_t expression;
4507
4508 for (std::size_t i = 0; i < 10000; ++i)
4509 {
4510 symbol_table0.clear();
4511 symbol_table1.clear();
4512
4513 symbol_table0.add_variable ("a",a);
4514 symbol_table0.add_variable ("b",b);
4515 symbol_table0.add_variable ("c",c);
4516 symbol_table0.add_variable ("d",d);
4517 symbol_table0.add_stringvar("e",e);
4518 symbol_table0.add_constants( );
4519
4520 symbol_table1.add_variable ("a",a);
4521 symbol_table1.add_variable ("b",b);
4522 symbol_table1.add_variable ("c",c);
4523 symbol_table1.add_variable ("d",d);
4524 symbol_table1.add_stringvar("e",e);
4525 symbol_table1.add_constants( );
4526
4527 expression.register_symbol_table(symbol_table0);
4528 expression.register_symbol_table(symbol_table1);
4529 }
4530 }
4531
4532 {
4533 const std::string expression =
4534 "for (var i := 0; i < min(x[],y[],z[]); i += 1)"
4535 "{ z[i] := 3sin(x[i]) + 2log(y[i]); }";
4536
4537 std::vector<std::string> var_symbol_list;
4538 std::vector<std::string> func_symbol_list;
4539
4540 if (!exprtk::collect_variables(expression, var_symbol_list))
4541 {
4542 printf("run_test10() - Failed to collect variables.\n");
4543 return false;
4544 }
4545
4546 if (!exprtk::collect_functions(expression, func_symbol_list))
4547 {
4548 printf("run_test10() - Failed to collect functions.\n");
4549 return false;
4550 }
4551
4552 std::sort(var_symbol_list .begin(), var_symbol_list .end());
4553 std::sort(func_symbol_list.begin(), func_symbol_list.end());
4554
4555 std::vector<std::string> expected_var_symbol_list;
4556 std::vector<std::string> expected_func_symbol_list;
4557
4558 expected_var_symbol_list.push_back("i");
4559 expected_var_symbol_list.push_back("x");
4560 expected_var_symbol_list.push_back("y");
4561 expected_var_symbol_list.push_back("z");
4562
4563 expected_func_symbol_list.push_back("log");
4564 expected_func_symbol_list.push_back("min");
4565 expected_func_symbol_list.push_back("sin");
4566
4567 const bool var_result = (var_symbol_list.size() == expected_var_symbol_list.size()) &&
4568 std::equal(var_symbol_list.begin(),
4569 var_symbol_list.end(),
4570 expected_var_symbol_list.begin());
4571 if (!var_result)
4572 {
4573 printf("run_test10() - Failed collected variable comparison between received and expected variables\n");
4574 return false;
4575 }
4576
4577 const bool func_result = (func_symbol_list.size() == expected_func_symbol_list.size()) &&
4578 std::equal(func_symbol_list.begin(),
4579 func_symbol_list.end(),
4580 expected_func_symbol_list.begin());
4581 if (!func_result)
4582 {
4583 printf("run_test10() - Failed collected functions comparison between received and expected functions\n");
4584 return false;
4585 }
4586 }
4587
4588 {
4589 const std::string expression_list[] =
4590 {
4591 "var x; 1",
4592 "var x := 1; x",
4593 "var x:= 1; x - -1 == 2",
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== 0",
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== 2",
4603 "var x:= 1; x + +1 == 2",
4604 "var x:= 1; x ++1 == 2",
4605 "var x:= 1; 1 - -x == 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== 0",
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== 2",
4615 "var x:= 1; 1 + +x == 2",
4616 "var x:= 1; 1 ++x == 2",
4617 "var x:= 1; (x - -1 + 1) == 3",
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) == 1",
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) == 3",
4627 "var x:= 1; (x + +1 + 1) == 3",
4628 "var x:= 1; (x ++1 + 1) == 3",
4629 "var x:= 1; (1 - -x + 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) == 1",
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) == 3",
4639 "var x:= 1; (1 + +x + 1) == 3",
4640 "var x:= 1; (1 ++x + 1) == 3",
4641 "var x:= 1; (x - -1 - 1) == 1",
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; (1 - -x - 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; var y := 2; 1",
4666 "var x := 1; var y := 2; x",
4667 "var x:=6; var y:=4; x + -3 == 3",
4668 "var x:=6; var y:=4; x - -3 == 9",
4669 "var x:=6; var y:=4; x * -3 == -18",
4670 "var x:=6; var y:=4; x / -3 == -2",
4671 "var x:=6; var y:=4; -x + -3 == -9",
4672 "var x:=6; var y:=4; -x - -3 == -3",
4673 "var x:=6; var y:=4; -x * -3 == 18",
4674 "var x:=6; var y:=4; -x / -3 == 2",
4675 "var x:=6; var y:=4; -3 + -x == -9",
4676 "var x:=6; var y:=4; -3 - -x == 3",
4677 "var x:=6; var y:=4; -3 * -x == 18",
4678 "var x:=6; var y:=4; -3 / -x == 0.5",
4679 "var x:=6; var y:=4; 3 + -x == -3",
4680 "var x:=6; var y:=4; 3 - -x == 9",
4681 "var x:=6; var y:=4; 3 * -x == -18",
4682 "var x:=6; var y:=4; 3 / -x == -0.5",
4683 "var x := 3; var y := 6; x + -y == -3",
4684 "var x := 3; var y := 6; x - -y == 9",
4685 "var x := 3; var y := 6; -x + -y == -9",
4686 "var x := 3; var y := 6; -x - -y == 3",
4687 "var x := 3; var y := 6; -x * -y == 18",
4688 "var x := 6; var y := 3; -x / -y == 2",
4689 "var x := 3; var y := 6; -(-x * -y) == -18",
4690 "var x := 6; var y := 3; -(-x / -y) == -2",
4691 "var x:=1; 2+(3+abs(x)) == 6 ",
4692 "var x:=1; (3+abs(x))+2 == 6 ",
4693 "var x:=1; 2+(abs(x)+3) == 6 ",
4694 "var x:=1; (abs(x)+3)+2 == 6 ",
4695 "var x:=1; 2+(3-abs(x)) == 4 ",
4696 "var x:=1; (3-abs(x))+2 == 4 ",
4697 "var x:=1; 2+(abs(x)-3) == 0 ",
4698 "var x:=1; (abs(x)-3)+2 == 0 ",
4699 "var x:=1; 2-(3+abs(x)) == -2 ",
4700 "var x:=1; (3+abs(x))-2 == 2 ",
4701 "var x:=1; 2-(abs(x)+3) == -2 ",
4702 "var x:=1; (abs(x)+3)-2 == 2 ",
4703 "var x:=1; 2*(3*abs(x)) == 6 ",
4704 "var x:=1; (3*abs(x))*2 == 6 ",
4705 "var x:=1; 2*(abs(x)*3) == 6 ",
4706 "var x:=1; (abs(x)*3)*2 == 6 ",
4707 "var x:=1; 2*(3/abs(x)) == 6 ",
4708 "var x:=1; (3/abs(x))*2 == 6 ",
4709 "var x:=1; 2*(abs(x)/3) == (2/3)",
4710 "var x:=1; (abs(x)/3)*2 == (2/3)",
4711 "var x:=1; 2/(3*abs(x)) == (2/3)",
4712 "var x:=1; (3*abs(x))/2 == (3/2)",
4713 "var x:=1; 2/(abs(x)*3) == (2/3)",
4714 "var x:=1; (abs(x)*3)/2 == (3/2)",
4715 "var x:=1; 2/(3/abs(x)) == (2/3)",
4716 "var x:=1; (3/abs(x))/2 == (3/2)",
4717 "var x:=1; 2/(abs(x)/3) == 6 ",
4718 "var x:=1; (abs(x)/3)/2 == (1/6)",
4719 "var x:=3; var y:=6; -(-x)*-(-y) == 18",
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))*-(-(y+x)) == 81",
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:= 2; var y := 3; (-abs(x)+-abs(y)) == -5 ",
4728 "var x:= 2; var y := 3; (-abs(x)--abs(y)) == 1 ",
4729 "var x:= 2; var y := 3; (-abs(x)*-abs(y)) == 6 ",
4730 "var x:= 2; var y := 3; (-abs(x)/-abs(y)) == (2/3) ",
4731 "var x:= 2; var y := 3; (-abs(x)+abs(y)) == 1 ",
4732 "var x:= 2; var y := 3; (-abs(x)-abs(y)) == -5 ",
4733 "var x:= 2; var y := 3; (-abs(x)*abs(y)) == -6 ",
4734 "var x:= 2; var y := 3; (-abs(x)/abs(y)) == -(2/3) ",
4735 "var x:= 2; var y := 3; (abs(x)+-abs(y)) == -1 ",
4736 "var x:= 2; var y := 3; (abs(x)--abs(y)) == 5 ",
4737 "var x:= 2; var y := 3; (abs(x)*-abs(y)) == -6 ",
4738 "var x:= 2; var y := 3; (abs(x)/-abs(y)) == -(2/3) ",
4739 "var x:= 2; var y := 3; (-abs(x + 0)+-abs(y - 0)) == -5 ",
4740 "var x:= 2; var y := 3; (-abs(x + 0)--abs(y - 0)) == 1 ",
4741 "var x:= 2; var y := 3; (-abs(x + 0)*-abs(y - 0)) == 6 ",
4742 "var x:= 2; var y := 3; (-abs(x + 0)/-abs(y - 0)) == (2/3) ",
4743 "var x:= 2; var y := 3; (-abs(x + 0)+abs(y - 0)) == 1 ",
4744 "var x:= 2; var y := 3; (-abs(x + 0)-abs(y - 0)) == -5 ",
4745 "var x:= 2; var y := 3; (-abs(x + 0)*abs(y - 0)) == -6 ",
4746 "var x:= 2; var y := 3; (-abs(x + 0)/abs(y - 0)) == -(2/3) ",
4747 "var x:= 2; var y := 3; (abs(x + 0)+-abs(y - 0)) == -1 ",
4748 "var x:= 2; var y := 3; (abs(x + 0)--abs(y - 0)) == 5 ",
4749 "var x:= 2; var y := 3; (abs(x + 0)*-abs(y - 0)) == -6 ",
4750 "var x:= 2; var y := 3; (abs(x + 0)/-abs(y - 0)) == -(2/3) ",
4751 "var x := 1; var y := 2; swap(x,y); (x == 2) and (y == 1)",
4752 "var x := 1; var y := 2; x <=> y ; (x == 2) and (y == 1)",
4753 "var x := 'abc'; x == 'abc' ",
4754 "var x := 'abc'; var y := '123'; x != y ",
4755 "var x := 'abc'; var y := x + '123'; y == 'abc123' ",
4756 "var x := 'abc'; var y := '123' + x; y == '123abc' ",
4757 "~{var x := '123'; x[]} + ~{var x := '1234'; x[]} == 7",
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 := 4} == 7",
4761 "~{var x := 3} + ~{var x := '1234'; x[]} == 7",
4762 "~{var x := '123'; x[]} + ~{~{var x := 4}} == 7",
4763 "~{~{var x := 3}} + ~{var x := '1234'; x[]} == 7",
4764 "var v[2] := {1,2}; swap(v[0],v[1]); (v[0] == 2) and (v[1] == 1)",
4765 "var v[2] := {1,2}; v[0] <=> v[1] ; (v[0] == 2) and (v[1] == 1)",
4766 "var x := 1; var y := 2; ~(swap(x,y),(x == 2) and (y == 1))",
4767 "var x := 1; var y := 2; ~(x <=> y , (x == 2) and (y == 1))",
4768 "var v[2] := {1,2}; ~(swap(v[0],v[1]), (v[0] == 2) and (v[1] == 1))",
4769 "var v[2] := {1,2}; ~(v[0] <=> v[1] , (v[0] == 2) and (v[1] == 1))",
4770 "var v[2] := {1,2}; swap(v[zero],v[one]); (v[zero] == 2) and (v[one] == 1)",
4771 "var v[2] := {1,2}; v[zero] <=> v[one] ; (v[zero] == 2) and (v[one] == 1)",
4772 "var v[2] := {1,2}; ~(swap(v[zero],v[one]), (v[zero] == 2) and (v[one] == 1))",
4773 "var v[2] := {1,2}; ~(v[zero] <=> v[one] , (v[zero] == 2) and (v[one] == 1))",
4774 "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)",
4775 "var v[2] := {1,2}; 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}; ~(swap(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}; ~(v[2 * zero] <=> v[(2 * one) / (1 + 1)] , (v[2 * zero] == 2) and (v[(2 * one) / (1 + 1)] == 1))",
4778 "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[0]); swap(v[1],y); (x == 3) and (y == 4)",
4779 "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[0]; v[1] <=> y; (x == 3) and (y == 4)",
4780 "var x := 1; var y := 2; var v[2] := {3,4}; swap(x,v[zero]); swap(v[one],y); (x == 3) and (y == 4)",
4781 "var x := 1; var y := 2; var v[2] := {3,4}; x <=> v[zero]; v[one] <=> y; (x == 3) and (y == 4)",
4782 "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)",
4783 "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)",
4784 "~{ var x := 1 } + ~{ var x := 2 } == 3",
4785 "(~{ var x := 1 } + ~{ var x := 2 }) == (~{ var x := 2 } + ~{ var x := 1 })",
4786 "(~{ var x := 1 } + ~{ var x := 2 } + ~{~{ var x := 1 } + ~{ var x := 2 }}) == 6",
4787 "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4788 "(~{ var x := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4789 "(~{ var x[1] := [1] } + ~{ var x := [2] } + ~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }}) == 6",
4790 "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x := [1] } + ~{ var x[1] := [2] }}) == 6",
4791 "(~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{~{ var x[1] := [1] } + ~{ var x := [2] }}) == 6",
4792 "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4793 "(~{~{ var x := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4794 "(~{~{ var x[1] := [1] } + ~{ var x := [2] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] }) == 6",
4795 "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x := [1] } + ~{ var x[1] := [2] }) == 6",
4796 "(~{~{ var x[1] := [1] } + ~{ var x[1] := [2] }} + ~{ var x[1] := [1] } + ~{ var x := [2] }) == 6",
4797 "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4798 "(~{~{ var x := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4799 "(~{~{ var x[1] := [1] }} + ~{ var x := [1] } + ~{ var x[1] := [2] } + ~{{ var x[1] := [2] }}) == 6",
4800 "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x := [2] } + ~{{ var x[1] := [2] }}) == 6",
4801 "(~{~{ var x[1] := [1] }} + ~{ var x[1] := [1] } + ~{ var x[1] := [2] } + ~{{ var x := [2] }}) == 6",
4802 "(~{~{~{var x[1] := [1]}}} + ~{~{var x[1] := [2]}} + ~{var x[1] := [3]}) == 6",
4803 "(~{var x[1] := [1]} + ~{~{var x[1] := [2]}} + ~{~{~{var x[1] := [3]}}}) == 6",
4804 "(~{ var x[3] := [1] } + ~{ var x[6] := {6,5,4,3,2,1}}) == 7",
4805 "(~{ var x[6] := {6,5,4,3,2,1} } + ~{ var x := 1 }) == 7",
4806 "(~{ var x := 1 } + ~{ var x[6] := {6,5,4,3,2,1} }) == 7",
4807 "var x[3] := {}; (x[0] == 0) and (x[1] == 0) and (x[2] == 0)",
4808 "var x[3] := {1,2}; (x[0] == 1) and (x[1] == 2) and (x[2] == 0)",
4809 "var x[3] := {1,2,3}; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4810 "var x[3] := [1]; (x[0] == 1) and (x[1] == 1) and (x[2] == 1)",
4811 "var v[3] := [1]; v += 1; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 2)",
4812 "var v[3] := [1]; v -= 1; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 0)",
4813 "var v[3] := [1]; v *= 2; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 2)",
4814 "var v[3] := [3]; v /= 3; (v[0] == v[1]) and (v[0] == v[2]) and (v[0] == 1)",
4815 "var v[3] := {1,2, 3}; v += 1; (v[0] == 2) and (v[1] == 3) and (v[2] == 4)",
4816 "var v[3] := {1,2, 3}; v -= 1; (v[0] == 0) and (v[1] == 1) and (v[2] == 2)",
4817 "var v[3] := {1,2, 3}; v *= 2; (v[0] == 2) and (v[1] == 4) and (v[2] == 6)",
4818 "var v[3] := {3,9,15}; v /= 3; (v[0] == 1) and (v[1] == 3) and (v[2] == 5)",
4819 "var v0[3] := [1]; var v1[3] := [1]; v0 += v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 2)",
4820 "var v0[3] := [1]; var v1[3] := [1]; v0 -= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 0)",
4821 "var v0[3] := [1]; var v1[3] := [2]; v0 *= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 2)",
4822 "var v0[3] := [3]; var v1[3] := [3]; v0 /= v1; (v0[0] == v0[1]) and (v0[0] == v0[2]) and (v0[0] == 1)",
4823 "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)",
4824 "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)",
4825 "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)",
4826 "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)",
4827 "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])",
4828 "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])",
4829 "var x[3] := {}; var y[2] := {1,2}; x := y; (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4830 "var x[3] := {}; var y[1] := {1}; x := y; (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4831 "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])",
4832 "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])",
4833 "var x[3] := {}; var y[2] := {1,2}; x := (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4834 "var x[3] := {}; var y[1] := {1}; x := (y+=1); (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4835 "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])",
4836 "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])",
4837 "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) ",
4838 "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) ",
4839 "var x[3] := {}; var y[2] := {1,2}; x += (y+=1); (x[0] == y[0]) and (x[1] == y[1]) and (x[2] == 0)",
4840 "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) ",
4841 "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) and (x[1] == 0) ",
4842 "var x[3] := {}; var y[1] := {1}; x += (y+=1); (x[0] == y[0]) and (x[1] == 0) and (x[2] == 0)",
4843 "var x[3] := [9]; var y[4] := {1,2,3,4}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4844 "var x[3] := [9]; var y[3] := {1,2,3}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4845 "var x[3] := [9]; var y[2] := {1,2}; x <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 9)",
4846 "var x[3] := [9]; var y[1] := {1}; x <=> y; (x[0] == 1) and (x[1] == 9) and (x[2] == 9)",
4847 "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)",
4848 "var x[3] := [9]; var y[3] := {1,2,3}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 4)",
4849 "var x[3] := [9]; var y[2] := {1,2}; x <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 9)",
4850 "var x[3] := [9]; var y[1] := {1}; x <=> (y += 1); (x[0] == 2) and (x[1] == 9) and (x[2] == 9)",
4851 "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)",
4852 "var x[3] := [8]; var y[3] := {1,2,3}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 3)",
4853 "var x[3] := [8]; var y[2] := {1,2}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 2) and (x[2] == 9)",
4854 "var x[3] := [8]; var y[1] := {1}; (x += 1) <=> y; (x[0] == 1) and (x[1] == 9) and (x[2] == 9)",
4855 "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)",
4856 "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)",
4857 "var x[3] := [8]; var y[2] := {1,2}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 3) and (x[2] == 9)",
4858 "var x[3] := [8]; var y[1] := {1}; (x += 1) <=> (y += 1); (x[0] == 2) and (x[1] == 9) and (x[2] == 9)",
4859 "var x[3] := [0]; var y[4] := {1,2,3,4}; X < y",
4860 "var x[3] := [0]; var y[3] := {1,2,3}; x < Y",
4861 "var x[3] := [0]; var y[2] := {1,2}; X < y",
4862 "var x[3] := [0]; var y[1] := {1}; x < Y",
4863 "var x[3] := [0]; var y[4] := {1,2,3,4}; x <= y",
4864 "var x[3] := [0]; var y[3] := {1,2,3}; x <= y",
4865 "var x[3] := [0]; var y[2] := {1,2}; x <= y",
4866 "var x[3] := [0]; var y[1] := {1}; x <= y",
4867 "var x[3] := [5]; var y[4] := {1,2,3,4}; x > y",
4868 "var x[3] := [5]; var y[3] := {1,2,3}; x > y",
4869 "var x[3] := [5]; var y[2] := {1,2}; x > y",
4870 "var x[3] := [5]; var y[1] := {1}; x > y",
4871 "var x[3] := [5]; var y[4] := {1,2,3,4}; x >= y",
4872 "var x[3] := [5]; var y[3] := {1,2,3}; x >= y",
4873 "var x[3] := [5]; var y[2] := {1,2}; x >= y",
4874 "var x[3] := [5]; var y[1] := {1}; x >= y",
4875 "var x[3] := [1]; var y[4] := [1]; x == y",
4876 "var x[3] := [1]; var y[3] := [1]; x == y",
4877 "var x[3] := [1]; var y[2] := [1]; x == y",
4878 "var x[3] := [1]; var y[1] := [1]; x == y",
4879 "var x[3] := [1]; var y[4] := [2]; x != y",
4880 "var x[3] := [1]; var y[3] := [2]; x != y",
4881 "var x[3] := [1]; var y[2] := [2]; x != y",
4882 "var x[3] := [1]; var y[1] := [2]; x != y",
4883 "var x[3] := [0]; var y[4] := {5,6,7,8}; (x += 1) < y",
4884 "var x[3] := [0]; var y[3] := {5,6,7}; (x += 1) < y",
4885 "var x[3] := [0]; var y[2] := {5,6}; (x += 1) < y",
4886 "var x[3] := [0]; var y[1] := {5}; (x += 1) < y",
4887 "var x[3] := [0]; var y[4] := {1,2,3,4}; x < (y += 1)",
4888 "var x[3] := [0]; var y[3] := {1,2,3}; x < (y += 1)",
4889 "var x[3] := [0]; var y[2] := {1,2}; x < (y += 1)",
4890 "var x[3] := [0]; var y[1] := {1}; x < (y += 1)",
4891 "var x[3] := [0]; var y[4] := {5,6,7,8}; (x += 1) < (y += 1)",
4892 "var x[3] := [0]; var y[3] := {5,6,7}; (x += 1) < (y += 1)",
4893 "var x[3] := [0]; var y[2] := {5,6}; (x += 1) < (y += 1)",
4894 "var x[3] := [0]; var y[1] := {5}; (x += 1) < (y += 1)",
4895 "var x[3] := {1,2,3}; var y := 5; x < y ",
4896 "var x[3] := {1,2,3}; var y := 3; x < y + 1 ",
4897 "var x[3] := {1,2,3}; var y := 5; x <= y ",
4898 "var x[3] := {1,2,3}; var y := 3; x <= y + 1",
4899 "var x[3] := {1,1,1}; var y := 1; x == y ",
4900 "var x[3] := {1,1,1}; var y := 2; x == y - 1",
4901 "var x[3] := {1,2,3}; var y := 5; y > x ",
4902 "var x[3] := {1,2,3}; var y := 3; y >= x ",
4903 "var x[3] := {1,2,3}; var y := 5; y + 1 > x ",
4904 "var x[3] := {1,1,1}; var y := 1; y == x ",
4905 "var x[3] := {1,1,1}; var y := 2; y - 1 == x",
4906 "var x[3] := {1,2,3}; var y := 5; equal(true,(x += 1) < y) ",
4907 "var x[3] := {1,2,3}; var y := 3; equal(true,(x -= 1) < y + 1)",
4908 "var x[3] := {1,2,3}; var y := 5; equal(true,(x -= 1) <= y) ",
4909 "var x[3] := {2,2,2}; var y := 1; (x -= 1) == y ",
4910 "var x[3] := {1,2,3}; var y := 5; y > (x += 1) ",
4911 "var x[3] := {1,2,3}; var y := 5; y + 1 > (x += 1) ",
4912 "var x[3] := {2,2,2}; var y := 1; y == (x -= 1) ",
4913 "var x[3] := {2,2,2}; var y := 0; y + 1 == (x -= 1)",
4914 "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := (x + y); z == (x + y)",
4915 "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := (x - y); z == (x - y)",
4916 "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := (x / y); z == (x / y)",
4917 "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := (x * y); z == (x * y)",
4918 "var x[3] := [1]; var y[4] := {1,2,3,4}; var z[3] := [1]; z := 2(x + y); z == (x + y)2",
4919 "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := 2(x - y); z == (x - y)2",
4920 "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := 2(x / y); z == (x / y)2",
4921 "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := 2(x * y); z == (x * y)2",
4922 "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",
4923 "var x[3] := [1]; var y[3] := {1,2,3}; var z[3] := [1]; z := 2(x - y)/3; z == 2(x - y)/3",
4924 "var x[3] := [1]; var y[2] := {1,2}; var z[3] := [1]; z := 2(x / y)/3; z == 2(x / y)/3",
4925 "var x[3] := [1]; var y[1] := {1}; var z[3] := [1]; z := 2(x * y)/3; z == 2(x * y)/3",
4926 "var x[6] := {1,2,3,4,5,6}; equal(sqrt(sum([x - avg(x)]^2) / x[]),1.70782512765993300)",
4927 "var x[3] := {-1,-2,-3}; sum(abs(x) ) == 6",
4928 "var x[3] := {0.1,0.2,0.3}; sum(trunc(x)) == 0",
4929
4930 "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)",
4931
4932 "var x := 2; (~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; "
4933 "j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } else "
4934 "break[i + j]; } } } + ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; "
4935 "j <= i; j += 1) { var y := 3; if ((i + j + y + x) < 6) { y += x; continue; } "
4936 " else break[i + j]; } } }) == 18 ",
4937
4938 "var x := 2; var v0[3] := {1,2,3}; ( ~{ for (var i := 0; i < 10; i += 1) { "
4939 "for (var j := 0; j <= i; j += 1) { var y := 3; var v2[3] := {1,2,3}; if ( "
4940 "(i + j + y + x + abs(v0[i % v0[]] - v2[j % v2[]])) < 6) { var v3[3] := "
4941 "{1,2,3}; y += x / v3[j % v3[]]; continue; } else break[i + j]; } } } "
4942 "+ ~{ for (var i := 0; i < 10; i += 1) { for (var j := 0; j <= i; j += 1) "
4943 " { var y := 3; var v2[3] := {1,2,3}; if ((i + j + y + x + abs(v0[i % v0[]] - "
4944 "v2[j % v2[]])) < 6) { var v3[3] := {1,2,3}; y += x / v3[j % v3[]]; "
4945 "continue; } else break[i + j]; } } } ) == 18 ",
4946
4947 "12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
4948 "12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
4949 "12 == (if (1 > 2) { var x:= 2; } else { var x[3] := {7,2,3}; sum(x); })",
4950 "12 == (if (1 < 2) { var x[3] := {7,2,3}; sum(x); } else { var x:= 2; })",
4951
4952 "21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; i += 1;"
4953 "i += 2; i += 3; }; })",
4954
4955 "21 == (for (var i := 0; i < 10; i += 1) { if (i > 2) { break [i * 7]; return "
4956 "[i * 8]; i += 1; i += 2; i += 3; }; })",
4957
4958 "2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; i += 1; i += 2;"
4959 "i += 3; } else i; }",
4960
4961 "2 == for (var i := 0; i < 10; i += 1) { if (i > 2) { continue; return [i * 8];"
4962 "i += 1; i += 2; i += 3; } else i; }",
4963
4964 "var x[10] := [-1]; var y[10] := [-1]; for (var i := 0; i < 10; i += 1) { x[i] := i; "
4965 "y[i] := 2 * x[i]; }; (sum(x) == 45) and (sum(y) == (2 * sum(x)));"
4966
4967 "7 == (for (var i := 0; i < 10; i += 1) { ~{break[7]; continue; i += i} })",
4968 "0 == (for (var i := 0; i < 10; i += 1) { ~{break[i]; continue; i += i} })",
4969 "0 == (for (var i := 0; i < 10; i += 1) { ~{continue; break[7]; i += i} })",
4970 "1 == (for (var i := 0; i < 10; i += 1) { ~{break[i += 1]; continue; i += i} })",
4971
4972 "var s := 'abc'; s == ~{'abc' } ",
4973 "var s := 'abc'; s == ~{s } ",
4974 "var s := 'abc'; s == ~{'ab' + 'c'} ",
4975 "var s := 'abc'; ~{'abc' } == s ",
4976 "var s := 'abc'; ~{s } == s ",
4977 "var s := 'abc'; ~{'ab' + 'c'} == s ",
4978 "var s := 'abc'; ~{1 + 2; 'abc' + s; s} == s ",
4979 "var s := 'abc'; ~{1 + 2; var x := 'ab'; x + 'c'} == s ",
4980
4981 "var x[10^6] := null; var y[10^7] := null; 0 * (min(x) + min(y)) + x[] + y[] == 10^7 + 10^6",
4982
4983 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0, v1) == v0",
4984 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0, v1) == v1",
4985 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)",
4986 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)",
4987 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; var x := 1; var y := 2; if (x < y, 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) == v1",
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 - v0) == (v0 - 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) == (v1 - v0)",
4991
4992 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0, v1) == v0",
4993 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0, v1) == v1",
4994 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 < 2, v0 - v1, v1 - v0) == (v0 - v1)",
4995 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; if (1 > 2, v0 - v1, v1 - v0) == (v1 - v0)",
4996 "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",
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) == v1",
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 - v0) == (v0 - 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) == (v1 - v0)",
5000
5001 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0; else v1;) == v0",
5002 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0; else v1;) == v1",
5003 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)",
5004 "var v0[3] := {1,2,3}; var v1[3] := {7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)",
5005 "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",
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;) == v1",
5007 "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)",
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;) == (v1 - v0)",
5009
5010 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0; else v1;) == v0",
5011 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0; else v1;) == v1",
5012 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 < 2) v0 - v1; else v1 - v0;) == (v0 - v1)",
5013 "var v0[3] := {1,2,3}; var v1[4] := {6,7,8,9}; (if (1 > 2) v0 - v1; else v1 - v0;) == (v1 - v0)",
5014 "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",
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;) == v1",
5016 "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)",
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;) == (v1 - v0)",
5018
5019 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((-x * -y)); true;",
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; ((1.123 * x) + (1.123 * 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) + (y * 1.123)); 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 / z)); 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); true;",
5030 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) * 2.123); 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 * y)); true;",
5033 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) * (y * 2.123)); true;",
5034 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 * x) / (2.123 * y)); 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) / (y * 2.123)); 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) + 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 + y)); true;",
5041 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) + (y + 2.123)); true;",
5042 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) - (2.123 + y)); true;",
5043 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 + x) - (y + 2.123)); true;",
5044 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 - x) + 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 - y)); true;",
5047 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 - x) - (y - 2.123)); true;",
5048 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) * 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 / y)); true;",
5051 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) * (y / 2.123)); true;",
5052 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((1.123 / x) / (2.123 * y)); 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) / (y * 2.123)); 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) * (2.123 * x)); 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) * (x * 2.123)); 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) + (2.123 + x)); 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) + (x + 2.123)); 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) - (2.123 + x)); 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) - (x + 2.123)); 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) / (2.123 * x)); 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) / (x * 2.123)); 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; ((x * 1.123) * 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) + (1.123 * y)); 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) + (y * 1.123)); 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) * (2.123 * y)); true;",
5086 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) * (y * 2.123)); true;",
5087 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x * 1.123) / (2.123 * y)); 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) / (y * 2.123)); 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 * y) / (z / w)); true;",
5092 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) + (2.123 + y)); true;",
5093 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) + (y + 2.123)); true;",
5094 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) - (2.123 + y)); true;",
5095 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + 1.123) - (y + 2.123)); true;",
5096 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x + y) / (z / w)); true;",
5097 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - 1.123) - (2.123 - y)); true;",
5098 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - 1.123) - (y - 2.123)); true;",
5099 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x - y) / (z / w)); true;",
5100 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (y / z)); true;",
5101 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) + (y / 1.123)); 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 / z)); true;",
5104 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) / y); true;",
5105 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (2.123 / y)); true;",
5106 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / 1.123) * (y + 2.123)); 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) / (2.123 * y)); 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) / (y * 2.123)); 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 / y) * (1.123 / z)); true;",
5114 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) * (z / 1.123)); true;",
5115 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) * (z / w)); true;",
5116 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / (1.123 / z)); true;",
5117 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / (z / 1.123)); true;",
5118 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / (z / w)); true;",
5119 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / 1.123); true;",
5120 "var x := 1.111; var y := 2.222; var z := 3.333; var w := 4.444; ((x / y) / z); true;",
5121 };
5122
5123 const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
5124
5125 static const std::size_t rounds = 20;
5126
5127 exprtk::symbol_table<T> symbol_table;
5128
5129 T zero = T(0);
5130 T one = T(1);
5131
5132 symbol_table.add_variable("zero",zero);
5133 symbol_table.add_variable("one" , one);
5134 symbol_table.add_pi();
5135
5136 bool failed = false;
5137
5138 for (std::size_t r = 0; r < rounds; ++r)
5139 {
5140 for (std::size_t i = 0; i < expression_list_size; ++i)
5141 {
5142 expression_t expression;
5143 expression.register_symbol_table(symbol_table);
5144
5145 {
5146 exprtk::parser<T> parser;
5147
5148 if (!parser.compile(expression_list[i],expression))
5149 {
5150 printf("run_test10() - swaps[1] Error: %s Expression: %s\n",
5151 parser.error().c_str(),
5152 expression_list[i].c_str());
5153
5154 failed = true;
5155 continue;
5156 }
5157 }
5158
5159 const T result = expression.value();
5160
5161 if (T(1) != result)
5162 {
5163 printf("run_test10() - swaps[1] evaluation error Expression: %s\n",
5164 expression_list[i].c_str());
5165
5166 failed = true;
5167 }
5168
5169 expression.release();
5170 }
5171
5172 if (failed)
5173 {
5174 return false;
5175 }
5176 }
5177
5178 // reuse parser
5179 for (std::size_t r = 0; r < rounds; ++r)
5180 {
5181 exprtk::parser<T> parser;
5182
5183 for (std::size_t i = 0; i < expression_list_size; ++i)
5184 {
5185 expression_t expression;
5186 expression.register_symbol_table(symbol_table);
5187
5188 if (!parser.compile(expression_list[i],expression))
5189 {
5190 printf("run_test10() - swaps[2] Error: %s Expression: %s\n",
5191 parser.error().c_str(),
5192 expression_list[i].c_str());
5193
5194 failed = true;
5195 continue;
5196 }
5197
5198 const T result = expression.value();
5199
5200 if (T(1) != result)
5201 {
5202 printf("run_test10() - swaps[2] evaluation error Expression: %s\n",
5203 expression_list[i].c_str());
5204
5205 failed = true;
5206 }
5207 }
5208
5209 if (failed)
5210 {
5211 return false;
5212 }
5213 }
5214 }
5215
5216 return true;
5217}
5218
5219template <typename T>
5221{
5222 typedef exprtk::expression<T> expression_t;
5223
5224 std::string expression_string = "(x + y) / 3";
5225
5226 T x = T(1.0);
5227 T y = T(2.0);
5228
5229 exprtk::symbol_table<T> symbol_table;
5230 symbol_table.add_variable("x",x);
5231 symbol_table.add_variable("y",y);
5232
5233 expression_t expression;
5234 expression.register_symbol_table(symbol_table);
5235
5236 static const std::size_t rounds = 500;
5237
5238 for (std::size_t i = 0; i < rounds; ++i)
5239 {
5240 {
5241 exprtk::parser<T> parser;
5242
5243 if (!parser.compile(expression_string,expression))
5244 {
5245 printf("run_test11() - Error: %s Expression: %s\n",
5246 parser.error().c_str(),
5247 expression_string.c_str());
5248
5249 return false;
5250 }
5251 }
5252
5253 if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
5254 {
5255 printf("run_test11() - Error in evaluation!(1)\n");
5256 return false;
5257 }
5258
5259 expression.release();
5260
5261 if (false == (!expression))
5262 {
5263 printf("run_test11() - Error in evaluation!(2)\n");
5264 return false;
5265 }
5266
5267 {
5268 exprtk::parser<T> parser;
5269
5270 if (!parser.compile(expression_string,expression))
5271 {
5272 printf("run_test11() - Error: %s Expression: %s\n",
5273 parser.error().c_str(),
5274 expression_string.c_str());
5275
5276 return false;
5277 }
5278 }
5279
5280 expression.value();
5281
5282 if (not_equal(expression.value(),(x + y) / T(3),T(0.000001)))
5283 {
5284 printf("run_test11() - Error in evaluation!(3)\n");
5285 return false;
5286 }
5287 }
5288
5289 return true;
5290}
5291
5292template <typename T>
5294{
5295 typedef exprtk::expression<T> expression_t;
5296
5297 static const std::string expression_string[] =
5298 {
5299 "equal(poly01(x,2.2,1.1),(2.2x^1+1.1))",
5300 "equal(poly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
5301 "equal(poly03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
5302 "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))",
5303 "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))",
5304 "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))",
5305 "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))",
5306 "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))",
5307 "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))",
5308 "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))",
5309 "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))",
5310 "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))",
5311 "EquaL(Poly01(x,2.2,1.1),(2.2x^1+1.1))",
5312 "eQuAl(pOly02(x,3.3,2.2,1.1),(3.3x^2+2.2x^1+1.1))",
5313 "eqUal(poLy03(x,4.4,3.3,2.2,1.1),(4.4x^3+3.3x^2+2.2x^1+1.1))",
5314 "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))",
5315 "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))",
5316 "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))",
5317 "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))",
5318 "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))",
5319 "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))",
5320 "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))",
5321 "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))",
5322 "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))"
5323 };
5324
5325 static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
5326
5327 T x = T(1.23456);
5328
5341
5342 exprtk::symbol_table<T> symbol_table;
5343
5344 symbol_table.add_variable("x",x);
5345 symbol_table.add_function("poly01", poly01);
5346 symbol_table.add_function("poly02", poly02);
5347 symbol_table.add_function("poly03", poly03);
5348 symbol_table.add_function("poly04", poly04);
5349 symbol_table.add_function("poly05", poly05);
5350 symbol_table.add_function("poly06", poly06);
5351 symbol_table.add_function("poly07", poly07);
5352 symbol_table.add_function("poly08", poly08);
5353 symbol_table.add_function("poly09", poly09);
5354 symbol_table.add_function("poly10", poly10);
5355 symbol_table.add_function("poly11", poly11);
5356 symbol_table.add_function("poly12", poly12);
5357
5358 expression_t expression;
5359 expression.register_symbol_table(symbol_table);
5360
5361 static const std::size_t rounds = 500;
5362
5363 for (std::size_t i = 0; i < rounds; ++i)
5364 {
5365 for (std::size_t j = 0; j < expression_string_size; ++j)
5366 {
5367 const std::string& expr_str = expression_string[j];
5368
5369 {
5370 exprtk::parser<T> parser;
5371
5372 if (!parser.compile(expr_str,expression))
5373 {
5374 printf("run_test12() - Error: %s Expression: %s\n",
5375 parser.error().c_str(),
5376 expr_str.c_str());
5377
5378 return false;
5379 }
5380 }
5381
5382 if (T(1) != expression.value())
5383 {
5384 printf("run_test12() - Error in evaluation! Expression: %s\n",expr_str.c_str());
5385 return false;
5386 }
5387 }
5388 }
5389
5390 return true;
5391}
5392
5393template <typename T>
5395{
5396 using exprtk::ifunction<T>::operator();
5397
5399
5401 {
5402 return real::sin((v * T(exprtk::details::numeric::constant::pi)) / T(180));
5403 }
5404};
5405
5406template <typename T>
5408{
5409 using exprtk::ifunction<T>::operator();
5410
5412
5414 {
5415 return real::cos((v * T(exprtk::details::numeric::constant::pi)) / T(180));
5416 }
5417};
5418
5419template <typename T>
5421{
5422 typedef exprtk::symbol_table<T> symbol_table_t;
5423 typedef exprtk::expression<T> expression_t;
5424 typedef exprtk::parser<T> parser_t;
5425
5426 static const std::string expression_string[] =
5427 {
5428 "equal(sin(30),0.5) ",
5429 "equal(cos(60),0.5) ",
5430 "equal(sin(60),sqrt(3)/2) ",
5431 "equal(cos(30),sqrt(3)/2) ",
5432 "equal(sin(x_deg),0.5) ",
5433 "equal(cos(y_deg),0.5) ",
5434 "equal(sin(y_deg),sqrt(3)/2) ",
5435 "equal(cos(x_deg),sqrt(3)/2) ",
5436 "equal(sin(30) + sin(30),1.0) ",
5437 "equal(cos(60) + cos(60),1.0) ",
5438 "equal(sin(60) + sin(60),sqrt(3)) ",
5439 "equal(cos(30) + cos(30),sqrt(3)) ",
5440 "equal(sin(x_deg) + sin(x_deg),1.0) ",
5441 "equal(cos(y_deg) + cos(y_deg),1.0) ",
5442 "equal(sin(y_deg) + sin(y_deg),sqrt(3))",
5443 "equal(cos(x_deg) + cos(x_deg),sqrt(3))"
5444 };
5445
5446 static const std::size_t expression_string_size = sizeof(expression_string) / sizeof(std::string);
5447
5448 {
5449 T x_deg = T(30);
5450 T y_deg = T(60);
5451
5452 sine_deg <T> sine;
5453 cosine_deg<T> cosine;
5454
5455 symbol_table_t symbol_table_0;
5456 symbol_table_t symbol_table_1;
5457
5458 symbol_table_0.add_variable("x_deg",x_deg);
5459 symbol_table_1.add_variable("y_deg",y_deg);
5460
5461 symbol_table_0.add_function( "sine_deg", sine);
5462 symbol_table_1.add_function("cosine_deg", cosine);
5463
5464 expression_t expression;
5465
5466 expression.register_symbol_table(symbol_table_0);
5467 expression.register_symbol_table(symbol_table_1);
5468
5469 static const std::size_t rounds = 100;
5470
5471 for (std::size_t i = 0; i < rounds; ++i)
5472 {
5473 for (std::size_t j = 0; j < expression_string_size; ++j)
5474 {
5475 const std::string& expr_str = expression_string[j];
5476
5477 {
5478 parser_t parser;
5479
5480 parser.replace_symbol("sin", "sine_deg");
5481 parser.replace_symbol("cos", "cosine_deg");
5482
5483 if (!parser.compile(expr_str,expression))
5484 {
5485 printf("run_test13() - Error: %s Expression: %s [1]\n",
5486 parser.error().c_str(),
5487 expr_str.c_str());
5488
5489 return false;
5490 }
5491 }
5492
5493 if (T(1) != expression.value())
5494 {
5495 printf("run_test13() - Error in evaluation! Expression: %s [1]\n",expr_str.c_str());
5496 return false;
5497 }
5498 }
5499 }
5500 }
5501
5502 {
5503 T x_deg = T(30);
5504 T y_deg = T(60);
5505
5506 sine_deg <T> sine;
5507 cosine_deg<T> cosine;
5508
5509 symbol_table_t symbol_table_0;
5510 symbol_table_t symbol_table_1;
5511
5512 symbol_table_0.add_variable("x_deg",x_deg);
5513 symbol_table_1.add_variable("y_deg",y_deg);
5514
5515 symbol_table_0.add_reserved_function("sin", sine);
5516 symbol_table_1.add_reserved_function("cos",cosine);
5517
5518 expression_t expression;
5519
5520 expression.register_symbol_table(symbol_table_0);
5521 expression.register_symbol_table(symbol_table_1);
5522
5523 static const std::size_t rounds = 100;
5524
5525 for (std::size_t i = 0; i < rounds; ++i)
5526 {
5527 for (std::size_t j = 0; j < expression_string_size; ++j)
5528 {
5529 const std::string& expr_str = expression_string[j];
5530
5531 {
5532 typedef typename parser_t::settings_store settings_t;
5533
5534 parser_t parser;
5535
5536 parser.settings()
5537 .disable_base_function(settings_t::e_bf_sin)
5538 .disable_base_function(settings_t::e_bf_cos);
5539
5540 if (!parser.compile(expr_str,expression))
5541 {
5542 printf("run_test13() - Error: %s Expression: %s [2]\n",
5543 parser.error().c_str(),
5544 expr_str.c_str());
5545
5546 return false;
5547 }
5548 }
5549
5550 if (T(1) != expression.value())
5551 {
5552 printf("run_test13() - Error in evaluation! Expression: %s [2]\n",expr_str.c_str());
5553 return false;
5554 }
5555 }
5556 }
5557 }
5558
5559 return true;
5560}
5561
5562template <typename Allocator,
5563 template <typename,typename> class Sequence>
5564inline std::size_t load_expressions(const std::string& file_name,
5565 Sequence<std::string,Allocator>& sequence)
5566{
5567 std::ifstream stream(file_name.c_str());
5568
5569 if (!stream) return 0;
5570
5571 std::string buffer;
5572 buffer.reserve(1024);
5573
5574 std::size_t line_count = 0;
5575
5576 while (std::getline(stream,(buffer)))
5577 {
5578 if (buffer.empty())
5579 continue;
5580 else if ('#' == buffer[0])
5581 continue;
5582
5583 ++line_count;
5584 sequence.push_back(buffer);
5585 }
5586
5587 return line_count;
5588}
5589
5590template <typename T>
5591inline T isnan(const T t)
5592{
5593 return std::isnan(static_cast<double>(t)) ? T(1) : T(0);
5594}
5595
5596template <typename T>
5598{
5599 typedef exprtk::expression<T> expression_t;
5600 typedef exprtk::parser<T> parser_t;
5601 typedef typename parser_t::settings_store settings_t;
5602
5603 T x = T(0);
5604 T y = T(0);
5605 T z = T(0);
5606 T w = T(0);
5607
5620
5621 exprtk::rtl::vecops::package<T> vector_package;
5622
5623 exprtk::symbol_table<T> symbol_table;
5624 symbol_table.add_constants();
5625 symbol_table.add_variable("x",x);
5626 symbol_table.add_variable("y",y);
5627 symbol_table.add_variable("z",z);
5628 symbol_table.add_variable("w",w);
5629 symbol_table.add_function("poly01", poly01);
5630 symbol_table.add_function("poly02", poly02);
5631 symbol_table.add_function("poly03", poly03);
5632 symbol_table.add_function("poly04", poly04);
5633 symbol_table.add_function("poly05", poly05);
5634 symbol_table.add_function("poly06", poly06);
5635 symbol_table.add_function("poly07", poly07);
5636 symbol_table.add_function("poly08", poly08);
5637 symbol_table.add_function("poly09", poly09);
5638 symbol_table.add_function("poly10", poly10);
5639 symbol_table.add_function("poly11", poly11);
5640 symbol_table.add_function("poly12", poly12);
5641 symbol_table.add_function("isnan" , isnan );
5642
5643 symbol_table.add_package(vector_package);
5644
5645 expression_t expression;
5646 expression.register_symbol_table(symbol_table);
5647
5648 exprtk::parser<T> parser;
5649
5650 static const std::size_t secondary_compile_options =
5651 settings_t::e_replacer +
5652 settings_t::e_joiner +
5653 settings_t::e_numeric_check +
5654 settings_t::e_bracket_check +
5655 settings_t::e_sequence_check +
5656 settings_t::e_strength_reduction;
5657
5658 const settings_t settings(secondary_compile_options);
5659 parser_t secondary_parser(settings);
5660
5661 std::deque<std::string> expr_str_list;
5662 std::deque<std::string> expr_noncomm_str_list;
5663
5664 load_expressions("exprtk_functional_test.txt" , expr_str_list);
5665 load_expressions("exprtk_functional_ext_test.txt" , expr_str_list);
5666
5667 if (expr_str_list.empty())
5668 {
5669 return true;
5670 }
5671
5672 load_expressions("exprtk_noncommutative_test.txt" , expr_noncomm_str_list);
5673
5674 std::deque<exprtk::expression<T> > expression_list;
5675 bool error_found = false;
5676
5677 static const std::size_t rounds = 5;
5678
5679 for (std::size_t r = 0; r < rounds; ++r)
5680 {
5681 for (std::size_t i = 0; i < expr_str_list.size(); ++i)
5682 {
5683 exprtk::expression<T> current_expression;
5684
5685 current_expression.register_symbol_table(symbol_table);
5686
5687 if (!parser.compile(expr_str_list[i],current_expression))
5688 {
5689 printf("run_test14() - Error: %s Expression: %s\n",
5690 parser.error().c_str(),
5691 expr_str_list[i].c_str());
5692
5693 error_found = true;
5694 }
5695 else
5696 {
5697 expression_list.push_back(current_expression);
5698 }
5699 }
5700
5701 for (std::size_t i = 0; i < expr_noncomm_str_list.size(); ++i)
5702 {
5703 exprtk::expression<T> current_expression;
5704
5705 current_expression.register_symbol_table(symbol_table);
5706
5707 if (!secondary_parser.compile(expr_noncomm_str_list[i],current_expression))
5708 {
5709 printf("run_test14() - Error: %s Expression: %s [secondary parser]\n",
5710 secondary_parser.error().c_str(),
5711 expr_noncomm_str_list[i].c_str());
5712
5713 error_found = true;
5714 }
5715 }
5716
5717 if (error_found)
5718 {
5719 break;
5720 }
5721
5722 for (std::size_t i = 0; i < expression_list.size(); ++i)
5723 {
5724 const T result = expression_list[i].value();
5725
5726 if (result != T(1))
5727 {
5728 error_found = true;
5729
5730 printf("run_test14() - Error with evaluation of expression: %s\n",
5731 expr_str_list[i].c_str());
5732 }
5733 }
5734
5735 expression_list.clear();
5736
5737 if (error_found)
5738 {
5739 break;
5740 }
5741 }
5742
5743 return !error_found;
5744}
5745
5746template <typename T>
5748{
5749 typedef exprtk::expression<T> expression_t;
5750
5751 T x = T(1.1);
5752 T y = T(2.2);
5753 T z = T(3.3);
5754
5755 exprtk::symbol_table<T> symbol_table;
5756 symbol_table.add_constants();
5757 symbol_table.add_variable("x",x);
5758 symbol_table.add_variable("y",y);
5759 symbol_table.add_variable("z",z);
5760
5761 static const std::string expr_str_list[] =
5762 {
5763 "2 - (x + y) / z//Comment 01 ",
5764 "2 - (x + y) / z#Comment 02 ",
5765 "2 - (x + y) / z //Comment 03 ",
5766 "2 - (x + y) / z #Comment 04 ",
5767 "2 - (x + y) / z//Comment 05 \n",
5768 "2 - (x + y) / z#Comment 06 \n",
5769 "2 - (x + y) / z //Comment 07\n",
5770 "2 - (x + y) / z #Comment 08 \n",
5771 "/* Comment 09*/2 - (x + y) / z",
5772 "/* Comment 10*/2 - (x + y) / z\n",
5773 "/* Comment 11*/2 - (x + y) / z/* Comment 12*/",
5774 "/* Comment 13*/2 - (x + y) / z/* Comment 14*/\n",
5775 "2 - /* Comment 15 */(x + y) / z",
5776 "2 - /* Comment 16 */(x + y) /* Comment 17 *// z \n",
5777 "2 - /* Comment 18 */(x + y) /* Comment 19 */ / z //Comment 20\n",
5778 "2 - /* Comment 21 */(x + y) /* Comment 22 */ / z #Comment 23\n",
5779 "2 - /* Comment 24 */(x + y) /* Comment 25 */ / z //Comment 26",
5780 "2 - /* Comment 27 */(x + y) /* Comment 28 */ / z #Comment 29"
5781 };
5782 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5783
5784 std::deque<expression_t> expression_list;
5785
5786 for (std::size_t i = 0; i < expr_str_list_size; ++i)
5787 {
5788 expression_t expression;
5789 expression.register_symbol_table(symbol_table);
5790
5791 exprtk::parser<T> parser;
5792
5793 if (!parser.compile(expr_str_list[i],expression))
5794 {
5795 printf("run_test15() - Error: %s Expression: %s\n",
5796 parser.error().c_str(),
5797 expr_str_list[i].c_str());
5798
5799 return false;
5800 }
5801 else
5802 expression_list.push_back(expression);
5803 }
5804
5805 expression_t base_expression;
5806 const std::string base_expr_str = "2 - (x + y) / z";
5807
5808 {
5809 base_expression.register_symbol_table(symbol_table);
5810
5811 exprtk::parser<T> parser;
5812
5813 if (!parser.compile(base_expr_str,base_expression))
5814 {
5815 printf("run_test15() - Error: %s Expression: %s\n",
5816 parser.error().c_str(),
5817 base_expr_str.c_str());
5818
5819 return false;
5820 }
5821 }
5822
5823 bool error_found = false;
5824
5825 for (std::size_t i = 0; i < expression_list.size(); ++i)
5826 {
5827 T base_result = base_expression.value();
5828 T result = expression_list[i].value();
5829
5830 if (not_equal(base_result,result))
5831 {
5832 printf("run_test15() - Error in evaluation! (1) Base: %20.10f\tResult: %20.10f\tExpression: %s\n",
5833 static_cast<double>(base_result),
5834 static_cast<double>(result),
5835 expr_str_list[i].c_str());
5836
5837 error_found = true;
5838 }
5839 }
5840
5841 return !error_found;
5842}
5843
5844template <typename T>
5845struct base_func : public exprtk::ifunction<T>
5846{
5847 using exprtk::ifunction<T>::operator();
5848
5849 typedef const T& type;
5850 base_func(const std::size_t& n) : exprtk::ifunction<T>(n) {}
5851 inline T operator()(type v0, type v1, type v2, type v3, type v4) exprtk_test_override { return (v0 + v1 + v2 + v3 + v4); }
5852 inline T operator()(type v0, type v1, type v2, type v3) exprtk_test_override { return (v0 + v1 + v2 + v3); }
5853 inline T operator()(type v0, type v1, type v2) exprtk_test_override { return (v0 + v1 + v2); }
5854 inline T operator()(type v0, type v1) exprtk_test_override { return (v0 + v1); }
5855 inline T operator()(type v0) exprtk_test_override { return v0; }
5856 inline T operator()() exprtk_test_override { return T(1.1234); }
5857};
5858
5859template <typename T> struct test_func5 exprtk_test_final : public base_func<T> { test_func5() : base_func<T>(5){} };
5860template <typename T> struct test_func4 exprtk_test_final : public base_func<T> { test_func4() : base_func<T>(4){} };
5861template <typename T> struct test_func3 exprtk_test_final : public base_func<T> { test_func3() : base_func<T>(3){} };
5862template <typename T> struct test_func2 exprtk_test_final : public base_func<T> { test_func2() : base_func<T>(2){} };
5863template <typename T> struct test_func1 exprtk_test_final : public base_func<T> { test_func1() : base_func<T>(1){} };
5864template <typename T> struct test_func0 exprtk_test_final : public base_func<T> { test_func0() : base_func<T>(0){} };
5865
5866template <typename T>
5868{
5869 typedef exprtk::expression<T> expression_t;
5870
5871 T x = T(1.1);
5872 T y = T(2.2);
5873 T z = T(3.3);
5874 T w = T(4.4);
5875 T u = T(5.5);
5876
5877 test_func0<T> test_func00;
5878 test_func1<T> test_func01;
5879 test_func2<T> test_func02;
5880 test_func3<T> test_func03;
5881 test_func4<T> test_func04;
5882 test_func5<T> test_func05;
5883
5884 exprtk::symbol_table<T> symbol_table;
5885 symbol_table.add_constants();
5886 symbol_table.add_variable("x",x);
5887 symbol_table.add_variable("y",y);
5888 symbol_table.add_variable("z",z);
5889 symbol_table.add_variable("w",w);
5890 symbol_table.add_variable("u",u);
5891
5892 symbol_table.add_function("test_func0",test_func00);
5893 symbol_table.add_function("test_func1",test_func01);
5894 symbol_table.add_function("test_func2",test_func02);
5895 symbol_table.add_function("test_func3",test_func03);
5896 symbol_table.add_function("test_func4",test_func04);
5897 symbol_table.add_function("test_func5",test_func05);
5898
5899 static const std::string expr_str_list[] =
5900 {
5901 "test_func0 = test_func0()",
5902 "test_func0 == test_func0()",
5903 "equal(1.1 + test_func0,test_func0() + 1.1)",
5904 "equal(test_func0 + 1.1,1.1 + test_func0())",
5905 "equal((1.1 + test_func0),(test_func0() + 1.1))",
5906 "equal((test_func0 + 1.1),(1.1 + test_func0()))",
5907 "equal(test_func0,test_func0())",
5908 "equal(test_func0,1.1234)",
5909 "equal(test_func0(),1.1234)",
5910 "equal(test_func0 + test_func0(),2 * 1.1234)",
5911 "equal((test_func0 + test_func0()),2 * 1.1234)",
5912 "equal((test_func0) + (test_func0()),2 * 1.1234)",
5913 "equal(test_func1(x),(x))",
5914 "equal(test_func2(x,y),(x + y))",
5915 "equal(test_func3(x,y,z),(x + y + z))",
5916 "equal(test_func4(x,y,z,w),(x + y + z + w))",
5917 "equal(test_func5(x,y,z,w,u),(x + y + z + w + u))",
5918 "equal(1.1 + test_func0,1.1234 + 1.1)",
5919 "equal(1.1 + test_func0(),1.1234 + 1.1)",
5920 "equal(1.1 + test_func1(x),(x + 1.1))",
5921 "equal(1.1 + test_func2(x,y),(x + y + 1.1))",
5922 "equal(1.1 + test_func3(x,y,z),(x + y + z + 1.1))",
5923 "equal(1.1 + test_func4(x,y,z,w),(x + y + z + w + 1.1))",
5924 "equal(1.1 + test_func5(x,y,z,w,u),(x + y + z + w + u + 1.1))",
5925 "equal(test_func0 + 2.2,1.1234 + 2.2)",
5926 "equal(test_func0() + 2.2,1.1234 + 2.2)",
5927 "equal(test_func1(x) + 2.2,(x + 2.2))",
5928 "equal(test_func2(x,y) + 2.2,(x + y + 2.2))",
5929 "equal(test_func3(x,y,z) + 2.2,(x + y + z + 2.2))",
5930 "equal(test_func4(x,y,z,w) + 2.2,(x + y + z + w + 2.2))",
5931 "equal(test_func5(x,y,z,w,u) + 2.2,(x + y + z + w + u + 2.2))",
5932 "equal({[test_func1(x)]},{[(x)]})",
5933 "equal({[test_func2(x,y)]},{[(x + y)]})",
5934 "equal({[test_func3(x,y,z)]},{[(x + y + z)]})",
5935 "equal({[test_func4(x,y,z,w)]},{[(x + y + z + w)]})",
5936 "equal({[test_func5(x,y,z,w,u)]},{[(x + y + z + w + u)]})",
5937 "equal(test_func1(2.12),(2.12))",
5938 "equal(test_func2(2.12,3.12),(2.12 + 3.12))",
5939 "equal(test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12))",
5940 "equal(test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12))",
5941 "equal(test_func5(2.12,3.12,4.12,5.12,6.12),(2.12 + 3.12 + 4.12 + 5.12 + 6.12))",
5942 "equal(1.1 + test_func1(2.12),(2.12 + 1.1))",
5943 "equal(1.1 + test_func2(2.12,3.12),(2.12 + 3.12 + 1.1))",
5944 "equal(1.1 + test_func3(2.12,3.12,4.12),(2.12 + 3.12 + 4.12 + 1.1))",
5945 "equal(1.1 + test_func4(2.12,3.12,4.12,5.12),(2.12 + 3.12 + 4.12 + 5.12 + 1.1))",
5946 "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))",
5947 "equal(test_func1(2.12) + 2.2,(2.12 + 2.2))",
5948 "equal(test_func2(2.12,3.12) + 2.2,(2.12 + 3.12 + 2.2))",
5949 "equal(test_func3(2.12,3.12,4.12) + 2.2,(2.12 + 3.12 + 4.12 + 2.2))",
5950 "equal(test_func4(2.12,3.12,4.12,5.12) + 2.2,(2.12 + 3.12 + 4.12 + 5.12 + 2.2))",
5951 "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))",
5952 "equal({[test_func1(2.12)]},{[(2.12)]})",
5953 "equal({[test_func2(2.12,3.12)]},{[(2.12 + 3.12)]})",
5954 "equal({[test_func3(2.12,3.12,4.12)]},{[(2.12 + 3.12 + 4.12)]})",
5955 "equal({[test_func4(2.12,3.12,4.12,5.12)]},{[(2.12 + 3.12 + 4.12 + 5.12)]})",
5956 "equal({[test_func5(2.12,3.12,4.12,5.12,6.12)]},{[(2.12 + 3.12 + 4.12 + 5.12 + 6.12)]})",
5957 "TeSt_FuNc0 = tEsT_fUnC0()",
5958 "TEst_fuNC0 == tESt_fUNc0()",
5959 "EquaL(tEsT_FuNC1(x),(x))",
5960 "eQuAl(teSt_fUnc2(x,y),(x + y))",
5961 "EqUaL(tEsT_fUNc3(x,y,z),(x + y + z))",
5962 "EQUal(TEst_FunC4(x,y,z,w),(x + y + z + w))",
5963 "eqUAL(tEsT_FuNc5(x,y,z,w,u),(x + y + z + w + u))"
5964 };
5965 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
5966
5967 std::deque<expression_t> expression_list;
5968
5969 for (std::size_t i = 0; i < expr_str_list_size; ++i)
5970 {
5971 expression_t expression;
5972 expression.register_symbol_table(symbol_table);
5973
5974 exprtk::parser<T> parser;
5975
5976 if (!parser.compile(expr_str_list[i],expression))
5977 {
5978 printf("run_test16() - Error: %s Expression: %s\n",
5979 parser.error().c_str(),
5980 expr_str_list[i].c_str());
5981
5982 return false;
5983 }
5984 else
5985 expression_list.push_back(expression);
5986 }
5987
5988 bool error_found = false;
5989
5990 for (std::size_t i = 0; i < expression_list.size(); ++i)
5991 {
5992 if (T(1) != expression_list[i].value())
5993 {
5994 printf("run_test16() - Error in evaluation! (1) Expression: %s\n",
5995 expr_str_list[i].c_str());
5996
5997 error_found = true;
5998 }
5999 }
6000
6001 return !error_found;
6002}
6003
6004template <typename T>
6006{
6007 typedef exprtk::expression<T> expression_t;
6008
6009 T x = T(1.1);
6010 T y = T(2.2);
6011 T z = T(3.3);
6012 T w = T(4.4);
6013 T u = T(5.5);
6014 T v = T(6.6);
6015 T t = T(7.7);
6016
6017 T one = T(1);
6018 T zero = T(0);
6019
6020 exprtk::symbol_table<T> symbol_table;
6021 symbol_table.add_constants();
6022 symbol_table.add_variable("x",x);
6023 symbol_table.add_variable("y",y);
6024 symbol_table.add_variable("z",z);
6025 symbol_table.add_variable("w",w);
6026 symbol_table.add_variable("u",u);
6027 symbol_table.add_variable("v",v);
6028 symbol_table.add_variable("t",t);
6029
6030 symbol_table.add_variable("one",one);
6031 symbol_table.add_variable("zero",zero);
6032
6033 static const std::string expr_str_list[] =
6034 {
6035 "equal(mand(one,one),1.0)",
6036 "equal(mand(one,zero),0.0)",
6037 "equal(mand(zero,one),0.0)",
6038 "equal(mand(zero,zero),0.0)",
6039 "equal(mand(one,one),1.0)",
6040 "equal(mand(one,one,one),1.0)",
6041 "equal(mand(one,one,one,one),1.0)",
6042 "equal(mand(one,one,one,one,one),1.0)",
6043 "equal(mand(one,one,zero),0.0)",
6044 "equal(mand(one,one,one,zero),0.0)",
6045 "equal(mand(one,one,one,one,zero),0.0)",
6046 "equal(mand(one,one,one,one,one,zero),0.0)",
6047 "equal(mor(one,one),1.0)",
6048 "equal(mor(one,zero),1.0)",
6049 "equal(mor(zero,one),1.0)",
6050 "equal(mor(zero,zero),0.0)",
6051 "equal(mor(one,one),1.0)",
6052 "equal(mor(one,one,zero),1.0)",
6053 "equal(mor(one,zero,one),1.0)",
6054 "equal(mor(one,zero,one,zero),1.0)",
6055 "equal(mor(zero,one),1.0)",
6056 "equal(mor(zero,zero,one),1.0)",
6057 "equal(mor(zero,zero,zero,zero,one),1.0)",
6058 "equal(mor(zero,zero,zero,zero,zero,one),1.0)",
6059 "equal(mor(zero,zero,zero,zero,zero,zero,zero,zero),0.0)",
6060 "equal((one nand one),not(mand(one,one)))",
6061 "equal((one nand zero),not(mand(one,zero)))",
6062 "equal((zero nand one),not(mand(zero,one)))",
6063 "equal((zero nand zero),not(mand(zero,zero)))",
6064 "equal((one nor one),not(mor(one,one)))",
6065 "equal((one nor zero),not(mor(one,zero)))",
6066 "equal((zero nor one),not(mor(zero,one)))",
6067 "equal((zero nor zero),not(mor(zero,zero)))",
6068 "equal(sum(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
6069 "equal(sum(x+t,y+v,z+u,w+w,u+z,v+y,t+x),2*(x+y+z+w+u+v+t))",
6070 "equal(mul(x,y,z,w,u,v,t),(x*y*z*w*u*v*t))",
6071 "equal(mul(x*t,y*v,z*u,w*w,u*z,v*y,t*x),(x*y*z*w*u*v*t)^2)",
6072 "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))",
6073 "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))",
6074 "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))",
6075 "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))",
6076 "equal(min(x,y,z,w,u,v,t,zero),zero)",
6077 "equal(min(x+y,z+w,u+v,t,zero),zero)",
6078 "equal(max(one,x,y,z,w,u,v,t),t)",
6079 "equal(max(x+y,z+w,u+v,t,one),u+v)",
6080 "equal(avg(x,y,z,w,u,v,t),(x+y+z+w+u+v+t)/7.0)",
6081 "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))"
6082 };
6083 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6084
6085 std::deque<expression_t> expression_list;
6086
6087 for (std::size_t i = 0; i < expr_str_list_size; ++i)
6088 {
6089 expression_t expression;
6090 expression.register_symbol_table(symbol_table);
6091
6092 exprtk::parser<T> parser;
6093
6094 if (!parser.compile(expr_str_list[i],expression))
6095 {
6096 printf("run_test17() - Error: %s Expression: %s\n",
6097 parser.error().c_str(),
6098 expr_str_list[i].c_str());
6099
6100 return false;
6101 }
6102 else
6103 expression_list.push_back(expression);
6104 }
6105
6106 bool error_found = false;
6107
6108 for (std::size_t i = 0; i < expression_list.size(); ++i)
6109 {
6110 if (T(1) != expression_list[i].value())
6111 {
6112 printf("run_test17() - Error in evaluation! (1) Expression: %s\n",
6113 expr_str_list[i].c_str());
6114
6115 error_found = true;
6116 }
6117 }
6118
6119 return !error_found;
6120}
6121
6122template <typename T>
6124{
6126 {
6128 exprtk::set_min_num_args(*this, 0);
6129 exprtk::set_max_num_args(*this, 20);
6130 }
6131
6132 inline T operator()(const std::vector<T>& arglist) exprtk_test_override
6133 {
6134 T result = T(0);
6135
6136 for (std::size_t i = 0; i < arglist.size(); ++i)
6137 {
6138 result += arglist[i];
6139 }
6140
6141 return result;
6142 }
6143};
6144
6145template <typename T>
6147{
6150
6154
6155 using exprtk::igeneric_function<T>::operator();
6156
6158 : scalar_count(0)
6159 , vector_count(0)
6160 , string_count(0)
6161 {}
6162
6164 {
6165 for (std::size_t i = 0; i < params.size(); ++i)
6166 {
6167 generic_type& gt = params[i];
6168
6169 switch (gt.type)
6170 {
6172 break;
6173
6175 break;
6176
6177 case generic_type::e_string : {
6178 if (
6179 ("CdEf" != exprtk::to_str(string_t(gt))) &&
6180 ("abc123" != exprtk::to_str(string_t(gt)))
6181 )
6182 {
6183 return std::numeric_limits<T>::quiet_NaN();
6184 }
6185 else
6186 string_count++;
6187 }
6188 break;
6189
6190 default : return std::numeric_limits<T>::quiet_NaN();
6191 }
6192 }
6193
6194 return T(0);
6195 }
6196
6197 std::size_t scalar_count;
6198 std::size_t vector_count;
6199 std::size_t string_count;
6200};
6201
6202template <typename T>
6204{
6206
6207 using exprtk::igeneric_function<T>::operator();
6208
6210 {}
6211
6213 {
6214 return T(0);
6215 }
6216
6217 inline T operator()(const std::size_t&, parameter_list_t params) exprtk_test_override
6218 {
6219 return this->operator()(params);
6220 }
6221};
6222
6223template <typename T>
6225{
6228
6232
6233 using exprtk::igeneric_function<T>::operator();
6234
6236 {}
6237
6239 {
6240 for (std::size_t i = 0; i < params.size(); ++i)
6241 {
6242 generic_type& gt = params[i];
6243
6244 switch (gt.type)
6245 {
6246 case generic_type::e_scalar : {
6247 scalar_t scalar(gt);
6248 scalar() += T(1);
6249 }
6250 break;
6251
6252 case generic_type::e_vector : {
6253 vector_t vector(gt);
6254
6255 for (std::size_t x = 0; x < vector.size(); ++x)
6256 {
6257 vector[x] += T(1);
6258 }
6259 }
6260 break;
6261
6262 case generic_type::e_string : {
6263 string_t string(gt);
6264
6265 for (std::size_t x = 0; x < string.size(); ++x)
6266 {
6267 string[x] += static_cast<typename string_t::value_t>(1);
6268 }
6269 }
6270 break;
6271
6272 default : return std::numeric_limits<T>::quiet_NaN();
6273 }
6274 }
6275
6276 return T(0);
6277 }
6278
6279 inline T operator()(const std::size_t&, parameter_list_t params) exprtk_test_override
6280 {
6281 return this->operator()(params);
6282 }
6283};
6284
6285template <typename T>
6287{
6292
6293 using exprtk::igeneric_function<T>::operator();
6294
6298
6299 inline T operator()(std::string& result, parameter_list_t params) exprtk_test_override
6300 {
6301 string_t string(params[0]);
6302
6303 result.reserve(string.size());
6304 result.clear();
6305
6306 char c;
6307
6308 for (std::size_t i = 0; i < string.size(); ++i)
6309 {
6310 if (' ' != (c = string[i]))
6311 result += static_cast<char>(std::toupper(c));
6312 }
6313
6314 return T(0);
6315 }
6316
6317 inline T operator()(const std::size_t& param_seq_index, std::string& result, parameter_list_t params) exprtk_test_override
6318 {
6319 if (1 == param_seq_index)
6320 return this->operator()(result,params);
6321 else
6322 return T(0);
6323 }
6324};
6325
6326template <typename T>
6328{
6331
6334
6337
6338 using exprtk::igeneric_function<T>::operator();
6339
6341 : exprtk::igeneric_function<T>("Z|T*|V")
6342 {}
6343
6344 inline T operator()(const std::size_t& ps_index, parameter_list_t /*arglist*/) exprtk_test_override
6345 {
6346 switch (ps_index)
6347 { // Overload resolution:
6348 case 0 : return T(0); // Z - Zero arguments
6349 case 1 : return T(1); // T* - One or more scalars
6350 case 2 : return T(2); // V - One vector
6351 default : return std::numeric_limits<T>::quiet_NaN();
6352 }
6353 }
6354};
6355
6356template <typename T>
6358{
6361
6364
6366
6367 using exprtk::igeneric_function<T>::operator();
6368
6370 : exprtk::igeneric_function<T>("V")
6371 {}
6372
6374 {
6375 vector_t v(params[0]);
6376 return std::accumulate(v.begin(), v.end(), T(0));
6377 }
6378};
6379
6380template <typename T>
6382{
6387
6388 using exprtk::igeneric_function<T>::operator();
6389
6390 overload_func(const std::string& param_seq_list)
6391 : exprtk::igeneric_function<T>(param_seq_list, igfun_t::e_rtrn_overload)
6392 , current_ps_index(std::numeric_limits<std::size_t>::max())
6393 {
6394 clear();
6395 }
6396
6397 void clear()
6398 {
6399 current_ps_index = std::numeric_limits<std::size_t>::max();
6400 current_param_seq = "";
6401 }
6402
6403 inline T operator()(const std::size_t& ps_index,
6405 {
6406 current_ps_index = ps_index;
6407 determine_param_seq(parameters);
6408 return T(1);
6409 }
6410
6411 inline T operator()(const std::size_t& ps_index,
6412 std::string& result,
6414 {
6415 current_ps_index = ps_index;
6416 determine_param_seq(parameters);
6417 result = "string result";
6418 return T(1);
6419 }
6420
6422 {
6423 current_param_seq = "";
6424
6425 for (std::size_t i = 0; i < parameters.size(); ++i)
6426 {
6427 generic_type& gt = parameters[i];
6428
6429 switch (gt.type)
6430 {
6432 break;
6433
6435 break;
6436
6438 break;
6439
6440 default : continue;
6441 }
6442 }
6443 }
6444
6445 std::size_t current_ps_index;
6446 std::string current_param_seq;
6447
6448 struct test_result_t
6449 {
6450 test_result_t(const std::size_t psi, const std::string& ps)
6451 : ps_index(psi)
6452 , param_seq(ps)
6453 {}
6454
6455 std::size_t ps_index;
6456 std::string param_seq;
6457 };
6458};
6459
6461{
6463 {
6464 rtc_count++;
6465 return false;
6466 }
6467
6468 std::size_t rtc_count;
6469};
6470
6471template <typename T>
6473{
6474 {
6475 exprtk::symbol_table<T> symbol_table;
6476 symbol_table.remove_variable("x",true);
6477 symbol_table.remove_variable("x",false);
6478 symbol_table.remove_stringvar("x");
6479 symbol_table.remove_function("x");
6480 symbol_table.remove_vararg_function("x");
6481 symbol_table.remove_vector("x");
6482 }
6483
6484 {
6485 exprtk::symbol_table<T> symbol_table;
6486
6487 {
6488 T x;
6489 const bool result1 = symbol_table.add_variable("x", x);
6490 const bool result2 = symbol_table.remove_variable("x");
6491 const bool result3 = symbol_table.remove_variable("x");
6492
6493 if (!result1 || !result2 || result3)
6494 {
6495 printf("run_test18() - Failed sym_tab add/remove [1]\n");
6496 }
6497 }
6498
6499 {
6500 std::string x;
6501 const bool result1 = symbol_table.add_stringvar("x", x);
6502 const bool result2 = symbol_table.remove_stringvar("x");
6503 const bool result3 = symbol_table.remove_stringvar("x");
6504
6505 if (!result1 || !result2 || result3)
6506 {
6507 printf("run_test18() - Failed sym_tab add/remove [2]\n");
6508 }
6509 }
6510
6511 {
6512 std::vector<T> x(10,T(0));
6513 const bool result1 = symbol_table.add_vector("x", x);
6514 const bool result2 = symbol_table.remove_vector("x");
6515 const bool result3 = symbol_table.remove_vector("x");
6516
6517 if (!result1 || !result2 || result3)
6518 {
6519 printf("run_test18() - Failed sym_tab add/remove [3]\n");
6520 }
6521 }
6522
6523 {
6524 myfunc<T> x;
6525 const bool result1 = symbol_table.add_function("x", x);
6526 const bool result2 = symbol_table.remove_function("x");
6527 const bool result3 = symbol_table.remove_function("x");
6528
6529 if (!result1 || !result2 || result3)
6530 {
6531 printf("run_test18() - Failed sym_tab add/remove [4]\n");
6532 }
6533 }
6534
6535 {
6536 va_func<T> x;
6537 const bool result1 = symbol_table.add_function("x", x);
6538 const bool result2 = symbol_table.remove_vararg_function("x");
6539 const bool result3 = symbol_table.remove_vararg_function("x");
6540
6541 if (!result1 || !result2 || result3)
6542 {
6543 printf("run_test18() - Failed sym_tab add/remove [5]\n");
6544 }
6545 }
6546
6547 {
6548 symbol_table.add_function("foo1",foo1);
6549 symbol_table.add_function("foo2",foo2);
6550 symbol_table.add_function("foo3",foo3);
6551 symbol_table.add_function("foo4",foo4);
6552 symbol_table.add_function("foo5",foo5);
6553 symbol_table.add_function("foo6",foo6);
6554
6555 symbol_table.remove_function("foo1");
6556 symbol_table.remove_function("foo2");
6557 symbol_table.remove_function("foo3");
6558 symbol_table.remove_function("foo4");
6559 symbol_table.remove_function("foo5");
6560 symbol_table.remove_function("foo6");
6561 }
6562 }
6563
6564 {
6565 typedef exprtk::expression<T> expression_t;
6566
6567 T x = T(1.1);
6568 T y = T(2.2);
6569 T z = T(3.3);
6570 T w = T(4.4);
6571 T u = T(5.5);
6572 T v = T(6.6);
6573 T t = T(7.7);
6574
6575 va_func<T> vaf;
6576
6577 exprtk::symbol_table<T> symbol_table;
6578 symbol_table.add_constants();
6579 symbol_table.add_variable("x",x);
6580 symbol_table.add_variable("y",y);
6581 symbol_table.add_variable("z",z);
6582 symbol_table.add_variable("w",w);
6583 symbol_table.add_variable("u",u);
6584 symbol_table.add_variable("v",v);
6585 symbol_table.add_variable("t",t);
6586 symbol_table.add_function("va_func",vaf);
6587
6588 static const std::string expr_str_list[] =
6589 {
6590 "equal(va_func,(0))",
6591 "equal(va_func(),(0))",
6592 "equal(va_func(1,2,3,4,5,6,7,8,9),(1+2+3+4+5+6+7+8+9))",
6593 "equal(va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9))",
6594 "equal(va_func(x,2,y,4,z,6,w,8,u),(x+2+y+4+z+6+w+8+u))",
6595 "equal(va_func(x,y,z,w,u,v,t,1,2,3),(x+y+z+w+u+v+t+1+2+3))",
6596 "equal(va_func(x,y,z,w,u,v,t),(x+y+z+w+u+v+t))",
6597 "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))",
6598 "equal(1+va_func(1,x,3,y,5,z,7,w,9),(1+x+3+y+5+z+7+w+9)+1)",
6599 "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))",
6600 "equal(va_func(va_func(x),va_func(y),va_func(z)),va_func(x,y,z))",
6601 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x)))))))),x)",
6602 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(123.456)))))))),123.456)",
6603 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+1)))))))),x+1)",
6604 "equal(va_func(va_func(va_func(va_func(va_func(va_func(va_func(va_func(x+y)))))))),x+y)"
6605 };
6606 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
6607
6608 std::deque<expression_t> expression_list;
6609
6610 for (std::size_t i = 0; i < expr_str_list_size; ++i)
6611 {
6612 expression_t expression;
6613 expression.register_symbol_table(symbol_table);
6614
6615 exprtk::parser<T> parser;
6616
6617 if (!parser.compile(expr_str_list[i],expression))
6618 {
6619 printf("run_test18() - [1] VarArg Error: %s Expression: %s\n",
6620 parser.error().c_str(),
6621 expr_str_list[i].c_str());
6622
6623 return false;
6624 }
6625 else
6626 expression_list.push_back(expression);
6627 }
6628
6629 bool error_found = false;
6630
6631 for (std::size_t i = 0; i < expression_list.size(); ++i)
6632 {
6633 if (T(1) != expression_list[i].value())
6634 {
6635 printf("run_test18() - Error in evaluation! (1) Expression: %s\n",
6636 expr_str_list[i].c_str());
6637
6638 error_found = true;
6639 }
6640 }
6641
6642 if (error_found)
6643 {
6644 return false;
6645 }
6646 }
6647
6648 {
6649 typedef exprtk::symbol_table<T> symbol_table_t;
6650 typedef exprtk::expression<T> expression_t;
6651 typedef exprtk::parser<T> parser_t;
6652
6653 T x = T(33);
6654 T y = T(77);
6655
6656 T v0[] = { T(1), T(1), T(1), T(1) };
6657 T v1[] = { T(1), T(2), T(3), T(4) };
6658
6659 std::vector<T> v2;
6660
6661 v2.push_back(T(5));
6662 v2.push_back(T(6));
6663 v2.push_back(T(7));
6664 v2.push_back(T(8));
6665
6666 std::string s0 = "AbCdEfGhIj";
6667
6668 gen_func<T> f;
6669
6670 symbol_table_t symbol_table;
6671
6672 symbol_table.add_constants();
6673
6674 symbol_table.add_variable ("x" , x);
6675 symbol_table.add_variable ("y" , y);
6676 symbol_table.add_vector ("v0" ,v0);
6677 symbol_table.add_vector ("v1" ,v1);
6678 symbol_table.add_vector ("v2" ,v2);
6679 symbol_table.add_stringvar("s0", s0);
6680 symbol_table.add_function ("gen_func", f);
6681
6682 const std::string expression_list[] =
6683 {
6684 "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]);",
6685 "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]);",
6686 "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);",
6687 "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);",
6688 "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]);",
6689 "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);",
6690 "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);",
6691 "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);",
6692 "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);",
6693 "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');"
6694 };
6695
6696 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6697
6698 bool error_found = false;
6699
6700 for (std::size_t i = 0; i < expression_list_size; ++i)
6701 {
6702 const std::string& expression_str = expression_list[i];
6703 expression_t expression;
6704
6705 expression.register_symbol_table(symbol_table);
6706
6707 parser_t parser;
6708
6709 if (!parser.compile(expression_str,expression))
6710 {
6711 printf("run_test18() - [2] GenFunc Error: %s Expression: %s [2]\n",
6712 parser.error().c_str(),
6713 expression_str.c_str());
6714
6715 error_found = true;
6716 continue;
6717 }
6718
6719 f.scalar_count = 0;
6720 f.vector_count = 0;
6721 f.string_count = 0;
6722
6723 expression.value();
6724
6725 if (
6726 (4 != f.scalar_count) ||
6727 (3 != f.vector_count) ||
6728 (2 != f.string_count)
6729 )
6730 {
6731 printf("run_test18() - Error in evaluation! (2) Expression: %s "
6732 "sc_count = %d "
6733 "vr_count = %d "
6734 "st_count = %d\n",
6735 expression_list[i].c_str(),
6736 static_cast<int>(f.scalar_count),
6737 static_cast<int>(f.vector_count),
6738 static_cast<int>(f.string_count));
6739
6740 error_found = true;
6741 }
6742
6743 expression.release();
6744 }
6745
6746 if (error_found)
6747 {
6748 return false;
6749 }
6750 }
6751
6752 {
6753 typedef exprtk::symbol_table<T> symbol_table_t;
6754 typedef exprtk::expression<T> expression_t;
6755 typedef exprtk::parser<T> parser_t;
6756
6757 T x = T(33);
6758 T y = T(77);
6759
6760 T v0[] = { T(1), T(1), T(1), T(1) };
6761 T v1[] = { T(1), T(2), T(3), T(4) };
6762 T v2[] = { T(5), T(6), T(7), T(8) };
6763
6764 std::string s0 = "AbCdEfGhIj";
6765
6766 gen_func2<T> f;
6767
6768 symbol_table_t symbol_table;
6769
6770 symbol_table.add_constants();
6771
6772 symbol_table.add_variable ("x" , x);
6773 symbol_table.add_variable ("y" , y);
6774 symbol_table.add_vector ("v0" ,v0);
6775 symbol_table.add_vector ("v1" ,v1);
6776 symbol_table.add_vector ("v2" ,v2);
6777 symbol_table.add_stringvar("s0", s0);
6778 symbol_table.add_function ("foo", f);
6779
6780 const std::string expression_list[] =
6781 {
6782 "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]);",
6783 "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);",
6784 "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);",
6785 "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]);",
6786 "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);",
6787 "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);",
6788 "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);",
6789 "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);",
6790 "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');",
6791 "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');",
6792 "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]);",
6793 "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]);",
6794 "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]);",
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(x);",
6797 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6798 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6799 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6800 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6801 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6802 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6803 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6804 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6805 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6806 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6807 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6808 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x);",
6809 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x);",
6810 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x);",
6811 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(x,x,x,x);",
6812 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0);",
6813 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0);",
6814 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0);",
6815 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(s0,s0,s0,s0);",
6816 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0);",
6817 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0);",
6818 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0);",
6819 "var z := 3; var w[3] := { 1/3, 1/5, 1/7 }; foo(v0,v0,v0,v0);",
6820 "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]);",
6821 "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]);",
6822 "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]);",
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 };
6825
6826 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6827
6828 const std::string parameter_type_list[] =
6829 {
6830 "VVTTTTVSS",
6831 "VTTTTVSSV",
6832 "TTTTVSSVV",
6833 "TTTVSSVVT",
6834 "TTVSSVVT*",
6835 "TVSSVVT*" ,
6836 "VSSVVT*" ,
6837 "SSVVTTTTV",
6838 "SVVTTTTVS",
6839 "SVVTTTTVS",
6840 "V*T*VS*" ,
6841 "V*TTTTVSS",
6842 "VVT*VSS" ,
6843 "VVTTTTVS*",
6844 "T*",
6845 "T*",
6846 "T*",
6847 "T*",
6848 "S*",
6849 "S*",
6850 "S*",
6851 "S*",
6852 "V*",
6853 "V*",
6854 "V*",
6855 "V*",
6856 "T",
6857 "TT",
6858 "TTT",
6859 "TTTT",
6860 "S",
6861 "SS",
6862 "SSS",
6863 "SSSS",
6864 "V",
6865 "VV",
6866 "VVV",
6867 "VVVV",
6868 "TTTTTTT|STSTSTS|V*T*VS*" ,
6869 "TTTTTTT|STSTSTS|V*TTTTVSS",
6870 "TTTTTTT|STSTSTS|VVT*VSS" ,
6871 "TTTTTTT|STSTSTS|VVTTTTVS*",
6872 };
6873
6874 bool error_found = false;
6875
6876 for (std::size_t i = 0; i < expression_list_size; ++i)
6877 {
6878 const std::string& expression_str = expression_list[i];
6879 expression_t expression;
6880
6881 expression.register_symbol_table(symbol_table);
6882
6883 parser_t parser;
6884
6885 f.parameter_sequence = parameter_type_list[i];
6886
6887 if (!parser.compile(expression_str,expression))
6888 {
6889 printf("run_test18() - [3] GenFunc2 Error: %s Expression: %s Parameter Sequence: %s [3]\n",
6890 parser.error().c_str(),
6891 expression_str.c_str(),
6892 parameter_type_list[i].c_str());
6893
6894 error_found = true;
6895 continue;
6896 }
6897
6898 expression.value();
6899 }
6900
6901 if (error_found)
6902 {
6903 return false;
6904 }
6905 }
6906
6907 {
6908 bool error_found = false;
6909
6910 const std::string expression_list[] =
6911 {
6912 "foo(v0,v1,v2,x,y,s0);",
6913 "foo(v1,v2,x,y,s0,v0);",
6914 "foo(v2,x,y,s0,v0,v1);",
6915 "foo(x,y,s0,v0,v1,v2);",
6916 "foo(y,s0,v0,v1,v2,x);",
6917 "foo(s0,v0,v1,v2,x,y);"
6918 };
6919
6920 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
6921
6922 const std::string parameter_type_list[] =
6923 {
6924 "VVVTTS",
6925 "VVTTSV",
6926 "VTTSVV",
6927 "TTSVVV",
6928 "TSVVVT",
6929 "SVVVTT"
6930 };
6931
6932 for (std::size_t i = 0; i < expression_list_size; ++i)
6933 {
6934 typedef exprtk::symbol_table<T> symbol_table_t;
6935 typedef exprtk::expression<T> expression_t;
6936 typedef exprtk::parser<T> parser_t;
6937
6938 T x = T(33);
6939 T y = T(77);
6940
6941 T v0[] = { T(1), T(1), T(1), T(1) };
6942 T v1[] = { T(1), T(2), T(3), T(4) };
6943 T v2[] = { T(5), T(6), T(7), T(8) };
6944
6945 std::string s0 = "AbCdEfGhIj";
6946
6947 T x_inc = T(34);
6948 T y_inc = T(78);
6949
6950 T v0_inc[] = { T(2), T(2), T(2), T(2) };
6951 T v1_inc[] = { T(2), T(3), T(4), T(5) };
6952 T v2_inc[] = { T(6), T(7), T(8), T(9) };
6953
6954 std::size_t sizeof_vec = sizeof(v0) / sizeof(T);
6955
6956 std::string s0_inc = "BcDeFgHiJk";
6957
6958 inc_func<T> f;
6959
6960 symbol_table_t symbol_table;
6961
6962 symbol_table.add_constants();
6963
6964 symbol_table.add_variable ("x" , x );
6965 symbol_table.add_variable ("y" , y );
6966 symbol_table.add_vector ("v0" , v0);
6967 symbol_table.add_vector ("v1" , v1);
6968 symbol_table.add_vector ("v2" , v2);
6969 symbol_table.add_stringvar("s0", s0);
6970 symbol_table.add_function ("foo", f );
6971
6972 expression_t expression;
6973
6974 expression.register_symbol_table(symbol_table);
6975
6976 parser_t parser;
6977
6978 f.parameter_sequence = parameter_type_list[i];
6979
6980 if (!parser.compile(expression_list[i],expression))
6981 {
6982 printf("run_test18() - [4] IncFunc Error: %s Expression: %s Parameter Sequence: %s [4]\n",
6983 parser.error().c_str(),
6984 expression_list[i].c_str(),
6985 parameter_type_list[i].c_str());
6986
6987 error_found = true;
6988 continue;
6989 }
6990
6991 expression.value();
6992
6993 if (x != x_inc)
6994 {
6995 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: x\n",
6996 expression_list[i].c_str());
6997 error_found = true;
6998 }
6999
7000 if (y != y_inc)
7001 {
7002 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
7003 expression_list[i].c_str());
7004 error_found = true;
7005 }
7006
7007 if (s0 != s0_inc)
7008 {
7009 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: y\n",
7010 expression_list[i].c_str());
7011 error_found = true;
7012 }
7013
7014 if (!std::equal(v0,v0 + sizeof_vec,v0_inc))
7015 {
7016 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v0\n",
7017 expression_list[i].c_str());
7018 error_found = true;
7019 }
7020
7021 if (!std::equal(v1,v1 + sizeof_vec,v1_inc))
7022 {
7023 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v1\n",
7024 expression_list[i].c_str());
7025 error_found = true;
7026 }
7027
7028 if (!std::equal(v2,v2 + sizeof_vec,v2_inc))
7029 {
7030 printf("run_test18() - Error in evaluation! (3) Expression: %s Check: v2\n",
7031 expression_list[i].c_str());
7032 error_found = true;
7033 }
7034 }
7035
7036 if (error_found)
7037 {
7038 return false;
7039 }
7040 }
7041
7042 {
7043 bool error_found = false;
7044
7046
7047 std::string s0 = "XXXXXXXXXXXXXXX";
7048 std::string s1 = "XXXXXXXXXXXXXXX";
7049 std::string s2 = "XXXXXXXXXXXXXXX";
7050 std::string s3 = "XXXXXXXXXXXXXXX";
7051 std::string s4 = "XXXXXXXXXXXXXXX";
7052
7053 typedef exprtk::symbol_table<T> symbol_table_t;
7054 typedef exprtk::expression<T> expression_t;
7055 typedef exprtk::parser<T> parser_t;
7056
7057 symbol_table_t symbol_table;
7058
7059 symbol_table.add_constants();
7060
7061 symbol_table.add_stringvar("s0", s0);
7062 symbol_table.add_stringvar("s1", s1);
7063 symbol_table.add_stringvar("s2", s2);
7064 symbol_table.add_stringvar("s3", s3);
7065 symbol_table.add_stringvar("s4", s4);
7066
7067 symbol_table.add_function("remspc_uc", rsauc);
7068
7069 const std::string program =
7070 " s0 := 'How now '; "
7071 " s1 := 'brown cow?'; "
7072 " s2 := remspc_uc(s0 + s1); "
7073 " s3 := remspc_uc(s0) + s1; "
7074 " s4 := s0 + remspc_uc(s1); "
7075 " remspc_uc(s0 + s1) == remspc_uc(s0) + remspc_uc(s1); ";
7076
7077 const std::string parameter_type_list[] =
7078 {
7079 "VVVTTT|S",
7080 "VVTTTV|S",
7081 "VTTTVV|S",
7082 "TTTVVV|S",
7083 "TTVVVT|S",
7084 "TVVVTT|S"
7085 };
7086
7087 std::size_t parameter_type_list_size = sizeof(parameter_type_list) / sizeof(std::string);
7088
7089 for (std::size_t i = 0; i < parameter_type_list_size; ++i)
7090 {
7091 expression_t expression;
7092
7093 expression.register_symbol_table(symbol_table);
7094
7095 parser_t parser;
7096
7097 rsauc.parameter_sequence = parameter_type_list[i];
7098
7099 if (!parser.compile(program,expression))
7100 {
7101 printf("run_test18() - [5] Error: %s\tExpression: %s\n",
7102 parser.error().c_str(),
7103 program.c_str());
7104
7105 return false;
7106 }
7107
7108 const T result = expression.value();
7109
7110 if (result != T(1))
7111 {
7112 printf("run_test18() - Error in evaluation! (4) Expression: %s Result <> 1\n",
7113 program.c_str());
7114 error_found = true;
7115 }
7116
7117 if (result != T(1))
7118 {
7119 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
7120 program.c_str());
7121 error_found = true;
7122 }
7123
7124 if ("How now " != s0)
7125 {
7126 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s0\n",
7127 program.c_str());
7128 error_found = true;
7129 }
7130
7131 if ("brown cow?" != s1)
7132 {
7133 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s1\n",
7134 program.c_str());
7135 error_found = true;
7136 }
7137
7138 if ("HOWNOWBROWNCOW?" != s2)
7139 {
7140 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s2\n",
7141 program.c_str());
7142 error_found = true;
7143 }
7144
7145 if ("HOWNOWbrown cow?" != s3)
7146 {
7147 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s3\n",
7148 program.c_str());
7149 error_found = true;
7150 }
7151
7152 if ("How now BROWNCOW?" != s4)
7153 {
7154 printf("run_test18() - Error in evaluation! (4) Expression: %s Check: s4\n",
7155 program.c_str());
7156 error_found = true;
7157 }
7158 }
7159
7160 if (error_found)
7161 {
7162 return false;
7163 }
7164 }
7165
7166 {
7167 bool error_found = false;
7168
7169 typedef exprtk::symbol_table<T> symbol_table_t;
7170 typedef exprtk::expression<T> expression_t;
7171 typedef exprtk::parser<T> parser_t;
7172
7173 symbol_table_t symbol_table;
7174
7175 T v[4] = {T(5), T(6), T(7), T(8)};
7176
7177 symbol_table.add_vector("v",v);
7178
7179 vararg_func<T> vaf;
7180 symbol_table.add_function("vararg_func",vaf);
7181
7182 expression_t expression;
7183 expression.register_symbol_table(symbol_table);
7184
7185 parser_t parser;
7186
7187 const std::string programs[] =
7188 {
7189 "equal(0,vararg_func())",
7190 "equal(1,vararg_func() + 1)",
7191 "equal(1,1 + vararg_func())",
7192 "equal(1,vararg_func + 1)",
7193 "equal(1,1 + vararg_func)",
7194 "equal(0,vararg_func() + vararg_func)",
7195 "equal(0,vararg_func + vararg_func())",
7196 "equal(1,vararg_func + vararg_func(1))",
7197 "equal(1,vararg_func + vararg_func(1,2))",
7198 "equal(2,vararg_func + vararg_func(v))",
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(2,vararg_func(v))",
7203 "equal(1,vararg_func(1))",
7204 "equal(1,vararg_func(1,2,3))",
7205 "equal(1,vararg_func(5,6,7,8))",
7206 "equal(5,vararg_func(v) + 3)",
7207 "equal(5,vararg_func(1) + 4)",
7208 "equal(6,vararg_func(1,2,3) + 5)",
7209 "equal(7,vararg_func(5,6,7,8) + 6)"
7210 };
7211
7212 static const std::size_t programs_size = sizeof(programs) / sizeof(std::string);
7213
7214 for (std::size_t i = 0; i < programs_size; ++i)
7215 {
7216 if (!parser.compile(programs[i],expression))
7217 {
7218 printf("run_test18() - [6] Error: %s\tExpression: %s\n",
7219 parser.error().c_str(),
7220 programs[i].c_str());
7221
7222 error_found = true;
7223 }
7224 else if (T(1) != expression.value())
7225 {
7226 printf("run_test18() - Error in evaluation! (5) Expression: %s\n",
7227 programs[i].c_str());
7228
7229 error_found = true;
7230 }
7231 }
7232
7233 if (error_found)
7234 {
7235 return false;
7236 }
7237 }
7238
7239 {
7240 bool error_found = false;
7241
7242 typedef exprtk::symbol_table<T> symbol_table_t;
7243 typedef exprtk::expression<T> expression_t;
7244 typedef exprtk::parser<T> parser_t;
7245
7246 std::vector<T> v0;
7247 std::vector<T> v1;
7248 std::vector<T> v2;
7249 std::vector<T> v3;
7250
7251 #define pb(v,N) \
7252 v.push_back(T(N)); \
7253
7254 pb(v0,0) pb(v0,0) pb(v0,0) pb(v0,0) pb(v0,0) pb(v0, 0) pb(v0, 0)
7255 pb(v1,0) pb(v1,2) pb(v1,4) pb(v1,6) pb(v1,8) pb(v1,10) pb(v1,12)
7256 pb(v2,1) pb(v2,3) pb(v2,5) pb(v2,7) pb(v2,9) pb(v2,11) pb(v2,13)
7257 pb(v3,0) pb(v3,1) pb(v3,2) pb(v3,3) pb(v3,4) pb(v3, 5) pb(v3, 6)
7258 #undef pb
7259
7260 const std::string expr_string = "sum(v + 1)";
7261
7263
7264 symbol_table_t symbol_table;
7265 symbol_table.add_vector("v",v);
7266
7267 expression_t expression;
7268 expression.register_symbol_table(symbol_table);
7269
7270 parser_t parser;
7271
7272 if (!parser.compile(expr_string,expression))
7273 {
7274 printf("run_test18() - [7] Error: %s\tExpression: %s\n",
7275 parser.error().c_str(),
7276 expr_string.c_str());
7277
7278 error_found = true;
7279 }
7280
7281 T sum = { T(0) };
7282
7283 sum = expression.value();
7284
7285 if (not_equal(sum,T(7)))
7286 {
7287 printf("run_test18() - Error in evaluation! (6) Expression: %s\n",
7288 expr_string.c_str());
7289
7290 error_found = true;
7291 }
7292
7293 v.rebase(v1.data());
7294 sum = expression.value();
7295
7296 if (not_equal(sum,T(49)))
7297 {
7298 printf("run_test18() - Error in evaluation! (7) Expression: %s\n",
7299 expr_string.c_str());
7300 error_found = true;
7301 }
7302
7303 v.rebase(v2.data());
7304 sum = expression.value();
7305
7306 if (not_equal(sum,T(56)))
7307 {
7308 printf("run_test18() - Error in evaluation! (8) Expression: %s\n",
7309 expr_string.c_str());
7310 error_found = true;
7311 }
7312
7313 v.rebase(v3.data());
7314 sum = expression.value();
7315
7316 if (not_equal(sum,T(28)))
7317 {
7318 printf("run_test18() - Error in evaluation! (9) Expression: %s\n",
7319 expr_string.c_str());
7320 error_found = true;
7321 }
7322
7323 if (error_found)
7324 {
7325 return false;
7326 }
7327 }
7328
7329 {
7330 bool error_found = false;
7331
7332 typedef exprtk::symbol_table<T> symbol_table_t;
7333 typedef exprtk::expression<T> expression_t;
7334 typedef exprtk::parser<T> parser_t;
7335
7336 std::vector<T> v0;
7337 std::vector<T> s;
7338
7339 #define pb(v,N) \
7340 v.push_back(T(N)); \
7341
7342 pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
7343 pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
7344
7345 pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
7346 pb(s,15) pb(s,18) pb(s,21)
7347 #undef pb
7348
7349 const std::string expr_string = "v[0] + v[1] + v[2]";
7350
7352
7353 symbol_table_t symbol_table;
7354 symbol_table.add_vector("v",v);
7355
7356 expression_t expression;
7357 expression.register_symbol_table(symbol_table);
7358
7359 parser_t parser;
7360
7361 if (!parser.compile(expr_string,expression))
7362 {
7363 printf("run_test18() - [8] Error: %s\tExpression: %s\n",
7364 parser.error().c_str(),
7365 expr_string.c_str());
7366
7367 error_found = true;
7368 }
7369
7370 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7371 {
7372 v.rebase(v0.data() + i);
7373
7374 T sum = expression.value();
7375
7376 if (not_equal(sum,s[i]))
7377 {
7378 printf("run_test18() - Error in evaluation! (7) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7379 expr_string.c_str(),
7380 static_cast<double>(s[i]),
7381 static_cast<double>(sum));
7382
7383 error_found = true;
7384 }
7385
7386 }
7387
7388 if (error_found)
7389 {
7390 return false;
7391 }
7392 }
7393
7394 {
7395 bool error_found = false;
7396
7397 typedef exprtk::symbol_table<T> symbol_table_t;
7398 typedef exprtk::expression<T> expression_t;
7399 typedef exprtk::parser<T> parser_t;
7400
7401 std::vector<T> v0;
7402 std::vector<T> s;
7403
7404 #define pb(v,N) \
7405 v.push_back(T(N)); \
7406
7407 pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
7408 pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
7409
7410 pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
7411 pb(s,15) pb(s,18) pb(s,21)
7412 #undef pb
7413
7414 const std::string expr_string = "var i := 0; var j := 1; var k := 2; v[i] + v[j] + v[k]";
7415
7417
7418 symbol_table_t symbol_table;
7419 symbol_table.add_vector("v",v);
7420
7421 expression_t expression;
7422 expression.register_symbol_table(symbol_table);
7423
7424 parser_t parser;
7425
7426 if (!parser.compile(expr_string,expression))
7427 {
7428 printf("run_test18() - [9] Error: %s\tExpression: %s\n",
7429 parser.error().c_str(),
7430 expr_string.c_str());
7431
7432 error_found = true;
7433 }
7434
7435 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7436 {
7437 v.rebase(v0.data() + i);
7438
7439 T sum = expression.value();
7440
7441 if (not_equal(sum,s[i]))
7442 {
7443 printf("run_test18() - Error in evaluation! (8) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7444 expr_string.c_str(),
7445 static_cast<double>(s[i]),
7446 static_cast<double>(sum));
7447
7448 error_found = true;
7449 }
7450
7451 }
7452
7453 if (error_found)
7454 {
7455 return false;
7456 }
7457 }
7458
7459 {
7460 typedef exprtk::symbol_table<T> symbol_table_t;
7461 typedef exprtk::expression<T> expression_t;
7462 typedef exprtk::parser<T> parser_t;
7463
7464 const std::string const_folded_expression_list[] =
7465 {
7466 "(0 * dot(2 * v0,v1 - 1))",
7467 "(0 * dot(2 * v0,v1 - 1)) + (dot(2 * v0,v1 - 1) * 0)",
7468 "(0 * dot(v0 - v1,v1 / v0))",
7469 "(0 * dot(v0 - v1,v1 / v0)) + (dot(v0 - v1,v1 / v0) * 0)",
7470 "(0 * dot(v0,v1))",
7471 "(0 * dot(v0,v1)) + (dot(v0,v1) * 0)",
7472 "(0 / dot(2 * v0,v1 - 1))",
7473 "(0 / dot(2 * v0,v1 - 1)) + (dot(2 * v0,v1 - 1) * 0)",
7474 "(0 / dot(v0 - v1,v1 / v0))",
7475 "(0 / dot(v0 - v1,v1 / v0)) + (dot(v0 - v1,v1 / v0) * 0)",
7476 "(0 / dot(v0,v1))",
7477 "(0 / dot(v0,v1)) + (dot(v0,v1) * 0)",
7478 "(dot(2 * v0,v1 - 1) * 0)",
7479 "(dot(2 * v0,v1 - 1) * 0) + (0 * dot(2 * v0,v1 - 1))",
7480 "(dot(2 * v0,v1 - 1) * 0) + (0 / dot(2 * v0,v1 - 1))",
7481 "(dot(v0 - v1,v1 / v0) * 0)",
7482 "(dot(v0 - v1,v1 / v0) * 0) + (0 * dot(v0 - v1,v1 / v0))",
7483 "(dot(v0 - v1,v1 / v0) * 0) + (0 / dot(v0 - v1,v1 / v0))",
7484 "(dot(v0,v1) * 0)",
7485 "(dot(v0,v1) * 0) + (0 * dot(v0,v1))",
7486 "(dot(v0,v1) * 0) + (0 / dot(v0,v1))"
7487 };
7488
7489 const std::size_t const_folded_expression_list_size = sizeof(const_folded_expression_list) / sizeof(std::string);
7490
7491 const std::size_t vector_size = 5;
7492 T v0[vector_size] = { 0, 2, 4, 6, 8 };
7493 T v1[vector_size] = { 1, 3, 5, 7, 9 };
7494
7495 exprtk::vector_view<T> vv0 = exprtk::make_vector_view(v0, vector_size);
7496 exprtk::vector_view<T> vv1 = exprtk::make_vector_view(v1, vector_size);
7497
7498 exprtk::rtl::vecops::package<T> vector_package;
7499 exprtk::rtl::io::package<T> io_package;
7500
7501 symbol_table_t symbol_table;
7502
7503 symbol_table.add_package( vector_package );
7504 symbol_table.add_package( io_package );
7505 symbol_table.add_vector ( "v0" , vv0 );
7506 symbol_table.add_vector ( "v1" , vv1 );
7507
7508 expression_t expression;
7509 expression.register_symbol_table(symbol_table);
7510
7511 parser_t parser;
7512
7513 for (std::size_t i = 0; i < const_folded_expression_list_size; ++i)
7514 {
7515 const std::string& expression_string = const_folded_expression_list[i];
7516
7517 if (!parser.compile(expression_string, expression))
7518 {
7519 printf("run_test18() - [10] Error: %s Expression: %s\n",
7520 parser.error().c_str(),
7521 expression_string.c_str());
7522
7523 return false;
7524 }
7525
7527 {
7528 printf("run_test18() - Error: Expression did not compile to a constant! [1] Expression: %s\n",
7529 expression_string.c_str());
7530
7531 return false;
7532 }
7533
7534 for (std::size_t j = 0; j < 100; ++j)
7535 {
7536 if ((j % 2) == 0)
7537 {
7538 vv0.rebase(v0);
7539 vv1.rebase(v1);
7540 }
7541 else
7542 {
7543 vv0.rebase(v1);
7544 vv1.rebase(v0);
7545 }
7546
7547 const T result = expression.value();
7548
7549 if (result != T(0))
7550 {
7551 printf("run_test18() - Error: Expected result of zero, result: %8.4f for Expression: %s\n",
7552 static_cast<double>(result),
7553 expression_string.c_str());
7554
7555 return false;
7556 }
7557 }
7558
7559 expression.release();
7560 }
7561 }
7562
7563 {
7564 typedef exprtk::symbol_table<T> symbol_table_t;
7565 typedef exprtk::expression<T> expression_t;
7566 typedef exprtk::parser<T> parser_t;
7567
7568 const std::string rebase_expression_list[] =
7569 {
7570 "dot(v0,v1)",
7571 "dot(2 * v0,v1 - 1) + dot(2 * v0,v1 - 1)",
7572 "dot(2 * v0,v1 - 1)",
7573 "dot(v0 - v1,v1 / v0) + dot(v0 - v1,v1 / v0)",
7574 "dot(v0 - v1,v1 / v0)",
7575 "dot(v0,v1) + dot(v0,v1)",
7576 "dot(v0,v1) + x",
7577 "dot(2 * v0,v1 - 1) * x + dot(2 * v0,v1 - 1) * y",
7578 "x / dot(2 * v0,v1 - 1)",
7579 "x / dot(v0 - v1,v1 / v0) + dot(v0 - v1,v1 / v0) / y",
7580 "x * dot(v0 - v1,v1 / v0) / y",
7581 "x - dot(v0,v1) + dot(v0,v1) + y",
7582 };
7583
7584 const std::size_t rebase_expression_list_size = sizeof(rebase_expression_list) / sizeof(std::string);
7585
7586 T x = T(1.234);
7587 T y = T(5.678);
7588
7589 const std::size_t vector_size = 5;
7590 T v0[vector_size] = { 0, 2, 4, 6, 8 };
7591 T v1[vector_size] = { 1, 3, 5, 7, 9 };
7592
7593 exprtk::vector_view<T> vv0 = exprtk::make_vector_view(v0, vector_size);
7594 exprtk::vector_view<T> vv1 = exprtk::make_vector_view(v1, vector_size);
7595
7596 exprtk::rtl::vecops::package<T> vector_package;
7597 exprtk::rtl::io::package<T> io_package;
7598
7599 symbol_table_t symbol_table;
7600
7601 symbol_table.add_package ( vector_package );
7602 symbol_table.add_package ( io_package );
7603 symbol_table.add_variable( "x" , x );
7604 symbol_table.add_variable( "y" , y );
7605 symbol_table.add_vector ( "v0" , vv0 );
7606 symbol_table.add_vector ( "v1" , vv1 );
7607
7608 expression_t expression;
7609 expression.register_symbol_table(symbol_table);
7610
7611 parser_t parser;
7612
7613 for (std::size_t i = 0; i < rebase_expression_list_size; ++i)
7614 {
7615 const std::string& expression_string = rebase_expression_list[i];
7616
7617 if (!parser.compile(expression_string, expression))
7618 {
7619 printf("run_test18() - [11] Error: %s Expression: %s\n",
7620 parser.error().c_str(),
7621 expression_string.c_str());
7622
7623 return false;
7624 }
7625
7626 for (std::size_t j = 0; j < 100; ++j)
7627 {
7628 if ((j % 2) == 0)
7629 {
7630 vv0.rebase(v0);
7631 vv1.rebase(v1);
7632 }
7633 else
7634 {
7635 vv0.rebase(v1);
7636 vv1.rebase(v0);
7637 }
7638
7639 expression.value();
7640 }
7641
7642 expression.release();
7643 }
7644 }
7645
7646 {
7647 bool error_found = false;
7648
7649 typedef exprtk::symbol_table<T> symbol_table_t;
7650 typedef exprtk::expression<T> expression_t;
7651 typedef exprtk::parser<T> parser_t;
7652
7653 std::vector<T> v0;
7654 std::vector<T> s;
7655
7656 #define pb(v,N) \
7657 v.push_back(T(N)); \
7658
7659 pb(v0,0) pb(v0,1) pb(v0,2) pb(v0,3) pb(v0,4)
7660 pb(v0,5) pb(v0,6) pb(v0,7) pb(v0,8) pb(v0,9)
7661
7662 pb(s, 3) pb(s, 6) pb(s, 9) pb(s,12)
7663 pb(s,15) pb(s,18) pb(s,21)
7664 #undef pb
7665
7666 const std::string expr_string = "var i := 0; v[i + 0] + v[i + 1] + v[i + 2]";
7667
7669
7670 symbol_table_t symbol_table;
7671 symbol_table.add_vector("v",v);
7672
7673 expression_t expression;
7674 expression.register_symbol_table(symbol_table);
7675
7676 parser_t parser;
7677
7678 if (!parser.compile(expr_string,expression))
7679 {
7680 printf("run_test18() - [12] Error: %s\tExpression: %s\n",
7681 parser.error().c_str(),
7682 expr_string.c_str());
7683
7684 error_found = true;
7685 }
7686
7687 for (std::size_t i = 0; i < v0.size() - 4; ++i)
7688 {
7689 v.rebase(v0.data() + i);
7690
7691 const T sum = expression.value();
7692
7693 if (not_equal(sum,s[i]))
7694 {
7695 printf("run_test18() - Error in evaluation! (9) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7696 expr_string.c_str(),
7697 static_cast<double>(s[i]),
7698 static_cast<double>(sum));
7699
7700 error_found = true;
7701 }
7702
7703 }
7704
7705 if (error_found)
7706 {
7707 return false;
7708 }
7709 }
7710
7711 {
7712 typedef exprtk::symbol_table<T> symbol_table_t;
7713 typedef exprtk::expression<T> expression_t;
7714 typedef exprtk::parser<T> parser_t;
7715
7716 T v0[] = { T(0), T(1), T(2), T(3), T(4) };
7717 T v1[] = { T(5), T(6), T(7), T(8), T(9) };
7718
7719 const std::size_t v0_size = sizeof(v0) / sizeof (T);
7720 const std::size_t v1_size = sizeof(v1) / sizeof (T);
7721
7723
7724 vecrebase_func<T> vec_sum;
7725
7726 symbol_table_t symbol_table;
7727 symbol_table.add_vector("v",v);
7728 symbol_table.add_function("vec_sum",vec_sum);
7729
7730 expression_t expression;
7731 expression.register_symbol_table(symbol_table);
7732
7733 parser_t parser;
7734
7735 const std::string expr_string = "vec_sum(v)";
7736
7737 if (!parser.compile(expr_string,expression))
7738 {
7739 printf("run_test18() - [13] Error: %s\tExpression: %s\n",
7740 parser.error().c_str(),
7741 expr_string.c_str());
7742
7743 return false;
7744 }
7745
7746 const T expected_result0 = std::accumulate(v0, v0 + v0_size, T(0));
7747
7748 if (expression.value() != expected_result0)
7749 {
7750 printf("run_test18() - Error in evaluation! (10.1) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7751 expr_string.c_str(),
7752 static_cast<double>(expected_result0),
7753 static_cast<double>(expression.value()));
7754
7755 return false;
7756 }
7757
7758 v.rebase(v1);
7759
7760 const T expected_result1 = std::accumulate(v1, v1 + v1_size, T(0));
7761
7762 if (expression.value() != expected_result1)
7763 {
7764 printf("run_test18() - Error in evaluation! (10.2) Expression: %s Expected: %5.3f Computed: %5.3f\n",
7765 expr_string.c_str(),
7766 static_cast<double>(expected_result1),
7767 static_cast<double>(expression.value()));
7768
7769 return false;
7770 }
7771 }
7772
7773 {
7774 bool error_found = false;
7775
7776 typedef exprtk::symbol_table<T> symbol_table_t;
7777 typedef exprtk::expression<T> expression_t;
7778 typedef exprtk::parser<T> parser_t;
7779
7781
7782 symbol_table_t symbol_table;
7783 symbol_table.add_package(vecops_pkg);
7784
7785 const std::string expr_str_list[] =
7786 {
7787 "var v[9] := {1,2,3,4,5,6,7,8,9}; all_true(v) == true" ,
7788 "var v[6] := {-1,-2,-3,-4,-5,-6}; all_true(v) == true" ,
7789 "var v[8] := {1,2,3,0,0,0,0,0}; all_true(v) == false",
7790 "var v[8] := {-1,-2,-3,0,0,0,0,0}; all_true(v) == false",
7791 "var v[9] := {0,0,0,0,0,0,0,0,0}; all_true(v + 1) == true",
7792
7793 "var v[9] := {0,0,0,0,0,0,0,0,0}; all_false(v) == true" ,
7794 "var v[9] := {0,0,0,0,0,1,2,3,4}; all_false(v) == false" ,
7795 "var v[8] := {0,0,0,0,0,-1,-2,-3}; all_false(v) == false" ,
7796 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
7797
7798 "var v[9] := {0,0,0,0,0,0,0,0,1}; any_true(v) == true" ,
7799 "var v[9] := {0,0,0,0,1,0,0,0,0}; any_true(v) == true" ,
7800 "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v) == false" ,
7801 "var v[9] := {0,0,0,0,0,0,0,0,0}; any_true(v + 1) == true",
7802
7803 "var v[9] := {1,1,1,1,1,1,1,1,0}; any_false(v) == true" ,
7804 "var v[9] := {1,1,1,1,0,1,1,1,1}; any_false(v) == true" ,
7805 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v) == false" ,
7806 "var v[9] := {1,1,1,1,1,1,1,1,1}; any_false(v - 1) == true",
7807
7808 "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v) == 0" ,
7809 "var v[9] := {0,0,0,0,0,0,0,0,1}; count(v) == 1" ,
7810 "var v[9] := {0,0,0,0,0,0,0,2,1}; count(v) == 2" ,
7811 "var v[9] := {0,0,0,0,0,0,3,2,1}; count(v) == 3" ,
7812 "var v[9] := {0,0,0,0,0,0,0,0,0}; count(v + 1) == v[]",
7813 "var v[9] := {1,1,1,1,1,1,1,1,1}; count(v - 1) == 0",
7814
7815 "var v[9] := {1,2,3,4,5,6,7,8,9}; var r[9] := [0]; copy(v,r); sum(v == r) == v[]",
7816 "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",
7817 "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",
7818 "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",
7819
7820 "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; rol(v,3); sum(v == r) == v[]",
7821 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; ror(v,3); sum(v == r) == v[]",
7822
7823 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,1,2}; rol(v,2); sum(v == r) == v[]",
7824 "var v[5] := {1,2,3,4,5}; var r[5] := {4,5,1,2,3}; ror(v,2); sum(v == r) == v[]",
7825
7826 "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[]",
7827 "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[]",
7828
7829 "var v[5] := {1,2,3,4,5}; var r[5] := {3,4,5,0,0}; shftl(v,2); sum(v == r) == v[]",
7830 "var v[5] := {1,2,3,4,5}; var r[5] := {5,0,0,0,0}; shftl(v,4); sum(v == r) == v[]",
7831 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftl(v,5); sum(v == r) == v[]",
7832
7833 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,1,2,3}; shftr(v,2); sum(v == r) == v[]",
7834 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,1}; shftr(v,4); sum(v == r) == v[]",
7835 "var v[5] := {1,2,3,4,5}; var r[5] := {0,0,0,0,0}; shftr(v,5); sum(v == r) == v[]",
7836
7837 "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[]",
7838 "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[]",
7839
7840 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
7841 "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v); sum(v == r) == v[]",
7842 "var v[5] := {1,4,2,3,5}; var r[5] := {1,2,3,4,5}; sort(v,1,3); sum(v == r) == v[]",
7843 "var v[5] := {5,4,2,3,1}; var r[5] := {5,2,3,4,1}; sort(v,1,3); sum(v == r) == v[]",
7844 "var v[5] := {3,1,2,4,5}; var r[5] := {1,2,3,4,5}; sort(v,0,2); sum(v == r) == v[]",
7845 "var v[5] := {1,2,5,3,4}; var r[5] := {1,2,3,4,5}; sort(v,2,4); sum(v == r) == v[]",
7846
7847 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
7848 "var v[5] := {1,3,5,2,4}; var r[5] := {1,2,3,4,5}; sort(v,'aScEnDiNg'); sum(v == r) == v[]",
7849 "var v[5] := {5,4,3,2,1}; var r[5] := {1,2,3,4,5}; sort(v,'ascending'); sum(v == r) == v[]",
7850 "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[]",
7851 "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[]",
7852 "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[]",
7853
7854 "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
7855 "var v[5] := {1,3,5,2,4}; var r[5] := {5,4,3,2,1}; sort(v,'DeScEnDiNg'); sum(v == r) == v[]",
7856 "var v[5] := {5,4,3,2,1}; var r[5] := {5,4,3,2,1}; sort(v,'descending'); sum(v == r) == v[]",
7857 "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[]",
7858 "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[]",
7859 "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[]",
7860
7861 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 2)); v[v[] / 2] == 5",
7862 "var v[9] := {7,8,9,1,2,3,4,5,6}; nth_element(v,trunc(v[] / 3)); v[v[] / 3] == 4",
7863
7864 "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)",
7865 "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)",
7866
7867 "var v[5]; iota(v, 0,1); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7868 "var v[5]; iota(v, 0,2); var r[5] := { 0, 2, 4, 6, 8}; sum(v == r) == v[]",
7869 "var v[5]; iota(v, 1,1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7870 "var v[5]; iota(v, 1,2); var r[5] := { 1, 3, 5, 7, 9}; sum(v == r) == v[]",
7871 "var v[5]; iota(v,-1,1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7872 "var v[5]; iota(v,-1,2); var r[5] := {-1, 1, 3, 5, 7}; sum(v == r) == v[]",
7873 "var v[5]; iota(v,-2,1); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7874 "var v[5]; iota(v,-2,2); var r[5] := {-2, 0, 2, 4, 6}; sum(v == r) == v[]",
7875 "var v[5]; iota(v, 0); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7876 "var v[5]; iota(v, 1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7877 "var v[5]; iota(v,-1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7878 "var v[5]; iota(v,-2); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7879 "var v[5]; iota(v, 0, 0); var r[5] := { 0, 0, 0, 0, 0}; sum(v == r) == v[]",
7880 "var v[5]; iota(v, 1, 0); var r[5] := { 1, 1, 1, 1, 1}; sum(v == r) == v[]",
7881
7882 "var v[5]; iota(v, 0, v[] - 1, 0,1); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7883 "var v[5]; iota(v, 0, v[] - 1, 0,2); var r[5] := { 0, 2, 4, 6, 8}; sum(v == r) == v[]",
7884 "var v[5]; iota(v, 0, v[] - 1, 1,1); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7885 "var v[5]; iota(v, 0, v[] - 1, 1,2); var r[5] := { 1, 3, 5, 7, 9}; sum(v == r) == v[]",
7886 "var v[5]; iota(v, 0, v[] - 1,-1,1); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7887 "var v[5]; iota(v, 0, v[] - 1,-1,2); var r[5] := {-1, 1, 3, 5, 7}; sum(v == r) == v[]",
7888 "var v[5]; iota(v, 0, v[] - 1,-2,1); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7889 "var v[5]; iota(v, 0, v[] - 1,-2,2); var r[5] := {-2, 0, 2, 4, 6}; sum(v == r) == v[]",
7890 "var v[5]; iota(v, 0, v[] - 1, 0 ); var r[5] := { 0, 1, 2, 3, 4}; sum(v == r) == v[]",
7891 "var v[5]; iota(v, 0, v[] - 1, 1 ); var r[5] := { 1, 2, 3, 4, 5}; sum(v == r) == v[]",
7892 "var v[5]; iota(v, 0, v[] - 1,-1 ); var r[5] := {-1, 0, 1, 2, 3}; sum(v == r) == v[]",
7893 "var v[5]; iota(v, 0, v[] - 1,-2 ); var r[5] := {-2,-1, 0, 1, 2}; sum(v == r) == v[]",
7894 "var v[5]; iota(v, 0, v[] - 1, 0,0); var r[5] := { 0, 0, 0, 0, 0}; sum(v == r) == v[]",
7895 "var v[5]; iota(v, 0, v[] - 1, 1,0); var r[5] := { 1, 1, 1, 1, 1}; sum(v == r) == v[]",
7896
7897 "var v[5]; iota(v, 1, v[] - 1, 0,1); var r[5] := { 0, 0, 1, 2, 3 }; sum(v == r) == v[]",
7898 "var v[5]; iota(v, 1, v[] - 1, 0,2); var r[5] := { 0, 0, 2, 4, 6 }; sum(v == r) == v[]",
7899 "var v[5]; iota(v, 1, v[] - 1, 1,1); var r[5] := { 0, 1, 2, 3, 4 }; sum(v == r) == v[]",
7900 "var v[5]; iota(v, 1, v[] - 1, 1,2); var r[5] := { 0, 1, 3, 5, 7 }; sum(v == r) == v[]",
7901 "var v[5]; iota(v, 1, v[] - 1,-1,1); var r[5] := { 0, -1, 0, 1, 2 }; sum(v == r) == v[]",
7902 "var v[5]; iota(v, 1, v[] - 1,-1,2); var r[5] := { 0, -1, 1, 3, 5 }; sum(v == r) == v[]",
7903 "var v[5]; iota(v, 1, v[] - 1,-2,1); var r[5] := { 0, -2,-1, 0, 1 }; sum(v == r) == v[]",
7904 "var v[5]; iota(v, 1, v[] - 1,-2,2); var r[5] := { 0, -2, 0, 2, 4 }; sum(v == r) == v[]",
7905 "var v[5]; iota(v, 1, v[] - 1, 0 ); var r[5] := { 0, 0, 1, 2, 3 }; sum(v == r) == v[]",
7906 "var v[5]; iota(v, 1, v[] - 1, 1 ); var r[5] := { 0, 1, 2, 3, 4 }; sum(v == r) == v[]",
7907 "var v[5]; iota(v, 1, v[] - 1,-1 ); var r[5] := { 0, -1, 0, 1, 2 }; sum(v == r) == v[]",
7908 "var v[5]; iota(v, 1, v[] - 1,-2 ); var r[5] := { 0, -2,-1, 0, 1 }; sum(v == r) == v[]",
7909
7910 "var v[5]; iota(v, 1, v[] - 2, 0,1); var r[5] := { 0, 0, 1, 2, 0 }; sum(v == r) == v[]",
7911 "var v[5]; iota(v, 1, v[] - 2, 0,2); var r[5] := { 0, 0, 2, 4, 0 }; sum(v == r) == v[]",
7912 "var v[5]; iota(v, 1, v[] - 2, 1,1); var r[5] := { 0, 1, 2, 3, 0 }; sum(v == r) == v[]",
7913 "var v[5]; iota(v, 1, v[] - 2, 1,2); var r[5] := { 0, 1, 3, 5, 0 }; sum(v == r) == v[]",
7914 "var v[5]; iota(v, 1, v[] - 2,-1,1); var r[5] := { 0, -1, 0, 1, 0 }; sum(v == r) == v[]",
7915 "var v[5]; iota(v, 1, v[] - 2,-1,2); var r[5] := { 0, -1, 1, 3, 0 }; sum(v == r) == v[]",
7916 "var v[5]; iota(v, 1, v[] - 2,-2,1); var r[5] := { 0, -2,-1, 0, 0 }; sum(v == r) == v[]",
7917 "var v[5]; iota(v, 1, v[] - 2,-2,2); var r[5] := { 0, -2, 0, 2, 0 }; sum(v == r) == v[]",
7918 "var v[5]; iota(v, 1, v[] - 2, 0 ); var r[5] := { 0, 0, 1, 2, 0 }; sum(v == r) == v[]",
7919 "var v[5]; iota(v, 1, v[] - 2, 1 ); var r[5] := { 0, 1, 2, 3, 0 }; sum(v == r) == v[]",
7920 "var v[5]; iota(v, 1, v[] - 2,-1 ); var r[5] := { 0, -1, 0, 1, 0 }; sum(v == r) == v[]",
7921 "var v[5]; iota(v, 1, v[] - 2,-2 ); var r[5] := { 0, -2,-1, 0, 0 }; sum(v == r) == v[]",
7922
7923 "var v[5]; iota(v, 0, v[] - 2, 0,1); var r[5] := { 0, 1, 2, 3, 0}; sum(v == r) == v[]",
7924 "var v[5]; iota(v, 0, v[] - 2, 0,2); var r[5] := { 0, 2, 4, 6, 0}; sum(v == r) == v[]",
7925 "var v[5]; iota(v, 0, v[] - 2, 1,1); var r[5] := { 1, 2, 3, 4, 0}; sum(v == r) == v[]",
7926 "var v[5]; iota(v, 0, v[] - 2, 1,2); var r[5] := { 1, 3, 5, 7, 0}; sum(v == r) == v[]",
7927 "var v[5]; iota(v, 0, v[] - 2,-1,1); var r[5] := {-1, 0, 1, 2, 0}; sum(v == r) == v[]",
7928 "var v[5]; iota(v, 0, v[] - 2,-1,2); var r[5] := {-1, 1, 3, 5, 0}; sum(v == r) == v[]",
7929 "var v[5]; iota(v, 0, v[] - 2,-2,1); var r[5] := {-2,-1, 0, 1, 0}; sum(v == r) == v[]",
7930 "var v[5]; iota(v, 0, v[] - 2,-2,2); var r[5] := {-2, 0, 2, 4, 0}; sum(v == r) == v[]",
7931 "var v[5]; iota(v, 0, v[] - 2, 0 ); var r[5] := { 0, 1, 2, 3, 0}; sum(v == r) == v[]",
7932 "var v[5]; iota(v, 0, v[] - 2, 1 ); var r[5] := { 1, 2, 3, 4, 0}; sum(v == r) == v[]",
7933 "var v[5]; iota(v, 0, v[] - 2,-1 ); var r[5] := {-1, 0, 1, 2, 0}; sum(v == r) == v[]",
7934 "var v[5]; iota(v, 0, v[] - 2,-2 ); var r[5] := {-2,-1, 0, 1, 0}; sum(v == r) == v[]",
7935
7936 "var v[5]; iota(v, 0, -1); var r[5] := { 0, -1, -2, -3, -4}; sum(v == r) == v[]",
7937 "var v[5]; iota(v, 0, -2); var r[5] := { 0, -2, -4, -6, -8}; sum(v == r) == v[]",
7938 "var v[5]; iota(v, -1, -2); var r[5] := { -1, -3, -5, -7, -9}; sum(v == r) == v[]",
7939
7940 "var v[5]; iota(v, 0, v[] -1, 0, -1); var r[5] := { 0, -1, -2, -3, -4}; sum(v == r) == v[]",
7941 "var v[5]; iota(v, 0, v[] -1, 0, -2); var r[5] := { 0, -2, -4, -6, -8}; sum(v == r) == v[]",
7942 "var v[5]; iota(v, 0, v[] -1, -1, -2); var r[5] := { -1, -3, -5, -7, -9}; sum(v == r) == v[]",
7943
7944 "var v[5]; iota(v, 0,1); threshold_below(v,2, 0); var r[5] := { 0, 0, 2, 3, 4}; sum(v == r) == v[]",
7945 "var v[5]; iota(v, 0,1); threshold_above(v,2, 0); var r[5] := { 0, 1, 2, 0, 0}; sum(v == r) == v[]",
7946
7947 "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[]",
7948 "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[]",
7949
7950 "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[]",
7951 "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[]",
7952
7953 "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[]",
7954 "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[]",
7955
7956 " 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[]",
7957 " 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[]",
7958
7959 " 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[]",
7960 " 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[]",
7961 " 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[]",
7962 };
7963
7964 const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
7965
7966 parser_t parser;
7967
7968 for (std::size_t i = 0; i < expr_str_list_size; ++i)
7969 {
7970 expression_t expression;
7971 expression.register_symbol_table(symbol_table);
7972
7973 if (!parser.compile(expr_str_list[i], expression))
7974 {
7975 printf("run_test18() - [14] Error: %s Expression: %s\n",
7976 parser.error().c_str(),
7977 expr_str_list[i].c_str());
7978
7979 error_found = true;
7980
7981 continue;
7982 }
7983
7984 const T result = expression.value();
7985
7986 if (result != T(1))
7987 {
7988 printf("run_test18() - Error in evaluation! (11) Expression: %s\n",
7989 expr_str_list[i].c_str());
7990
7991 error_found = true;
7992 }
7993 }
7994
7995 if (error_found)
7996 {
7997 return false;
7998 }
7999 }
8000
8001 {
8002 typedef exprtk::expression<T> expression_t;
8003
8004 std::string a = "a";
8005 std::string b = "b";
8006 std::string c = "c";
8007 std::string d = "d";
8008
8009 T x = T(1.1);
8010 T y = T(2.2);
8011 T z = T(3.3);
8012 T w = T(4.4);
8013
8014 overload_func<T> ovrld_func
8015 (
8016 "T:T|T:TT|T:TTT|T:TTTT|"
8017 "T:S|T:SS|T:SSS|T:SSSS|"
8018 "T:ST|T:STS|T:STST|"
8019 "T:TS|T:TST|T:TSTS|"
8020 "T:TTSS|T:SSTT|T:STTS|T:TSST"
8021 );
8022
8023 exprtk::symbol_table<T> symbol_table;
8024
8025 symbol_table.add_constants();
8026 symbol_table.add_variable ("x",x);
8027 symbol_table.add_variable ("y",y);
8028 symbol_table.add_variable ("z",z);
8029 symbol_table.add_variable ("w",w);
8030
8031 symbol_table.add_stringvar("a",a);
8032 symbol_table.add_stringvar("b",b);
8033 symbol_table.add_stringvar("c",c);
8034 symbol_table.add_stringvar("d",d);
8035
8036 symbol_table.add_function("foo",ovrld_func);
8037
8038 typedef typename overload_func<T>::test_result_t test_result_t;
8039 typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
8040
8041 static const test_pack_t test_pack_list[] =
8042 {
8043 test_pack_t("foo(x)" , test_result_t( 0, "T" )),
8044 test_pack_t("foo(x, y)" , test_result_t( 1, "TT" )),
8045 test_pack_t("foo(x, y, z)" , test_result_t( 2, "TTT" )),
8046 test_pack_t("foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
8047 test_pack_t("foo(x + y)" , test_result_t( 0, "T" )),
8048 test_pack_t("foo(x + y, y + z)" , test_result_t( 1, "TT" )),
8049 test_pack_t("foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
8050 test_pack_t("foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
8051 test_pack_t("foo(a)" , test_result_t( 4, "S" )),
8052 test_pack_t("foo(a, b)" , test_result_t( 5, "SS" )),
8053 test_pack_t("foo(a, b, c)" , test_result_t( 6, "SSS" )),
8054 test_pack_t("foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
8055 test_pack_t("foo(a + b)" , test_result_t( 4, "S" )),
8056 test_pack_t("foo(a + b, b + c)" , test_result_t( 5, "SS" )),
8057 test_pack_t("foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
8058 test_pack_t("foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
8059 test_pack_t("foo(a, x)" , test_result_t( 8, "ST" )),
8060 test_pack_t("foo(a, x, b)" , test_result_t( 9, "STS" )),
8061 test_pack_t("foo(a, x, b, y)" , test_result_t(10, "STST")),
8062 test_pack_t("foo(a + b, x + y)" , test_result_t( 8, "ST" )),
8063 test_pack_t("foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
8064 test_pack_t("foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
8065 test_pack_t("foo(x, a)" , test_result_t(11, "TS" )),
8066 test_pack_t("foo(x, a, y)" , test_result_t(12, "TST" )),
8067 test_pack_t("foo(x, a, y, b)" , test_result_t(13, "TSTS")),
8068 test_pack_t("foo(x + y, a + b)" , test_result_t(11, "TS" )),
8069 test_pack_t("foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
8070 test_pack_t("foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
8071 test_pack_t("foo(x, y, a, b)" , test_result_t(14, "TTSS")),
8072 test_pack_t("foo(a, b, x, y)" , test_result_t(15, "SSTT")),
8073 test_pack_t("foo(a, x, y, b)" , test_result_t(16, "STTS")),
8074 test_pack_t("foo(x, a, b, y)" , test_result_t(17, "TSST")),
8075 test_pack_t("foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
8076 test_pack_t("foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
8077 test_pack_t("foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
8078 test_pack_t("foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
8079 };
8080
8081 static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
8082
8083 std::deque<expression_t> expression_list;
8084
8085 for (std::size_t i = 0; i < test_pack_list_size; ++i)
8086 {
8087 expression_t expression;
8088 expression.register_symbol_table(symbol_table);
8089
8090 exprtk::parser<T> parser;
8091
8092 if (!parser.compile(test_pack_list[i].first, expression))
8093 {
8094 printf("run_test18() - [15] Overload VarArg Error: %s Expression: %s\n",
8095 parser.error().c_str(),
8096 test_pack_list[i].first.c_str());
8097
8098 return false;
8099 }
8100 else
8101 expression_list.push_back(expression);
8102 }
8103
8104 bool error_found = false;
8105
8106 for (std::size_t i = 0; i < expression_list.size(); ++i)
8107 {
8108 ovrld_func.clear();
8109
8110 if (T(1) != expression_list[i].value())
8111 {
8112 printf("run_test18() - Error in evaluation! (12) Expression: %s\n",
8113 test_pack_list[i].first.c_str());
8114
8115 error_found = true;
8116 }
8117
8118 if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
8119 {
8120 printf("run_test18() - Error with ps_index (12) Expression: %s Expected: %d Got: %d\n",
8121 test_pack_list[i].first.c_str(),
8122 static_cast<int>(test_pack_list[i].second.ps_index),
8123 static_cast<int>(ovrld_func.current_ps_index));
8124
8125 error_found = true;
8126 }
8127
8128 if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
8129 {
8130 printf("run_test18() - Error with parameter seq (12) Expression: %s Expected: %s Got: %s\n",
8131 test_pack_list[i].first.c_str(),
8132 test_pack_list[i].second.param_seq.c_str(),
8133 ovrld_func.current_param_seq.c_str());
8134
8135 error_found = true;
8136 }
8137 ::fflush(stdout);
8138 }
8139
8140 if (error_found)
8141 {
8142 return false;
8143 }
8144 }
8145
8146 {
8147 typedef exprtk::expression<T> expression_t;
8148
8149 std::string a = "a";
8150 std::string b = "b";
8151 std::string c = "c";
8152 std::string d = "d";
8153 std::string result = "";
8154
8155 T x = T(1.1);
8156 T y = T(2.2);
8157 T z = T(3.3);
8158 T w = T(4.4);
8159
8160 overload_func<T> ovrld_func
8161 (
8162 "S:T|S:TT|S:TTT|S:TTTT|"
8163 "S:S|S:SS|S:SSS|S:SSSS|"
8164 "S:ST|S:STS|S:STST|"
8165 "S:TS|S:TST|S:TSTS|"
8166 "S:TTSS|S:SSTT|S:STTS|S:TSST"
8167 );
8168
8169 exprtk::symbol_table<T> symbol_table;
8170
8171 symbol_table.add_constants();
8172 symbol_table.add_variable ("x",x);
8173 symbol_table.add_variable ("y",y);
8174 symbol_table.add_variable ("z",z);
8175 symbol_table.add_variable ("w",w);
8176
8177 symbol_table.add_stringvar("a",a);
8178 symbol_table.add_stringvar("b",b);
8179 symbol_table.add_stringvar("c",c);
8180 symbol_table.add_stringvar("d",d);
8181 symbol_table.add_stringvar("result",result);
8182
8183 symbol_table.add_function("foo",ovrld_func);
8184
8185 typedef typename overload_func<T>::test_result_t test_result_t;
8186 typedef std::pair<std::string, typename overload_func<T>::test_result_t> test_pack_t;
8187
8188 static const test_pack_t test_pack_list[] =
8189 {
8190 test_pack_t("result := foo(x)" , test_result_t( 0, "T" )),
8191 test_pack_t("result := foo(x, y)" , test_result_t( 1, "TT" )),
8192 test_pack_t("result := foo(x, y, z)" , test_result_t( 2, "TTT" )),
8193 test_pack_t("result := foo(x, y, z, w)" , test_result_t( 3, "TTTT")),
8194 test_pack_t("result := foo(x + y)" , test_result_t( 0, "T" )),
8195 test_pack_t("result := foo(x + y, y + z)" , test_result_t( 1, "TT" )),
8196 test_pack_t("result := foo(x + y, y + z, z + w)" , test_result_t( 2, "TTT" )),
8197 test_pack_t("result := foo(x + y, y + z, z + w, w)" , test_result_t( 3, "TTTT")),
8198 test_pack_t("result := foo(a)" , test_result_t( 4, "S" )),
8199 test_pack_t("result := foo(a, b)" , test_result_t( 5, "SS" )),
8200 test_pack_t("result := foo(a, b, c)" , test_result_t( 6, "SSS" )),
8201 test_pack_t("result := foo(a, b, c, d)" , test_result_t( 7, "SSSS")),
8202 test_pack_t("result := foo(a + b)" , test_result_t( 4, "S" )),
8203 test_pack_t("result := foo(a + b, b + c)" , test_result_t( 5, "SS" )),
8204 test_pack_t("result := foo(a + b, b + c, c + d)" , test_result_t( 6, "SSS" )),
8205 test_pack_t("result := foo(a + b, b + c, c + d, d)" , test_result_t( 7, "SSSS")),
8206 test_pack_t("result := foo(a, x)" , test_result_t( 8, "ST" )),
8207 test_pack_t("result := foo(a, x, b)" , test_result_t( 9, "STS" )),
8208 test_pack_t("result := foo(a, x, b, y)" , test_result_t(10, "STST")),
8209 test_pack_t("result := foo(a + b, x + y)" , test_result_t( 8, "ST" )),
8210 test_pack_t("result := foo(a + b, x + y, b + c)" , test_result_t( 9, "STS" )),
8211 test_pack_t("result := foo(a + b, x + y, b + c, y + z)" , test_result_t(10, "STST")),
8212 test_pack_t("result := foo(x, a)" , test_result_t(11, "TS" )),
8213 test_pack_t("result := foo(x, a, y)" , test_result_t(12, "TST" )),
8214 test_pack_t("result := foo(x, a, y, b)" , test_result_t(13, "TSTS")),
8215 test_pack_t("result := foo(x + y, a + b)" , test_result_t(11, "TS" )),
8216 test_pack_t("result := foo(x + y, a + b, y + z)" , test_result_t(12, "TST" )),
8217 test_pack_t("result := foo(x + y, a + b, y + z, b + c)" , test_result_t(13, "TSTS")),
8218 test_pack_t("result := foo(x, y, a, b)" , test_result_t(14, "TTSS")),
8219 test_pack_t("result := foo(a, b, x, y)" , test_result_t(15, "SSTT")),
8220 test_pack_t("result := foo(a, x, y, b)" , test_result_t(16, "STTS")),
8221 test_pack_t("result := foo(x, a, b, y)" , test_result_t(17, "TSST")),
8222 test_pack_t("result := foo(x + y, y + z, a + b, b + c)" , test_result_t(14, "TTSS")),
8223 test_pack_t("result := foo(a + b, b + c, x + y, y + z)" , test_result_t(15, "SSTT")),
8224 test_pack_t("result := foo(a + b, x + y, y + z, b + c)" , test_result_t(16, "STTS")),
8225 test_pack_t("result := foo(x + y, a + b, b + c, y + z)" , test_result_t(17, "TSST"))
8226 };
8227
8228 static const std::size_t test_pack_list_size = sizeof(test_pack_list) / sizeof(test_pack_t);
8229
8230 std::deque<expression_t> expression_list;
8231
8232 for (std::size_t i = 0; i < test_pack_list_size; ++i)
8233 {
8234 expression_t expression;
8235 expression.register_symbol_table(symbol_table);
8236
8237 exprtk::parser<T> parser;
8238
8239 if (!parser.compile(test_pack_list[i].first, expression))
8240 {
8241 printf("run_test18() - [16] Overload VarArg Error: %s Expression: %s\n",
8242 parser.error().c_str(),
8243 test_pack_list[i].first.c_str());
8244
8245 return false;
8246 }
8247 else
8248 expression_list.push_back(expression);
8249 }
8250
8251 bool error_found = false;
8252
8253 for (std::size_t i = 0; i < expression_list.size(); ++i)
8254 {
8255 ovrld_func.clear();
8256 result = "";
8257 expression_list[i].value();
8258
8259 if (result != "string result")
8260 {
8261 printf("run_test18() - Error in evaluation! (13) Expression: %s\n",
8262 test_pack_list[i].first.c_str());
8263
8264 error_found = true;
8265 }
8266
8267 if (ovrld_func.current_ps_index != test_pack_list[i].second.ps_index)
8268 {
8269 printf("run_test18() - Error with ps_index (13) Expression: %s Expected: %d Got: %d\n",
8270 test_pack_list[i].first.c_str(),
8271 static_cast<int>(test_pack_list[i].second.ps_index),
8272 static_cast<int>(ovrld_func.current_ps_index));
8273
8274 error_found = true;
8275 }
8276
8277 if (ovrld_func.current_param_seq != test_pack_list[i].second.param_seq)
8278 {
8279 printf("run_test18() - Error with parameter seq (13) Expression: %s Expected: %s Got: %s\n",
8280 test_pack_list[i].first.c_str(),
8281 test_pack_list[i].second.param_seq.c_str(),
8282 ovrld_func.current_param_seq.c_str());
8283
8284 error_found = true;
8285 }
8286 }
8287
8288 if (error_found)
8289 {
8290 return false;
8291 }
8292 }
8293
8294 {
8295 typedef exprtk::symbol_table<T> symbol_table_t;
8296 typedef exprtk::expression<T> expression_t;
8297 typedef exprtk::parser<T> parser_t;
8298
8299 typedef std::pair<std::string,std::size_t> rtc_test_t;
8300 static const rtc_test_t rtc_tests[] =
8301 {
8302 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]]; } ", 5 ),
8303 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + 10]; } ", 5 ),
8304 std::make_pair(" x:= 0; for (var i := 0; i < (2 * v[]); i += 1) { x += (v[i] == vv[i]); } ", 10),
8305 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]] := i; } ", 5 ),
8306 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i + v[]] <=> v[i]; } ", 5 ),
8307 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i] <=> v[i + v[]]; } ", 10),
8308 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]]; } ", 5 ),
8309 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + 10]; } ", 5 ),
8310 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]] := i; } ", 5 ),
8311 std::make_pair(" var z[5] := [1]; for (var i := 0; i < z[]; i += 1) { z[i + z[]] <=> z[i]; } ", 5 ),
8312 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*w)[i + v[]]; } ", 10),
8313 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*w)[i+w[]]; } ", 10),
8314 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+w)[i + v[]]; } ", 10),
8315 std::make_pair(" for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+w)[i+w[]]; } ", 10),
8316 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*z)[i+v[]]; } ", 10),
8317 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v*z)[i+w[]]; } ", 9 ),
8318 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+z)[i+v[]]; } ", 10),
8319 std::make_pair(" var z[4] := [1]; for (var i := 0; i < v[]; i += 1) { v[i+v[]] := (v+z)[i+z[]]; } ", 10),
8320 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 ),
8321 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 ),
8322 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 ),
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[0] += xx + yy) == (xx + yy)) ", 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[0] -= xx) == -xx) ", 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 + yy)) == -(xx + yy)) ", 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[1] + qq[2]) == (qq[3 - 1] + qq[2 * 1/2]))", 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[qq[1]] == qq[1]) ", 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[1] += qq[1]) == qq[1 + 1] ", 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[i[1]] + xx) == (xx + qq[i[1]])) ", 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[i[0]] += xx) == xx) ", 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[i[0]] += xx + yy) == (xx + yy)) ", 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[0]] -= xx) == -xx) ", 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 + yy)) == -(xx + yy))", 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[1]] + qq[2]) == (qq[i[3] - i[1]] + qq[i[2] * 1/2]))", 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[qq[i[1]]] == qq[i[1]]) ", 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[1]] += qq[i[1]]) == qq[i[1] + 1] ", 0 ),
8337 };
8338
8339 static const std::size_t rtc_tests_size = sizeof(rtc_tests) / sizeof(rtc_test_t);
8340
8341 bool error_found = false;
8342
8343 for (std::size_t i = 0; i < rtc_tests_size; ++i)
8344 {
8345 const std::string& expression_str = rtc_tests[i].first;
8346
8347 {
8348 T x = 6;
8349 T v[5] = { 0, 1, 2, 3, 4 };
8350 T w[3] = { 0, 1, 2 };
8353
8354 symbol_table_t symbol_table;
8355 expression_t expression;
8356 parser_t parser;
8357
8358 symbol_table.add_variable("x" , x );
8359 symbol_table.add_vector ("v" , v );
8360 symbol_table.add_vector ("w" , w );
8361 symbol_table.add_vector ("vv", vv);
8362 symbol_table.add_vector ("ww", ww);
8363
8365
8366 expression.register_symbol_table(symbol_table);
8367
8368 parser.register_vector_access_runtime_check(vartc);
8369
8370 if (!parser.compile(expression_str, expression))
8371 {
8372 printf("run_test18() - Error: %s\t [1] Expression: %s\n",
8373 parser.error().c_str(),
8374 expression_str.c_str());
8375
8376 error_found = true;
8377 return false;
8378 }
8379
8380 vartc.rtc_count = 0;
8381 expression.value();
8382
8383 if (vartc.rtc_count != rtc_tests[i].second)
8384 {
8385 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [0] Expression: %s\n",
8386 static_cast<unsigned int>(rtc_tests[i].second),
8387 static_cast<unsigned int>(vartc.rtc_count),
8388 expression_str.c_str());
8389 error_found = true;
8390 }
8391 }
8392
8393 {
8394 T x = 6;
8395 T v[5] = { 0, 1, 2, 3, 4 };
8396 T w[3] = { 0, 1, 2 };
8397 T v0[5] = { 0, 1, 2, 3, 4 };
8398 T v1[5] = { 0, 1, 2, 3, 4 };
8401
8402 symbol_table_t symbol_table;
8403 expression_t expression;
8404 parser_t parser;
8405
8406 symbol_table.add_variable("x" , x );
8407 symbol_table.add_vector ("v" , v );
8408 symbol_table.add_vector ("w" , w );
8409 symbol_table.add_vector ("vv", vv);
8410 symbol_table.add_vector ("ww", ww);
8411
8413
8414 expression.register_symbol_table(symbol_table);
8415
8416 parser.register_vector_access_runtime_check(vartc);
8417
8418 if (!parser.compile(expression_str, expression))
8419 {
8420 printf("run_test18() - Error: %s\t [2] Expression: %s\n",
8421 parser.error().c_str(),
8422 expression_str.c_str());
8423
8424 error_found = true;
8425 return false;
8426 }
8427
8428 vartc.rtc_count = 0;
8429 vv.rebase(v0);
8430 expression.value();
8431
8432 if (vartc.rtc_count != rtc_tests[i].second)
8433 {
8434 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [1] Expression: %s\n",
8435 static_cast<unsigned int>(rtc_tests[i].second),
8436 static_cast<unsigned int>(vartc.rtc_count),
8437 expression_str.c_str());
8438 error_found = true;
8439 }
8440
8441 vartc.rtc_count = 0;
8442 vv.rebase(v1);
8443 expression.value();
8444
8445 if (vartc.rtc_count != rtc_tests[i].second)
8446 {
8447 printf("run_test18() - Expected rtc_count: %d got rtc_count: %d [2] Expression: %s\n",
8448 static_cast<unsigned int>(rtc_tests[i].second),
8449 static_cast<unsigned int>(vartc.rtc_count),
8450 expression_str.c_str());
8451 error_found = true;
8452 }
8453 }
8454 }
8455
8456 if (error_found)
8457 {
8458 return false;
8459 }
8460 }
8461
8462 return true;
8463}
8464
8465template <typename T>
8467{
8472
8476
8477 using igenfunct_t::operator();
8478
8479 inline T operator()(std::string& result,
8481 {
8482
8483 result = "depth" + exprtk::details::to_str(static_cast<int>(scalar_t(parameters[0])()));
8484 return T(0);
8485 }
8486};
8487
8488template <typename T>
8490{
8491 typedef exprtk::symbol_table<T> symbol_table_t;
8492 typedef exprtk::expression<T> expression_t;
8493 typedef exprtk::parser<T> parser_t;
8494 typedef exprtk::function_compositor<T> compositor_t;
8495 typedef typename compositor_t::function function_t;
8496
8497 {
8498 T x = T(123.123);
8499
8500 compositor_t compositor;
8501
8502 // f(x) = x + 2
8503 compositor.add(function_t("f", "x + 2", "x"));
8504
8505 // g(x) = x^2-3
8506 compositor.add(function_t("g", "x^2 - 3", "x"));
8507
8508 // fof(x) = f(f(x))
8509 compositor.add(function_t("fof", "f(f(x))", "x"));
8510
8511 // gog(x) = g(g(x))
8512 compositor.add(function_t("gog", "g(g(x))", "x"));
8513
8514 // fog(x) = f(g(x))
8515 compositor.add(function_t("fog", "f(g(x))", "x"));
8516
8517 // gof(x) = g(f(x))
8518 compositor.add(function_t("gof", "g(f(x))", "x"));
8519
8520 // fogof(x) = f(g(f(x)))
8521 compositor.add(function_t("fogof", "f(g(f(x)))", "x"));
8522
8523 // gofog(x) = g(f(g(x)))
8524 compositor.add(function_t("gofog", "g(f(g(x)))", "x"));
8525
8526 symbol_table_t& symbol_table = compositor.symbol_table();
8527 symbol_table.add_constants();
8528 symbol_table.add_variable("x", x);
8529
8530 static const std::string expr_str_list[] =
8531 {
8532 "equal(f(x),(x + 2))",
8533 "equal(g(x),(x^2 - 3))",
8534 "equal(fof(x),(x + 4))",
8535 "equal(gog(x),(x^4 - 6x^2 + 6))",
8536 "equal(fog(x),(x^2 - 1))",
8537 "equal(gof(x),(x^2 + 4x + 1))",
8538 "equal(fogof(x),(x^2 + 4x + 3))",
8539 "equal(gofog(x),(x^4 - 2x^2 - 2))"
8540 };
8541 static const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
8542
8543 std::deque<expression_t> expression_list;
8544
8545 for (std::size_t i = 0; i < expr_str_list_size; ++i)
8546 {
8547 expression_t expression;
8548 expression.register_symbol_table(symbol_table);
8549
8550 parser_t parser;
8551
8552 if (!parser.compile(expr_str_list[i], expression))
8553 {
8554 printf("run_test19() - Error: %s Expression: %s\n",
8555 parser.error().c_str(),
8556 expr_str_list[i].c_str());
8557
8558 return false;
8559 }
8560 else
8561 expression_list.push_back(expression);
8562 }
8563
8564 bool error_found = false;
8565
8566 for (std::size_t i = 0; i < expression_list.size(); ++i)
8567 {
8568 if (T(1) != expression_list[i].value())
8569 {
8570 printf("run_test19() - Error in evaluation! (1) Expression: %s\n",
8571 expr_str_list[i].c_str());
8572
8573 error_found = true;
8574 }
8575 }
8576
8577 if (error_found)
8578 {
8579 return false;
8580 }
8581 }
8582
8583 {
8584 const std::size_t rounds = 100;
8585
8586 for (std::size_t r = 0; r < rounds; ++r)
8587 {
8588 T x = T(1);
8589 T y = T(2);
8590 T z = T(3);
8591 T w = T(4);
8592 T u = T(5);
8593 T v = T(6);
8594
8595 compositor_t compositor;
8596
8597 // f0() = 6
8598 compositor
8599 .add(
8600 function_t("f0")
8601 .expression("3 * 2"));
8602
8603 // f1(x) = 5 * (f0 + x)
8604 compositor
8605 .add(
8606 function_t("f1")
8607 .var("x")
8608 .expression("5 * (f0 + x)"));
8609
8610 // f2(x,y) = 7 * (f1(x) + f1(y))
8611 compositor
8612 .add(
8613 function_t("f2")
8614 .var("x").var("y")
8615 .expression("7 * (f1(x) + f1(y))"));
8616
8617 // f3(x,y,z) = 9 * (f2(x,y) + f2(y,z) + f2(x,z))
8618 compositor
8619 .add(
8620 function_t("f3")
8621 .var("x").var("y").var("z")
8622 .expression("9 * (f2(x,y) + f2(y,z) + f2(x,z))"));
8623
8624 // f4(x,y,z,w) = 11 * (f3(x,y,z) + f3(y,z,w) + f3(z,w,z))
8625 compositor
8626 .add(
8627 function_t("f4")
8628 .var("x").var("y").var("z").var("w")
8629 .expression("11 * (f3(x,y,z) + f3(y,z,w) + f3(z,w,x))"));
8630
8631 // 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))
8632 compositor
8633 .add(
8634 function_t("f5")
8635 .var("x").var("y").var("z").var("w").var("u")
8636 .expression("13 * (f4(x,y,z,w) + f4(y,z,w,u) + f4(z,w,u,x) + f4(w,u,x,y))"));
8637
8638 // 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))
8639 compositor
8640 .add(
8641 function_t("f6")
8642 .var("x").var("y").var("z")
8643 .var("w").var("u").var("v")
8644 .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))"));
8645
8646 symbol_table_t& symbol_table = compositor.symbol_table();
8647 symbol_table.add_constants();
8648 symbol_table.add_variable("x", x);
8649 symbol_table.add_variable("y", y);
8650 symbol_table.add_variable("z", z);
8651 symbol_table.add_variable("w", w);
8652 symbol_table.add_variable("u", u);
8653 symbol_table.add_variable("v", v);
8654
8655 parser_t parser;
8656
8657 const std::string expr_str_list[] =
8658 {
8659 "f0()",
8660 "f1(x)",
8661 "f2(x,x)",
8662 "f3(x,x,x)",
8663 "f4(x,x,x,x)",
8664 "f5(x,x,x,x,x)",
8665 "f6(x,x,x,x,x,x)",
8666 "f2(x,y)",
8667 "f3(x,y,z)",
8668 "f4(x,y,z,w)",
8669 "f5(x,y,z,w,u)",
8670 "f6(x,y,z,w,u,v)"
8671 };
8672
8673 const std::size_t expr_str_list_size = sizeof(expr_str_list) / sizeof(std::string);
8674
8675 const T result_list[] =
8676 {
8677 T(6),
8678 T(35),
8679 T(490),
8680 T(13230),
8681 T(436590),
8682 T(22702680),
8683 T(1543782240),
8684 T(525),
8685 T(15120),
8686 T(533610),
8687 T(29459430),
8688 T(2122700580)
8689 };
8690
8691 bool error_found = false;
8692
8693 for (std::size_t i = 0; i < expr_str_list_size; ++i)
8694 {
8695 expression_t expression;
8696 expression.register_symbol_table(symbol_table);
8697
8698 if (!parser.compile(expr_str_list[i], expression))
8699 {
8700 printf("run_test19() - Error: %s Expression: %s\n",
8701 parser.error().c_str(),
8702 expr_str_list[i].c_str());
8703
8704 error_found = true;
8705 continue;
8706 }
8707
8708 const T result = expression.value();
8709
8710 if (result_list[i] != result)
8711 {
8712 printf("run_test19() - Error in evaluation! (2) Expression: %s Expected: %10.1f\tResult: %10.1f\n",
8713 expr_str_list[i].c_str(),
8714 static_cast<double>(result_list[i]),
8715 static_cast<double>(result));
8716
8717 error_found = true;
8718 continue;
8719 }
8720 }
8721
8722 if (error_found)
8723 {
8724 return false;
8725 }
8726 }
8727 }
8728
8729 {
8730 T x = T(0);
8731
8732 compositor_t compositor;
8733
8734 compositor
8735 .add(
8736 function_t(
8737 "is_prime_impl1",
8738 "if (y == 1,true, "
8739 " if (0 == (x % y),false, "
8740 " is_prime_impl1(x,y - 1))) ",
8741 "x","y"));
8742
8743 compositor
8744 .add(
8745 function_t(
8746 "is_prime1",
8747 "if (frac(x) != 0, false, "
8748 " if (x <= 0, false, "
8749 " is_prime_impl1(x,min(x - 1,trunc(sqrt(x)) + 1)))) ",
8750 "x"));
8751
8752 compositor
8753 .add(
8754 function_t(
8755 "is_prime_impl2",
8756 "switch "
8757 "{ "
8758 " case y == 1 : true; "
8759 " case (x % y) == 0 : false; "
8760 " default : is_prime_impl2(x,y - 1);"
8761 "} ",
8762 "x","y"));
8763
8764 compositor
8765 .add(
8766 function_t(
8767 "is_prime2",
8768 "switch "
8769 "{ "
8770 " case x <= 0 : false; "
8771 " case frac(x) != 0 : false; "
8772 " default : is_prime_impl2(x,min(x - 1,trunc(sqrt(x)) + 1));"
8773 "} ",
8774 "x"));
8775
8776 compositor
8777 .add(
8778 function_t(
8779 "is_prime_impl3",
8780 "while (y > 0) "
8781 "{ "
8782 " switch "
8783 " { "
8784 " case y == 1 : ~(y := 0, true);"
8785 " case (x % y) == 0 : ~(y := 0,false);"
8786 " default : y := y - 1; "
8787 " } "
8788 "} ",
8789 "x","y"));
8790
8791 compositor
8792 .add(
8793 function_t(
8794 "is_prime3",
8795 "switch "
8796 "{ "
8797 " case x <= 0 : false; "
8798 " case frac(x) != 0 : false; "
8799 " default : is_prime_impl3(x,min(x - 1,trunc(sqrt(x)) + 1));"
8800 "} ",
8801 "x"));
8802
8803 compositor
8804 .add(
8805 function_t(
8806 "is_prime_impl4",
8807 "switch "
8808 "{ "
8809 " case 1 == x : false; "
8810 " case 2 == x : true; "
8811 " case 3 == x : true; "
8812 " case 5 == x : true; "
8813 " case 7 == x : true; "
8814 " case 0 == x % 2 : false; "
8815 " default : "
8816 " { "
8817 " for (var i := 3; i < y; i += 2) "
8818 " { "
8819 " if ((x % i) == 0) "
8820 " break[false]; "
8821 " else "
8822 " true; "
8823 " } "
8824 " }; "
8825 "} ",
8826 "x","y"));
8827
8828 compositor
8829 .add(
8830 function_t(
8831 "is_prime4",
8832 "switch "
8833 "{ "
8834 " case x <= 0 : false; "
8835 " case frac(x) != 0 : false; "
8836 " default : is_prime_impl4(x,min(x - 1,trunc(sqrt(x)) + 1));"
8837 "} ",
8838 "x"));
8839
8840 symbol_table_t& symbol_table = compositor.symbol_table();
8841 symbol_table.add_constants();
8842 symbol_table.add_variable("x",x);
8843
8844 const std::string expression_str[] =
8845 {
8846 "is_prime1(x)",
8847 "is_prime2(x)",
8848 "is_prime3(x)",
8849 "is_prime4(x)"
8850 };
8851
8852 const std::size_t expression_count = sizeof(expression_str) / sizeof(std::string);
8853
8854 std::vector<expression_t> expression_list;
8855
8856 for (std::size_t i = 0; i < expression_count; ++i)
8857 {
8858 parser_t parser;
8859
8860 expression_t expression;
8861 expression.register_symbol_table(symbol_table);
8862
8863 if (!parser.compile(expression_str[i],expression))
8864 {
8865 printf("run_test19() - Error: %s Expression%d: %s\n",
8866 parser.error().c_str(),
8867 static_cast<unsigned int>(i),
8868 expression_str[i].c_str());
8869
8870 return false;
8871 }
8872 else
8873 expression_list.push_back(expression);
8874 }
8875
8876 bool error_found = false;
8877
8878 const std::size_t prime_list[] =
8879 {
8880 2, 3, 5, 7, 11, 13, 17, 19,
8881 877, 947, 1087, 1153, 1229, 1297, 1381, 1453,
8882 1523, 1597, 1663, 1741, 1823, 1901, 1993, 2063,
8883 2131, 2221, 2293, 2371, 2437, 2539, 2621, 2689,
8884 2749, 2833, 2909, 3001, 3083, 3187, 3259, 3343,
8885 3433, 3517, 3581, 3659, 3733, 3823, 3911, 4001,
8886 4073, 4153, 4241, 4327, 4421, 4507, 4591, 4663,
8887 4759, 4861, 4943, 5009, 5099, 5189, 5281, 5393,
8888 5449, 5527, 5641, 5701, 5801, 5861, 5953, 6067,
8889 6143, 6229, 6311, 6373, 6481, 6577, 6679, 6763,
8890 6841, 6947, 7001, 7109, 7211, 7307, 7417, 7507,
8891 104309, 104311, 104323, 104327, 104347, 104369, 104381, 104383,
8892 104393, 104399, 104417, 104459, 104471, 104473, 104479, 104491,
8893 104513, 104527, 104537, 104543, 104549, 104551, 104561, 104579,
8894 104593, 104597, 104623, 104639, 104651, 104659, 104677, 104681,
8895 104683, 104693, 104701, 104707, 104711, 104717, 104723, 104729,
8896 1000621, 1000639, 1000651, 1000667, 1000669, 1001023, 1001027, 1001041
8897 };
8898
8899 const std::size_t prime_list_size = sizeof(prime_list) / sizeof(std::size_t);
8900
8901 for (std::size_t i = 0; (i < prime_list_size) && (!error_found); ++i)
8902 {
8903 x = static_cast<T>(prime_list[i]);
8904
8905 std::vector<T> result(expression_count,T(0));
8906
8907 for (std::size_t j = 0; j < expression_list.size(); ++j)
8908 {
8909 result[j] = expression_list[j].value();
8910 }
8911
8912 for (std::size_t j = 1; j < expression_list.size(); ++j)
8913 {
8914 if (result[j] != result[0])
8915 {
8916 error_found = true;
8917 break;
8918 }
8919 }
8920
8921 if (error_found)
8922 {
8923 printf("run_test19() - Error in evaluation! (3) Results don't match! Prime: %d\n",
8924 static_cast<unsigned int>(prime_list[i]));
8925
8926 for (std::size_t j = 0; j < expression_list.size(); ++j)
8927 {
8928 printf("Expression[%02d]: %s = %d\n",
8929 static_cast<unsigned int>(j),
8930 expression_str[j].c_str(),
8931 static_cast<unsigned int>(result[j]));
8932 }
8933 }
8934 else if (T(1) != expression_list[0].value())
8935 {
8936 printf("run_test19() - Error in evaluation! (4) Results don't match! Prime: %d\n",
8937 static_cast<unsigned int>(prime_list[i]));
8938
8939 for (std::size_t j = 0; j < expression_list.size(); ++j)
8940 {
8941 printf("Expression[%02d]: %s = %d\n",
8942 static_cast<unsigned int>(j),
8943 expression_str[j].c_str(),
8944 static_cast<unsigned int>(result[j]));
8945 }
8946 }
8947 }
8948
8949 if (error_found)
8950 {
8951 return false;
8952 }
8953 }
8954
8955 {
8956 T x = T(0);
8957
8958 compositor_t compositor;
8959
8960 compositor
8961 .add(
8962 function_t(
8963 "fibonacci1",
8964 "if (x == 0,0, "
8965 " if (x == 1,1, "
8966 " fibonacci1(x - 1) + fibonacci1(x - 2)))",
8967 "x"));
8968
8969 compositor
8970 .add(
8971 function_t(
8972 "fibonacci2",
8973 "switch "
8974 "{ "
8975 " case x == 0 : 0; "
8976 " case x == 1 : 1; "
8977 " default : fibonacci2(x - 1) + fibonacci2(x - 2);"
8978 "} ",
8979 "x"));
8980
8981 compositor
8982 .add(
8983 function_t(
8984 "fibonacci_impl3",
8985 "switch "
8986 "{ "
8987 " case x == 0 : 0; "
8988 " case x == 1 : 1; "
8989 " default : "
8990 " while ((x := (x - 1)) > 0) "
8991 " { "
8992 " w := z; "
8993 " z := z + y; "
8994 " y := w; "
8995 " z "
8996 " }; "
8997 "} ",
8998 "x","y","z","w"));
8999
9000 compositor
9001 .add(
9002 function_t(
9003 "fibonacci3",
9004 "fibonacci_impl3(x,0,1,0)",
9005 "x"));
9006
9007 compositor
9008 .add(
9009 function_t(
9010 "fibonacci_impl4",
9011 "switch "
9012 "{ "
9013 " case x == 0 : 0; "
9014 " case x == 1 : 1; "
9015 " default : "
9016 " repeat "
9017 " w := z; "
9018 " z := z + y; "
9019 " y := w; "
9020 " x := x - 1; "
9021 " z "
9022 " until (x <= 1); "
9023 "} ",
9024 "x","y","z","w"));
9025
9026 compositor
9027 .add(
9028 function_t(
9029 "fibonacci4",
9030 "fibonacci_impl4(x,0,1,0)",
9031 "x"));
9032
9033 compositor
9034 .add(
9035 function_t(
9036 "fibonacci5",
9037 "if ((x == 0) or (x == 1)) "
9038 " x; "
9039 "else "
9040 " fibonacci5(x - 1) + fibonacci5(x - 2); ",
9041 "x"));
9042
9043 symbol_table_t& symbol_table = compositor.symbol_table();
9044
9045 symbol_table.add_constants();
9046 symbol_table.add_variable("x",x);
9047
9048 const std::string expression_str[] =
9049 {
9050 "fibonacci1(x)",
9051 "fibonacci2(x)",
9052 "fibonacci3(x)",
9053 "fibonacci4(x)",
9054 "fibonacci5(x)"
9055 };
9056
9057 const std::size_t expression_count = sizeof(expression_str) / sizeof(std::string);
9058
9059 std::vector<expression_t> expression_list;
9060
9061 for (std::size_t i = 0; i < expression_count; ++i)
9062 {
9063 parser_t parser;
9064
9065 expression_t expression;
9066 expression.register_symbol_table(symbol_table);
9067
9068 if (!parser.compile(expression_str[i],expression))
9069 {
9070 printf("run_test19() - Error: %s Expression[%02d]: %s\n",
9071 parser.error().c_str(),
9072 static_cast<unsigned int>(i),
9073 expression_str[i].c_str());
9074
9075 return false;
9076 }
9077 else
9078 expression_list.push_back(expression);
9079 }
9080
9081 bool error_found = false;
9082
9083 const std::size_t fibonacci_list[] =
9084 {
9085 0, 1, 1, 2,
9086 3, 5, 8, 13,
9087 21, 34, 55, 89,
9088 144, 233, 377, 610,
9089 987, 1597, 2584, 4181,
9090 6765, 10946, 17711, 28657,
9091 46368, 75025, 121393, 196418,
9092 317811, 514229, 832040, 1346269
9093 };
9094
9095 const std::size_t fibonacci_list_size = sizeof(fibonacci_list) / sizeof(std::size_t);
9096
9097 for (std::size_t i = 0; (i < fibonacci_list_size) && (!error_found); ++i)
9098 {
9099 x = static_cast<T>(i);
9100
9101 std::vector<T> result(expression_count,T(0));
9102
9103 for (std::size_t j = 0; j < expression_list.size(); ++j)
9104 {
9105 result[j] = expression_list[j].value();
9106 }
9107
9108 for (std::size_t j = 1; j < expression_list.size(); ++j)
9109 {
9110 if (result[j] != result[0])
9111 {
9112 error_found = true;
9113 break;
9114 }
9115 }
9116
9117 if (error_found)
9118 {
9119 printf("run_test19() - Error in evaluation! (5) Results don't match! fibonacci(%d) = %d\n",
9120 static_cast<unsigned int>(i),
9121 static_cast<unsigned int>(fibonacci_list[i]));
9122
9123 for (std::size_t j = 0; j < expression_list.size(); ++j)
9124 {
9125 printf("Expression[%02d]: %s = %d\n",
9126 static_cast<unsigned int>(j),
9127 expression_str[j].c_str(),
9128 static_cast<unsigned int>(result[j]));
9129 }
9130 }
9131 else if (fibonacci_list[i] != expression_list[0].value())
9132 {
9133 printf("run_test19() - Error in evaluation! (6) Results don't match! fibonacci(%d) = %d\n",
9134 static_cast<unsigned int>(i),
9135 static_cast<unsigned int>(fibonacci_list[i]));
9136
9137 for (std::size_t j = 0; j < expression_list.size(); ++j)
9138 {
9139 printf("Expression[%02d]: %s = %d\n",
9140 static_cast<unsigned int>(j),
9141 expression_str[j].c_str(),
9142 static_cast<unsigned int>(result[j]));
9143 }
9144 }
9145 }
9146
9147 if (error_found)
9148 {
9149 return false;
9150 }
9151 }
9152
9153 {
9154 T x = T(0);
9155
9156 symbol_table_t symbol_table;
9157
9158 symbol_table.add_constants();
9159 symbol_table.add_variable("x",x);
9160
9161 compositor_t compositor(symbol_table);
9162
9163 compositor
9164 .add(
9165 function_t(
9166 "newton_sqrt_impl",
9167 "switch "
9168 "{ "
9169 " case x < 0 : -inf; "
9170 " case x == 0 : 0; "
9171 " case x == 1 : 1; "
9172 " default: "
9173 " ~{ "
9174 " z := 100; "
9175 " y := x / 2; "
9176 " repeat "
9177 " y := (1 / 2) * (y + (x / y)); "
9178 " if (equal(y * y,x)) "
9179 " break[y]; "
9180 " until ((z -= 1) <= 0); "
9181 " }; "
9182 "} ",
9183 "x","y","z"));
9184
9185 compositor
9186 .add(
9187 function_t(
9188 "newton_sqrt",
9189 "newton_sqrt_impl(x,0,0)","x"));
9190
9191 std::string expression_str = "newton_sqrt(x)";
9192
9193 expression_t expression;
9194
9195 expression.register_symbol_table(symbol_table);
9196
9197 parser_t parser;
9198
9199 if (!parser.compile(expression_str,expression))
9200 {
9201 printf("run_test19() - Error: %s Expression: %s\n",
9202 parser.error().c_str(),
9203 expression_str.c_str());
9204
9205 return false;
9206 }
9207
9208 bool error_found = false;
9209
9210 for (std::size_t i = 0; i < 100; ++i)
9211 {
9212 x = static_cast<T>(i);
9213
9214 const T result = expression.value();
9215
9216 if (not_equal(result, real::sqrt(x), T(0.0000001)))
9217 {
9218 printf("run_test19() - Computation Error "
9219 "Expression: [%s]\tExpected: %12.8f\tResult: %12.8f\n",
9220 expression_str.c_str(),
9221 static_cast<double>(real::sqrt(x)),
9222 static_cast<double>(result));
9223
9224 error_found = true;
9225 }
9226 }
9227
9228 if (error_found)
9229 {
9230 return false;
9231 }
9232 }
9233
9234 {
9235 symbol_table_t symbol_table;
9236
9237 symbol_table.add_constants();
9238
9239 compositor_t compositor(symbol_table);
9240
9241 compositor
9242 .add(
9243 function_t(
9244 "mandelbrot",
9245 " var width := 118; "
9246 " var height := 41; "
9247 " var imag_max := +1; "
9248 " var imag_min := -1; "
9249 " var real_max := +1; "
9250 " var real_min := -2.5; "
9251 " var x_step := (real_max - real_min) / width; "
9252 " var y_step := (imag_max - imag_min) / height; "
9253 " for (var y := 0; y < height; y += 1) "
9254 " { "
9255 " var imag := imag_min + (y_step * y); "
9256 " for (var x := 0; x < width; x += 1) "
9257 " { "
9258 " var real := real_min + x_step * x; "
9259 " var z_real := real; "
9260 " var z_imag := imag; "
9261 " var plot_value; "
9262 " for (var n := 0; n < 30; n += 1) "
9263 " { "
9264 " var a := z_real^2; "
9265 " var b := z_imag^2; "
9266 " plot_value := n; "
9267 " if ((a + b) < 4) "
9268 " { "
9269 " z_imag := 2 * z_real * z_imag + imag; "
9270 " z_real := a - b + real; "
9271 " } "
9272 " else "
9273 " break; "
9274 " }; "
9275 " }; "
9276 " } "));
9277
9278 std::string expression_str = "mandelbrot()";
9279
9280 expression_t expression;
9281
9282 expression.register_symbol_table(symbol_table);
9283
9284 parser_t parser;
9285
9286 if (!parser.compile(expression_str,expression))
9287 {
9288 printf("run_test19() - Error: %s Expression: %s\n",
9289 parser.error().c_str(),
9290 expression_str.c_str());
9291
9292 return false;
9293 }
9294
9295 for (std::size_t i = 0; i < 100; ++i)
9296 {
9297 expression.value();
9298 }
9299 }
9300
9301 {
9302 T x = T(0);
9303
9304 symbol_table_t symbol_table;
9305
9306 symbol_table.add_variable("x",x);
9307
9308 compositor_t compositor(symbol_table);
9309
9310 compositor
9311 .add(
9312 function_t(
9313 "fooboo",
9314 " var x := input; "
9315 " if (x > 0) "
9316 " fooboo(x - 1) + x; "
9317 " else "
9318 " 0; ",
9319 "input"));
9320
9321 std::string expression_str = "fOoBoO(x)";
9322
9323 expression_t expression;
9324
9325 expression.register_symbol_table(symbol_table);
9326
9327 parser_t parser;
9328
9329 if (!parser.compile(expression_str,expression))
9330 {
9331 printf("run_test19() - Error: %s Expression: %s\n",
9332 parser.error().c_str(),
9333 expression_str.c_str());
9334
9335 return false;
9336 }
9337
9338 T sum = T(0);
9339
9340 for (std::size_t i = 0; i < 100; ++i)
9341 {
9342 x = T(i);
9343
9344 sum += x;
9345
9346 const T result = expression.value();
9347
9348 if (result != sum)
9349 {
9350 printf("run_test19() - FooBoo(%5.2f) Expected: %5.2f\tResult: %5.2f\n",
9351 static_cast<double>(x),
9352 static_cast<double>(sum),
9353 static_cast<double>(result));
9354
9355 return false;
9356 }
9357 }
9358 }
9359
9360 {
9361 const std::pair<std::string,std::string> test_funcprog[] =
9362 {
9363 std::make_pair
9364 (
9365 " var s := depth_to_str(depth); "
9366 " "
9367 " if (depth > 0) "
9368 " { "
9369 " if (recursive(depth - 1) == false) "
9370 " { "
9371 " return [false]; "
9372 " } "
9373 " }; "
9374 " "
9375 " s == depth_to_str(depth); ",
9376
9377 " recursive(1000) "
9378 ),
9379
9380 std::make_pair
9381 (
9382 " var v[7] := [ depth ]; "
9383 " "
9384 " if (depth > 0) "
9385 " { "
9386 " if (recursive(depth - 1) == false) "
9387 " { "
9388 " return [false]; "
9389 " } "
9390 " }; "
9391 " "
9392 " return [sum(v == depth) == v[]]; ",
9393
9394 " recursive(1000) "
9395 ),
9396
9397 std::make_pair
9398 (
9399 " var v1[ 7] := [ depth ]; "
9400 " var v2[21] := [ depth ]; "
9401 " "
9402 " if (depth > 0) "
9403 " { "
9404 " if (recursive(depth - 1) == false) "
9405 " { "
9406 " return [false]; "
9407 " } "
9408 " }; "
9409 " "
9410 " (sum(v1 == depth) == v1[]) and "
9411 " (sum(v2 == depth) == v2[]) ; "
9412 " ",
9413
9414 " recursive(1000) "
9415 ),
9416
9417 std::make_pair
9418 (
9419 " var s := depth_to_str(depth); "
9420 " "
9421 " for (var i := 0; i < 2; i += 1) "
9422 " { "
9423 " if (depth > 0) "
9424 " { "
9425 " if (recursive(depth - 1) == false) "
9426 " { "
9427 " return [false]; "
9428 " } "
9429 " }; "
9430 " }; "
9431 " "
9432 " s == depth_to_str(depth); ",
9433
9434 " recursive(20) "
9435 ),
9436
9437 std::make_pair
9438 (
9439 " var s := depth_to_str(depth); "
9440 " "
9441 " for (var i := 0; i < 2; i += 1) "
9442 " { "
9443 " for (var j := 0; j < 2; j += 1) "
9444 " { "
9445 " if (depth > 0) "
9446 " { "
9447 " if (recursive(depth - 1) == false) "
9448 " { "
9449 " return [false]; "
9450 " } "
9451 " }; "
9452 " }; "
9453 " }; "
9454 " "
9455 " s == depth_to_str(depth); ",
9456
9457 " recursive(10) "
9458 ),
9459
9460 std::make_pair
9461 (
9462 " var v[7] := [ depth ]; "
9463 " "
9464 " for (var i := 0; i < 2; i += 1) "
9465 " { "
9466 " var w[21] := [ depth + 1 ]; "
9467 " "
9468 " if (depth > 0) "
9469 " { "
9470 " if (recursive(depth - 1) == false) "
9471 " { "
9472 " return [false]; "
9473 " } "
9474 " }; "
9475 " "
9476 " if (sum(w == (depth + 1)) != w[]) "
9477 " { "
9478 " return [false]; "
9479 " }; "
9480 " }; "
9481 " "
9482 " return [sum(v == depth) == v[]]; ",
9483
9484 " recursive(5) "
9485 ),
9486
9487 std::make_pair
9488 (
9489 " var v[7] := [ depth ]; "
9490 " "
9491 " for (var i := 0; i < 2; i += 1) "
9492 " { "
9493 " var u[21] := [ depth + 1 ]; "
9494 " "
9495 " for (var j := 0; j < 2; j += 1) "
9496 " { "
9497 " var w[35] := [ depth + 2 ]; "
9498 " "
9499 " if (depth > 0) "
9500 " { "
9501 " if (recursive(depth - 1) == false) "
9502 " { "
9503 " return [false]; "
9504 " } "
9505 " }; "
9506 " "
9507 " if (sum(w == (depth + 2)) != w[]) "
9508 " { "
9509 " return [false]; "
9510 " }; "
9511 " }; "
9512 " "
9513 " if (sum(u == (depth + 1)) != u[]) "
9514 " { "
9515 " return [false]; "
9516 " }; "
9517 " }; "
9518 " "
9519 " return [sum(v == depth) == v[]]; ",
9520
9521 " recursive(5) "
9522 ),
9523
9524 std::make_pair
9525 (
9526 " var s := depth_to_str(depth); "
9527 " var v[7] := [ depth ]; "
9528 " "
9529 " if (depth > 0) "
9530 " { "
9531 " if (recursive(depth - 1) == false) "
9532 " { "
9533 " return [false]; "
9534 " } "
9535 " }; "
9536 " "
9537 " return "
9538 " [ "
9539 " (s == depth_to_str(depth)) and "
9540 " (sum(v == depth) == v[]) "
9541 " ]; ",
9542
9543 " recursive(1000) "
9544 ),
9545
9546 std::make_pair
9547 (
9548 " var s0 := depth_to_str(depth); "
9549 " var v0[7] := [ depth ]; "
9550 " var s1 := depth_to_str(depth); "
9551 " var v1[42] := [ depth ]; "
9552 " "
9553 " if (depth > 0) "
9554 " { "
9555 " if (recursive(depth - 1) == false) "
9556 " { "
9557 " return [false]; "
9558 " } "
9559 " }; "
9560 " "
9561 " return "
9562 " [ "
9563 " (s0 == depth_to_str(depth)) and "
9564 " (sum(v0 == depth) == v0[]) and "
9565 " (s1 == depth_to_str(depth)) and "
9566 " (sum(v1 == depth) == v1[]) "
9567 " ]; ",
9568
9569 " recursive(1000) "
9570 ),
9571
9572 std::make_pair
9573 (
9574 " var s := depth_to_str(depth); "
9575 " var v[7] := [ depth ]; "
9576 " "
9577 " for (var i := 0; i < 2; i += 1) "
9578 " { "
9579 " if (depth > 0) "
9580 " { "
9581 " if (recursive(depth - 1) == false) "
9582 " { "
9583 " return [false]; "
9584 " } "
9585 " }; "
9586 " }; "
9587 " "
9588 " return "
9589 " [ "
9590 " (s == depth_to_str(depth)) and "
9591 " (sum(v == depth) == v[]) "
9592 " ]; ",
9593
9594 " recursive(15) "
9595 ),
9596
9597 std::make_pair
9598 (
9599 " var s0 := depth_to_str(depth); "
9600 " var v0[7] := [ depth ]; "
9601 " var s1 := depth_to_str(depth); "
9602 " var v1[42] := [ depth ]; "
9603 " "
9604 " for (var i := 0; i < 2; i += 1) "
9605 " { "
9606 " if (depth > 0) "
9607 " { "
9608 " if (recursive(depth - 1) == false) "
9609 " { "
9610 " return [false]; "
9611 " } "
9612 " }; "
9613 " }; "
9614 " "
9615 " return "
9616 " [ "
9617 " (s0 == depth_to_str(depth)) and "
9618 " (sum(v0 == depth) == v0[]) and "
9619 " (s1 == depth_to_str(depth)) and "
9620 " (sum(v1 == depth) == v1[]) "
9621 " ]; ",
9622
9623 " recursive(15) "
9624 ),
9625
9626 std::make_pair
9627 (
9628 " var s0 := depth_to_str(depth); "
9629 " var v0[7] := [ depth ]; "
9630 " "
9631 " for (var i := 0; i < 2; i += 1) "
9632 " { "
9633 " var s1 := depth_to_str(depth); "
9634 " var v1[21] := [ depth + 1 ]; "
9635 " "
9636 " if (depth > 0) "
9637 " { "
9638 " if (recursive(depth - 1) == false) "
9639 " { "
9640 " return [false]; "
9641 " } "
9642 " }; "
9643 " "
9644 " if (s1 != depth_to_str(depth)) "
9645 " { "
9646 " return [false]; "
9647 " }; "
9648 " "
9649 " if (sum(v1 == (depth + 1)) != v1[]) "
9650 " { "
9651 " return [false]; "
9652 " }; "
9653 " }; "
9654 " "
9655 " return "
9656 " [ "
9657 " (s0 == depth_to_str(depth)) and "
9658 " (sum(v0 == depth) == v0[]) "
9659 " ]; ",
9660
9661 " recursive(15) "
9662 ),
9663
9664 std::make_pair
9665 (
9666 " if (depth < 2) "
9667 " depth; "
9668 " else "
9669 " recursive(depth - 1) + "
9670 " recursive(depth - 2) ; ",
9671
9672 " var n := 20; "
9673 " var total := 0; "
9674 " "
9675 " for (var i := 0; i < n; i += 1) "
9676 " { "
9677 " total += recursive(i); "
9678 " }; "
9679 " "
9680 " total == 10945; "
9681 )
9682 };
9683
9684 const std::size_t test_funcprog_size = sizeof(test_funcprog) / sizeof(std::pair<std::string,std::string>);
9685 const std::size_t rounds = 5;
9686
9687 bool result = true;
9688
9689 for (std::size_t r = 0; r < rounds; ++r)
9690 {
9691 for (std::size_t i = 0; i < test_funcprog_size; ++i)
9692 {
9693 depth_to_str<T> dts;
9694
9695 symbol_table_t symbol_table;
9696 symbol_table.add_function("depth_to_str",dts);
9697
9698 compositor_t compositor(symbol_table);
9699
9700 const bool comp_result = compositor.add(
9701 function_t("recursive")
9702 .var("depth")
9703 .expression
9704 ( test_funcprog[i].first ));
9705
9706 if (!comp_result)
9707 {
9708 printf("run_test19() - Compositor Error: %s\nfunction: %s\n",
9709 compositor.error().c_str(),
9710 test_funcprog[i].first.c_str());
9711
9712 result = false;
9713 continue;
9714 }
9715
9716 expression_t expression;
9717 expression.register_symbol_table(symbol_table);
9718
9719 parser_t parser;
9720
9721 if (!parser.compile(test_funcprog[i].second, expression))
9722 {
9723 printf("run_test19() - Error: %s Expression: %s\n",
9724 parser.error().c_str(),
9725 test_funcprog[i].second.c_str());
9726
9727 result = false;
9728 continue;
9729 }
9730
9731 if (T(1) != expression.value())
9732 {
9733 printf("run_test19() - Evaluation Error: test_funcprog %d function: %s\n",
9734 static_cast<int>(i),
9735 test_funcprog[i].second.c_str());
9736
9737 result = false;
9738 continue;
9739 }
9740 }
9741
9742 if (!result)
9743 {
9744 return false;
9745 }
9746 }
9747 }
9748
9749 {
9750 symbol_table_t symbol_table;
9751
9752 symbol_table.add_constants();
9753
9754 const std::string expression_string =
9755 " var sieve[10^7] := [false]; "
9756 " var m := trunc(sqrt(sieve[])); "
9757 " "
9758 " sieve[0] := true; "
9759 " sieve[1] := true; "
9760 " "
9761 " for (var i := 0; i <= m; i += 1) "
9762 " { "
9763 " if (false == sieve[i]) "
9764 " { "
9765 " for (var j := (i * i); j < sieve[]; j += i) "
9766 " { "
9767 " sieve[j] := true; "
9768 " } "
9769 " } "
9770 " }; "
9771 " "
9772 " var prime_count := 0; "
9773 " for (var i := 0; i < sieve[]; i += 1) "
9774 " { "
9775 " if (false == sieve[i]) "
9776 " { "
9777 " prime_count += 1; "
9778 " }; "
9779 " }; "
9780 " "
9781 " prime_count == 664579; ";
9782
9783 expression_t expression;
9784
9785 expression.register_symbol_table(symbol_table);
9786
9787 parser_t parser;
9788
9789 if (!parser.compile(expression_string,expression))
9790 {
9791 printf("run_test19() - Error: %s Expression: %s\n",
9792 parser.error().c_str(),
9793 expression_string.c_str());
9794
9795 return false;
9796 }
9797
9798 if (T(1) != expression.value())
9799 {
9800 printf("run_test19() - Prime Sieve Computation Error");
9801
9802 return false;
9803 }
9804 }
9805
9806 {
9807 symbol_table_t symbol_table;
9808
9809 symbol_table.add_constants();
9810
9811 const std::string expression_str[] =
9812 {
9813 "var delta := 10^-7; var total := 0; for (var i := 0; i <= 3; i += delta) { total += "
9814 "erf(i) }; abs((delta * total) - (3 * erf(3) + (1 / exp(9) - 1) / sqrt(pi))) < 0.000001",
9815
9816 "var delta := 10^-7; var total := 0; for (var i := 0; i <= 3; i += delta) { total += "
9817 "erfc(i) }; abs((delta * total) - (3 * erfc(3) + ((1 - 1 / exp(9)) / sqrt(pi)))) < 0.000001"
9818 };
9819
9820 expression_t e[2];
9821
9822 parser_t parser;
9823
9824 for (std::size_t i = 0; i < 2; ++i)
9825 {
9826 e[i].register_symbol_table(symbol_table);
9827
9828 if (!parser.compile(expression_str[i],e[i]))
9829 {
9830 printf("run_test19() - Error: %s Expression: %s\n",
9831 parser.error().c_str(),
9832 expression_str[i].c_str());
9833
9834 return false;
9835 }
9836
9837 if (T(1) != e[i].value())
9838 {
9839 printf("run_test19() - erf/erfc computation error %d",
9840 static_cast<unsigned int>(i));
9841
9842 return false;
9843 }
9844 }
9845 }
9846
9847 return true;
9848}
9849
9850template <typename T>
9852{
9855
9856 using usr_t::process;
9857
9858 bool process(const std::string& unknown_symbol,
9859 usr_symbol_type& st,
9860 T& default_value,
9861 std::string& error_message) exprtk_test_override
9862 {
9863 if (unknown_symbol[0] == 'v')
9864 {
9866 default_value = next_value();
9867 error_message.clear();
9868
9869 return true;
9870 }
9871 else if (unknown_symbol[0] == 'c')
9872 {
9874 default_value = next_value();
9875 error_message.clear();
9876
9877 return true;
9878 }
9879 else
9880 {
9881 error_message = "Unknown symbol...";
9882 return false;
9883 }
9884 }
9885
9886 T next_value(const bool reset = false)
9887 {
9888 static T value = 0;
9889
9890 if (reset)
9891 return (value = 0);
9892 else
9893 return ++value;
9894 }
9895};
9896
9897template <typename T>
9899{
9902
9903 using usr_t::process;
9904
9908
9909 bool process(const std::string& unknown_symbol,
9910 symbol_table_t& symbol_table,
9911 std::string& error_message) exprtk_test_override
9912 {
9913 bool result = false;
9914
9915 if (unknown_symbol[0] == 'v')
9916 {
9917 static T var_default_value = 1.0;
9918
9919 if ((result = symbol_table.create_variable(unknown_symbol, var_default_value++)) == false)
9920 {
9921 error_message = "Failed to create variable(" + unknown_symbol + ") in primary symbol table";
9922 }
9923 }
9924 else if (unknown_symbol[0] == 'c')
9925 {
9926 static T cvar_default_value = 1.0;
9927
9928 if ((result = symbol_table.add_constant(unknown_symbol, cvar_default_value++)) == false)
9929 {
9930 error_message = "Failed to create const variable(" + unknown_symbol + ") in primary symbol table";
9931 }
9932 }
9933 else if (0 == unknown_symbol.find("foo"))
9934 {
9935 //functions of form: fooXX
9936 if (4 >= unknown_symbol.size())
9937 {
9938 switch(unknown_symbol[3])
9939 {
9940 case '1' : result = symbol_table.add_function(unknown_symbol,foo1);
9941 break;
9942
9943 case '2' : result = symbol_table.add_function(unknown_symbol,foo2);
9944 break;
9945
9946 case '3' : result = symbol_table.add_function(unknown_symbol,foo3);
9947 break;
9948
9949 case '4' : result = symbol_table.add_function(unknown_symbol,foo4);
9950 break;
9951
9952 case '5' : result = symbol_table.add_function(unknown_symbol,foo5);
9953 break;
9954
9955 case '6' : result = symbol_table.add_function(unknown_symbol,foo6);
9956 break;
9957 }
9958 }
9959
9960 if (!result)
9961 {
9962 error_message = "Failed to add function(" + unknown_symbol + ") in primary symbol table";
9963 }
9964 }
9965 else
9966 error_message = "Indeterminable symbol type.";
9967
9968 return result;
9969 }
9970};
9971
9972template <typename T>
9974{
9975 typedef exprtk::expression<T> expression_t;
9976
9977 {
9978 for (std::size_t i = 0; i < 100; ++i)
9979 {
9980 exprtk::symbol_table<T> symbol_table0; // primary symbol_table
9981 exprtk::symbol_table<T> symbol_table1;
9982 exprtk::symbol_table<T> symbol_table2;
9983 exprtk::symbol_table<T> symbol_table3;
9984
9985 symbol_table0.add_constants();
9986
9987 expression_t expression;
9988 expression.register_symbol_table(symbol_table0);
9989 expression.register_symbol_table(symbol_table1);
9990 expression.register_symbol_table(symbol_table2);
9991 expression.register_symbol_table(symbol_table3);
9992
9993 exprtk::parser<T> parser;
9994
9995 my_usr<T> musr;
9996 musr.next_value(true);
9997 parser.enable_unknown_symbol_resolver(&musr);
9998
9999 std::string expr_str = "v01+c02+v03+c04+v05+c06+v07+c08+v09+c10+"
10000 "v11+c12+v13+c14+v15+c16+v17+c18+v19+c20+"
10001 "v21+c22+v23+c24+v25+c26+v27+c28+v29+c30 ";
10002
10003 if (!parser.compile(expr_str,expression))
10004 {
10005 printf("run_test20() - [1] Error: %s Expression: %s\n",
10006 parser.error().c_str(),
10007 expr_str.c_str());
10008
10009 return false;
10010 }
10011
10012 T sum_1_30 = T((1 + 30) * 15);
10013 T result = expression.value();
10014
10015 if (sum_1_30 != result)
10016 {
10017 printf("run_test20() - [1] Error in evaluation! (1) Expression: %s\n",
10018 expr_str.c_str());
10019
10020 return false;
10021 }
10022 }
10023 }
10024
10025 {
10026 for (std::size_t i = 0; i < 100; ++i)
10027 {
10028 exprtk::symbol_table<T> symbol_table0; // primary symbol_table
10029 exprtk::symbol_table<T> symbol_table1;
10030 exprtk::symbol_table<T> symbol_table2;
10031 exprtk::symbol_table<T> symbol_table3;
10032
10033 symbol_table0.add_constants();
10034
10035 expression_t expression;
10036 expression.register_symbol_table(symbol_table0);
10037 expression.register_symbol_table(symbol_table1);
10038 expression.register_symbol_table(symbol_table2);
10039 expression.register_symbol_table(symbol_table3);
10040
10041 exprtk::parser<T> parser;
10042
10043 my_usr_ext<T> musr;
10044 parser.enable_unknown_symbol_resolver(&musr);
10045
10046 std::string expr_str = "foo6(foo1(v0),foo2(c1,foo4(v2,c3,v4,c5)),foo3"
10047 "(v6,c7,foo5(v8,c9,v10,c11,v12)),c13,v14,c15) ";
10048
10049 if (!parser.compile(expr_str,expression))
10050 {
10051 printf("run_test20() - [2] Error: %s Expression: %s\n",
10052 parser.error().c_str(),
10053 expr_str.c_str());
10054
10055 return false;
10056 }
10057 }
10058 }
10059
10060 {
10061 T var;
10062 std::string str;
10063 std::vector<T> vec(10,0.0);
10064
10065 typedef exprtk::symbol_table<T> symbol_table_t;
10066 typedef exprtk::expression<T> expression_t;
10067
10068 bool result = true;
10069
10070 {
10071 symbol_table_t symbol_table;
10072
10073 symbol_table.add_variable ("val",var);
10074 symbol_table.add_stringvar("str",str);
10075 symbol_table.add_vector ("vec",vec);
10076
10077 if (symbol_table.get_variable("val") == 0 || !symbol_table.symbol_exists("val"))
10078 {
10079 printf("run_test20() - [3] Failed to get 'val' from symbol_table\n");
10080 result = false;
10081 }
10082
10083 if (symbol_table.get_stringvar("str") == 0 || !symbol_table.symbol_exists("str"))
10084 {
10085 printf("run_test20() - [3] Failed to get 'str' from symbol_table\n");
10086 result = false;
10087 }
10088
10089 if (symbol_table.get_vector("vec") == 0 || !symbol_table.symbol_exists("vec"))
10090 {
10091 printf("run_test20() - [3] Failed to get 'vec' from symbol_table\n");
10092 result = false;
10093 }
10094 }
10095
10096 if (!result)
10097 return result;
10098
10099 {
10100 symbol_table_t symbol_table;
10101
10102 symbol_table.add_variable("val",var);
10103
10104 if (symbol_table.get_variable("val") == 0 || !symbol_table.symbol_exists("val"))
10105 {
10106 printf("run_test20() - [4] Failed to get 'val' from symbol_table\n");
10107 result = false;
10108 }
10109
10110 if (symbol_table.get_stringvar("str") != 0 || symbol_table.symbol_exists("str"))
10111 {
10112 printf("run_test20() - [4] Failed to get 'str' from symbol_table\n");
10113 result = false;
10114 }
10115
10116 if (symbol_table.get_vector("vec") != 0 || symbol_table.symbol_exists("vec"))
10117 {
10118 printf("run_test20() - [4] Failed to get 'vec' from symbol_table\n");
10119 result = false;
10120 }
10121 }
10122
10123 if (!result)
10124 return result;
10125
10126 {
10127 symbol_table_t symbol_table;
10128
10129 symbol_table.add_stringvar("str",str);
10130
10131 if (symbol_table.get_stringvar("str") == 0 || !symbol_table.symbol_exists("str"))
10132 {
10133 printf("run_test20() - [5] Failed to get 'str' from symbol_table\n");
10134 result = false;
10135 }
10136
10137 if (symbol_table.get_variable("val") != 0 || symbol_table.symbol_exists("val"))
10138 {
10139 printf("run_test20() - [5] Failed to get 'val' from symbol_table\n");
10140 result = false;
10141 }
10142
10143 if (symbol_table.get_vector("vec") != 0 || symbol_table.symbol_exists("vec"))
10144 {
10145 printf("run_test20() - [5] Failed to get 'vec' from symbol_table\n");
10146 result = false;
10147 }
10148 }
10149
10150 if (!result)
10151 return result;
10152
10153 {
10154 symbol_table_t symbol_table;
10155
10156 symbol_table.add_vector("vec",vec);
10157
10158 if (symbol_table.get_vector("vec") == 0 || !symbol_table.symbol_exists("vec"))
10159 {
10160 printf("run_test20() - [6] Failed to get 'vec' from symbol_table\n");
10161 result = false;
10162 }
10163
10164 if (symbol_table.get_variable("val") != 0 || symbol_table.symbol_exists("val"))
10165 {
10166 printf("run_test20() - [6] Failed to get 'val' from symbol_table\n");
10167 result = false;
10168 }
10169
10170 if (symbol_table.get_stringvar("str") != 0 || symbol_table.symbol_exists("str"))
10171 {
10172 printf("run_test20() - [6] Failed to get 'str' from symbol_table\n");
10173 result = false;
10174 }
10175 }
10176
10177 if (!result)
10178 return result;
10179
10180 {
10181 symbol_table_t symbol_table1;
10182 symbol_table_t symbol_table2;
10183 expression_t expression;
10184
10185 if (!expression.register_symbol_table(symbol_table1))
10186 {
10187 printf("run_test20() - Failed to register symbol_table1 with expression\n");
10188 result = false;
10189 }
10190
10191 if (!expression.register_symbol_table(symbol_table2))
10192 {
10193 printf("run_test20() - Failed to register symbol_table2 with expression\n");
10194 result = false;
10195 }
10196
10197 if (expression.num_symbol_tables() != 2)
10198 {
10199 printf("run_test20() - Invalid number of symbol tables in expression [1]\n");
10200 result = false;
10201 }
10202
10203 if (expression.register_symbol_table(symbol_table1))
10204 {
10205 printf("run_test20() - Error: was able to register symbol_table1 with expression\n");
10206 result = false;
10207 }
10208
10209 if (expression.register_symbol_table(symbol_table2))
10210 {
10211 printf("run_test20() - Error: was able to register symbol_table2 with expression\n");
10212 result = false;
10213 }
10214
10215 if (expression.num_symbol_tables() != 2)
10216 {
10217 printf("run_test20() - Invalid number of symbol tables in expression [2]\n");
10218 result = false;
10219 }
10220
10221 symbol_table_t symbol_table12 = symbol_table1;
10222 symbol_table_t symbol_table22 = symbol_table2;
10223
10224 if (expression.register_symbol_table(symbol_table12))
10225 {
10226 printf("run_test20() - Error: was able to register symbol_table12 with expression\n");
10227 result = false;
10228 }
10229
10230 if (expression.register_symbol_table(symbol_table22))
10231 {
10232 printf("run_test20() - Error: was able to register symbol_table22 with expression\n");
10233 result = false;
10234 }
10235
10236 if (expression.num_symbol_tables() != 2)
10237 {
10238 printf("run_test20() - Invalid number of symbol tables in expression [3]\n");
10239 result = false;
10240 }
10241
10242 symbol_table12 = symbol_table_t();
10243 symbol_table22 = symbol_table_t();
10244
10245 if (!expression.register_symbol_table(symbol_table12))
10246 {
10247 printf("run_test20() - Failed to register symbol_table12 with expression [2]\n");
10248 result = false;
10249 }
10250
10251 if (!expression.register_symbol_table(symbol_table22))
10252 {
10253 printf("run_test20() - Failed to register symbol_table22 with expression [2]\n");
10254 result = false;
10255 }
10256
10257 if (expression.num_symbol_tables() != 4)
10258 {
10259 printf("run_test20() - Invalid number of symbol tables in expression [4]\n");
10260 result = false;
10261 }
10262 }
10263
10264 if (!result)
10265 return result;
10266
10267 }
10268
10269 return true;
10270}
10271
10272template <typename T>
10273inline std::string results_to_string(const exprtk::results_context<T>& results)
10274{
10275 typedef exprtk::results_context<T> results_context_t;
10276 typedef typename results_context_t::type_store_t type_t;
10277
10278 std::string res_str;
10279
10280 for (std::size_t i = 0; i < results.count(); ++i)
10281 {
10282 type_t t = results[i];
10283
10284 switch (t.type)
10285 {
10286 case type_t::e_scalar : res_str += 'T';
10287 break;
10288
10289 case type_t::e_vector : res_str += 'V';
10290 break;
10291
10292 case type_t::e_string : res_str += 'S';
10293 break;
10294
10295 default : continue;
10296 }
10297 }
10298
10299 return res_str;
10300}
10301
10302template <typename T>
10303inline bool result_equal(const exprtk::results_context<T>& results, const T& value)
10304{
10305 typedef exprtk::results_context<T> results_context_t;
10306 typedef typename results_context_t::type_store_t type_t;
10307 typedef typename type_t::scalar_view scalar_t;
10308
10309 if (1 != results.count())
10310 return false;
10311 else if (type_t::e_scalar != results[0].type)
10312 return false;
10313 else
10314 return (value == scalar_t(results[0])());
10315}
10316
10317template <typename T>
10319{
10320public:
10321
10328 typedef std::map<void*,vv_ptr_t> map_t;
10329
10330 using exprtk::igeneric_function<T>::operator();
10331
10333 : exprtk::igeneric_function<T>("VT")
10334 {}
10335
10336 inline T operator()(parameter_list_t parameters)
10337 {
10338 vector_t vector(parameters[0]);
10339 size_t new_size = static_cast<std::size_t>(scalar_t(parameters[1])());
10340 void* key = static_cast<void*>(&vector[0]);
10341
10342 typename map_t::iterator itr = vector_map_.find(key);
10343
10344 if (itr == vector_map_.end())
10345 {
10346 return T(0);
10347 }
10348
10349 exprtk::vector_view<T>& vv = *itr->second;
10350
10351 if (vv.base_size() < new_size)
10352 {
10353 return T(0);
10354 }
10355
10356 return vv.set_size(new_size) ? T(1) : T(0);
10357 }
10358
10360 {
10361 vector_map_[vec_view.data()] = &vec_view;
10362 }
10363
10364private:
10365
10367};
10368
10369
10370template <typename T>
10372{
10373 typedef exprtk::symbol_table<T> symbol_table_t;
10374 typedef exprtk::expression<T> expression_t;
10375 typedef exprtk::parser<T> parser_t;
10376 typedef exprtk::parser_error::type error_type;
10377
10378 {
10379 T x = T(1.1);
10380 T y = T(2.2);
10381 T z = T(3.3);
10382
10383 symbol_table_t symbol_table;
10384 symbol_table.add_constants();
10385 symbol_table.add_variable("x",x);
10386 symbol_table.add_variable("y",y);
10387 symbol_table.add_variable("z",z);
10388
10389 static const std::string expression_list[] =
10390 {
10391 "return[]; x;",
10392 "return[x]; x;",
10393 "return[x,y]; x;",
10394 "return[x + y,y - x]; x;",
10395 "return[x + y,y - x,'abc']; x;",
10396 "if (x < y) return [1,'abc1']; else return [2,'abc2',x];" ,
10397 "if (x > y) return [1,'abc1']; else return [2,'abc2',x];" ,
10398 "if (x < y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
10399 "if (x > y) { return [1,'abc1'];} else { return [2,'abc2',x];}",
10400 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1]; } ",
10401 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc']; } ",
10402 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x]; }",
10403 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y]; }",
10404 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [1,'abc',x,y,z]; }",
10405 "for(var i := 0; i < 10; i += 1) { if (i == 5) return [2,'abc2',x]; else x += 1; }",
10406 "for(var i := 0; i < 10; i += 1) { if (i == 5) { return [1,'abc1'];} else x += 1; }"
10407 };
10408
10409 static const std::string result_list[] =
10410 {
10411 "" ,
10412 "T" ,
10413 "TT" ,
10414 "TT" ,
10415 "TTS" ,
10416 "TS" ,
10417 "TST" ,
10418 "TS" ,
10419 "TST" ,
10420 "T" ,
10421 "TS" ,
10422 "TST" ,
10423 "TSTT" ,
10424 "TSTTT",
10425 "TST" ,
10426 "TS"
10427 };
10428
10429 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
10430
10431 bool error_found = false;
10432
10433 for (std::size_t i = 0; i < expression_list_size; ++i)
10434 {
10435 expression_t expression;
10436 expression.register_symbol_table(symbol_table);
10437
10438 parser_t parser;
10439
10440 if (!parser.compile(expression_list[i],expression))
10441 {
10442 printf("run_test21() - Error: %s Expression: %s [1]\n",
10443 parser.error().c_str(),
10444 expression_list[i].c_str());
10445
10446 error_found = true;
10447 continue;
10448 }
10449 else if (!parser.dec().return_present())
10450 {
10451 printf("run_test21() - Expected a return statement Expression: %s [1]\n",
10452 expression_list[i].c_str());
10453
10454 error_found = true;
10455 continue;
10456 }
10457
10458 expression.value();
10459
10460 std::string pattern = results_to_string<T>(expression.results());
10461
10462 if (!expression.return_invoked())
10463 {
10464 printf("run_test21() - Invalid return invoke state [1] Expression: %s\n",
10465 expression_list[i].c_str());
10466
10467 error_found = true;
10468 continue;
10469 }
10470 else if (result_list[i] != pattern)
10471 {
10472 printf("run_test21() - Invalid return results [1] Expected %s Got: %s Expression: %s\n",
10473 result_list[i].c_str(),
10474 pattern.c_str(),
10475 expression_list[i].c_str());
10476
10477 error_found = true;
10478 continue;
10479 }
10480 }
10481
10482 if (error_found)
10483 {
10484 return false;
10485 }
10486 }
10487
10488 {
10489 T x = T(1.1);
10490 T y = T(2.2);
10491 T z = T(3.3);
10492
10493 symbol_table_t symbol_table;
10494 symbol_table.add_constants();
10495 symbol_table.add_variable("x",x);
10496 symbol_table.add_variable("y",y);
10497 symbol_table.add_variable("z",z);
10498
10499 static const std::string expression_list[] =
10500 {
10501 "x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]; ",
10502 "x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7; ",
10503 "x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7; ",
10504 "x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7; ",
10505 "x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7; ",
10506 "x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7; ",
10507 "return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7; ",
10508 "~{x := 1; x + 1; x + 2; x + 3; x + 5; x + 7; return [x + 1]}",
10509 "~{x := 1; x + 1; x + 2; x + 3; x + 5; return [x + 1]; x := 7}",
10510 "~{x := 1; x + 1; x + 2; x + 3; return [x + 1]; x + 5; x := 7}",
10511 "~{x := 1; x + 1; x + 2; return [x + 1]; x + 3; x + 5; x := 7}",
10512 "~{x := 1; x + 1; return [x + 1]; x + 2; x + 3; x + 5; x := 7}",
10513 "~{x := 1; return [x + 1]; x + 1; x + 2; x + 3; x + 5; x := 7}",
10514 "~{return [x + 1]; x := 1; x + 1; x + 2; x + 3; x + 5; x := 7}"
10515 };
10516
10517 static const std::string result_list[] =
10518 {
10519 "T", "T", "T", "T", "T", "T", "T",
10520 "T", "T", "T", "T", "T", "T", "T",
10521 };
10522
10523 static const std::size_t expression_list_size = sizeof(expression_list) / sizeof(std::string);
10524
10525 bool error_found = false;
10526
10527 for (std::size_t i = 0; i < expression_list_size; ++i)
10528 {
10529 expression_t expression;
10530 expression.register_symbol_table(symbol_table);
10531
10532 parser_t parser;
10533
10534 if (!parser.compile(expression_list[i],expression))
10535 {
10536 printf("run_test21() - Error: %s Expression: %s [2]\n",
10537 parser.error().c_str(),
10538 expression_list[i].c_str());
10539
10540 error_found = true;
10541 continue;
10542 }
10543 else if (!parser.dec().return_present())
10544 {
10545 printf("run_test21() - Expected a return statement Expression: %s [2]\n",
10546 expression_list[i].c_str());
10547
10548 error_found = true;
10549 continue;
10550 }
10551
10552 expression.value();
10553
10554 std::string pattern = results_to_string<T>(expression.results());
10555
10556 if (!expression.return_invoked())
10557 {
10558 printf("run_test21() - Invalid return invoke state [2] Expression: %s\n",
10559 expression_list[i].c_str());
10560
10561 error_found = true;
10562 continue;
10563 }
10564 else if (result_list[i] != pattern)
10565 {
10566 printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
10567 result_list[i].c_str(),
10568 pattern.c_str(),
10569 expression_list[i].c_str());
10570
10571 error_found = true;
10572 continue;
10573 }
10574 else if (!result_equal(expression.results(), x + T(1)))
10575 {
10576 printf("run_test21() - Invalid return results [2] Expected %s Got: %s Expression: %s\n",
10577 result_list[i].c_str(),
10578 pattern.c_str(),
10579 expression_list[i].c_str());
10580
10581 error_found = true;
10582 continue;
10583 }
10584 }
10585
10586 if (error_found)
10587 {
10588 return false;
10589 }
10590 }
10591
10592 {
10593 T x = 1.0;
10594 T y = 2.0;
10595 T z = 3.0;
10596
10597 T v[] = {0 , 1, 2, 3 };
10598 std::string s = "Hello ";
10599
10600 myfunc<T> mf;
10601
10602 symbol_table_t symbol_table;
10603 expression_t expression;
10604 parser_t parser;
10605
10606 symbol_table.add_variable ("x", x);
10607 symbol_table.add_variable ("y", y);
10608 symbol_table.add_variable ("z", z);
10609 symbol_table.add_vector ("v", v);
10610 symbol_table.add_stringvar("s", s);
10611
10612 expression.register_symbol_table(symbol_table);
10613
10614 const std::string expression_str =
10615 " if (x > y) "
10616 " return [1]; "
10617 " else "
10618 " return [ x, x + y, 2 * v, s + 'world' ]; ";
10619
10620 if (!parser.compile(expression_str, expression))
10621 {
10622 printf("run_test21() - ERROR: %s\tExpression: %s\n",
10623 parser.error().c_str(),
10624 expression_str.c_str());
10625 return false;
10626 }
10627
10628 expression.value();
10629
10630 typedef exprtk::results_context<T> results_context_t;
10631 const results_context_t& results = expression.results();
10632
10633 if (results.count() != 4)
10634 {
10635 printf("run_test21() - ERROR Expected 4 return results, instead got: %d\n",
10636 static_cast<unsigned int>(results.count()));
10637 return false;
10638 }
10639
10640 T result_x0;
10641 T result_x1;
10642 std::string result_s;
10643 std::vector<T> result_v;
10644
10645 const T expected_result_v[] = {0 , 2, 4, 6 };
10646 const std::string expected_result_s = "Hello world";
10647
10648 if (!results.get_scalar(0,result_x0))
10649 {
10650 printf("run_test21() - ERROR Failed to get scalar index0 from return result!\n");
10651 return false;
10652 }
10653 else if (result_x0 != T(1))
10654 {
10655 printf("run_test21() - ERROR result_x0 is not expected value!\n");
10656 return false;
10657 }
10658 else if (!results.get_scalar(1,result_x1))
10659 {
10660 printf("run_test21() - ERROR Failed to get scalar index1 from return result!\n");
10661 return false;
10662 }
10663 else if (result_x1 != T(3))
10664 {
10665 printf("run_test21() - ERROR result_x1 is not expected value!\n");
10666 return false;
10667 }
10668 else if (!results.get_vector(2,result_v))
10669 {
10670 printf("run_test21() - ERROR Failed to get vector from return result!\n");
10671 return false;
10672 }
10673 else if (
10674 (result_v.size() != (sizeof(expected_result_v) / sizeof(T))) ||
10675 !std::equal(result_v.begin(),result_v.end(),expected_result_v)
10676 )
10677 {
10678 printf("run_test21() - ERROR result_v is not expected value!\n");
10679 return false;
10680 }
10681 else if (!results.get_string(3,result_s))
10682 {
10683 printf("run_test21() - ERROR Failed to get string from return result!\n");
10684 return false;
10685 }
10686 else if (result_s != expected_result_s)
10687 {
10688 printf("run_test21() - ERROR result_s is not expected value!\n");
10689 return false;
10690 }
10691 }
10692
10693 {
10694 const std::string invalid_expressions[] =
10695 {
10696 "x := 1",
10697 "x += 1",
10698 "v := 1 + v",
10699 "v += 1",
10700 "v += x + 1",
10701 "v += v",
10702 "v[0] += x",
10703 "v[1] += x",
10704 "v[2] += x",
10705 "v[3] += x",
10706 "v[4] += x",
10707 "var i := 2; v[i] := x",
10708 "var i := 2; v[i] += x",
10709 "s := 'abc' + s",
10710 "s[0:2] := 'abc'",
10711 "s[1:3] := 'abc'",
10712 "aa[4:4] := bb",
10713 "aa[1:3] := bb",
10714 "var i := 2; aa[i:3] := bb",
10715 "var i := 2; aa[i+1:3] := bb",
10716 "var i := 2; aa[0:i] := bb",
10717 "var i := 2; aa[0:i+1] := bb",
10718 "var i := 1; var j := 3; aa[i:j] := bb",
10719 "var i := 1; var j := 3; aa[i+1:j] := bb",
10720 "var i := 1; var j := 3; aa[i:j+1] := bb",
10721 "var i := 1; var j := 3; aa[i+1:j+1] := bb",
10722 };
10723
10724 const std::size_t invalid_expressions_size = sizeof(invalid_expressions) / sizeof(std::string);
10725
10726 for (std::size_t i = 0; i < invalid_expressions_size; ++i)
10727 {
10728 symbol_table_t mutable_symbol_table;
10729 symbol_table_t immutable_symbol_table(symbol_table_t::e_immutable);
10730
10731 T x = 0.0;
10732 T v[5];
10733 std::string s = "xyz";
10734 std::string aa = "0123456789";
10735 std::string bb = "A";
10736
10737 T x_ = 0.0;
10738 T v_[5];
10739 std::string s_ = "xyz";
10740
10741 std::string a_ = "0123456789";
10742 std::string b_ = "A";
10743
10744 immutable_symbol_table.add_variable ("x" , x );
10745 immutable_symbol_table.add_vector ("v" , v );
10746 immutable_symbol_table.add_stringvar("s" , s );
10747 immutable_symbol_table.add_stringvar("aa", aa);
10748 immutable_symbol_table.add_stringvar("bb", bb);
10749
10750 mutable_symbol_table.add_variable ("x_", x_);
10751 mutable_symbol_table.add_vector ("v_", v_);
10752 mutable_symbol_table.add_stringvar ("s_", s_);
10753 mutable_symbol_table.add_stringvar ("a_", a_);
10754 mutable_symbol_table.add_stringvar ("b_", b_);
10755
10756 const std::string& expression_str = invalid_expressions[i];
10757 expression_t expression;
10758 expression.register_symbol_table(immutable_symbol_table);
10759 expression.register_symbol_table(mutable_symbol_table );
10760
10761 parser_t parser;
10762 const bool compile_result = parser.compile(expression_str, expression);
10763
10764 if (compile_result)
10765 {
10766 expression.value();
10767 printf("run_test21() - Invalid expression due to immutability was successfully compiled. Expression: %s\n",
10768 expression_str.c_str());
10769 }
10770 }
10771 }
10772
10773 {
10774 T x = 1.1;
10775 T y = 2.2;
10776 T z = 3.3;
10777 T w = 4.4;
10778
10779 symbol_table_t mutable_symbol_table;
10780 symbol_table_t immutable_symbol_table(symbol_table_t::e_immutable);
10781
10782 mutable_symbol_table.add_variable("x", x);
10783 mutable_symbol_table.add_variable("y", y);
10784
10785 immutable_symbol_table.add_variable("w", w);
10786 immutable_symbol_table.add_variable("z", z);
10787
10788 expression_t expression;
10789 expression.register_symbol_table(mutable_symbol_table );
10790 expression.register_symbol_table(immutable_symbol_table);
10791
10792 parser_t parser;
10793
10794 typedef std::pair<std::string,bool> local_test_t;
10795
10796 const local_test_t expressions[] =
10797 {
10798 std::make_pair<std::string,bool>("x := y + (z / w)" , true ),
10799 std::make_pair<std::string,bool>("y := y / x + (z / w)" , true ),
10800 std::make_pair<std::string,bool>("z := y + x - w" , false),
10801 std::make_pair<std::string,bool>("z == (w += y / x)" , false)
10802 };
10803
10804 const std::size_t expressions_size = sizeof(expressions) / sizeof(local_test_t);
10805
10806 bool error_found = false;
10807
10808 for (std::size_t i = 0; i < expressions_size; ++i)
10809 {
10810 const std::string expression_str = expressions[i].first;
10811 const bool expected_compile_result = expressions[i].second;
10812
10813 if (expected_compile_result != parser.compile(expression_str, expression))
10814 {
10815 printf("run_test21() - Invalid compilation of expression. Expected compile result: %c Expression: %s\n",
10816 expected_compile_result ? 'T' : 'F',
10817 expression_str.c_str());
10818
10819 error_found = true;
10820 }
10821
10822 x += 1.1;
10823 y += 2.2;
10824 z += 3.3;
10825 w += 4.4;
10826
10827 expression.value();
10828 }
10829
10830 if (error_found)
10831 {
10832 return false;
10833 }
10834 }
10835
10836 {
10837 typedef typename parser_t::settings_store settings_t;
10838
10839 const std::string invalid_expressions[] =
10840 {
10841 "var result := 0; if (true) { result := 2 } if (true) { result := 3 }; result",
10842 "var result := 0; if (true) { result := 2 }; if (true) { result := 3 } result",
10843 "var result := 0; if (true) { result := 2 } if (true) { result := 3 } result",
10844 "var result := 0; var x:=1; if (x > 0) { result := 2 } else if (x > 0) { result := 3 } result",
10845 "var result := 0; var x := 1; if (x > 0) { result := 2 } if (x > 0) { result := 3 }; result",
10846 "var result := 0; var x := 1; if (x > 0) { result := 2 }; if (x > 0) { result := 3 } result",
10847 "var result := 0; var x := 1; if (x > 0) { result := 2 } if (x > 0) { result := 3 } result",
10848 "var result := 0; var x := 1; if (x > 0) { result := 2 } else if (x > 0) { result := 3 } result",
10849 "var result := 0; var x := 1; if (x > 0) result := 2 else if (x > 0) { result := 3 } result",
10850 "var result := 0; var x := 1; if (x > 0) {result := 2 } else if (x > 0) result := 3 result",
10851 "var x := 2; var y := 0; x y ",
10852 "var x := 2; x var y := 0; ",
10853 "var x := 2; var y := 0; while (y < 3) { x := x * x; y += 1; } x ",
10854 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } x ",
10855 "var x := 2; var y := 0; while (y < 3) { x := x * x; y += 1; } 1 ",
10856 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } 1 ",
10857 "var x := 2; var y := 0; x while (y < 3) { x := x * x; y += 1; } ",
10858 "var x := 2; var y := 0; x for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } ",
10859 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } (1 + x)",
10860 "var x := 2; var y := 0; for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; } (x + 1)",
10861 "var x := 2; var y := 0; (1 + x) for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; }",
10862 "var x := 2; var y := 0; (x + 1) for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; }",
10863 "var x := 2; var y := 0; (x + y) for (var i := 0; i < 2; i += 1) { x := x * x; y += 1; }",
10864 "'hello' 1",
10865 "1 'hello'",
10866 "'hel' + 'lo' 1",
10867 "1 'hel' + 'lo'",
10868 "1 2",
10869 "a b",
10870 "a b c",
10871 "var x := 2; 1 2 ",
10872 "var x := 2; 1 x ",
10873 "var x := 2; x 1 ",
10874 "var x := 2; a 1 ",
10875 "var x := 2; x a ",
10876 "var x := 2; x a b ",
10877 "var x := 2; x a b c ",
10878 "var x := 2; a x ",
10879 "var x := 2; a x b ",
10880 "var x := 2; a x b c ",
10881 "var x := 2; 'hello' 1",
10882 "var x := 2; 1 'hello'",
10883 "var x := 2; 'hello' x",
10884 "var x := 2; x 'hello'",
10885 "var x := 2; (x 1) ",
10886 "var x := 2; (1 x) ",
10887 "var x := 2; 2 + (x 1) ",
10888 "var x := 2; 2 + (1 x) ",
10889 "var x := 2; x + (x 1) ",
10890 "var x := 2; x + (1 x) ",
10891 "var x := 2; (x 1) + 2 ",
10892 "var x := 2; (1 x) + 2 ",
10893 "var x := 2; (x 1) + x ",
10894 "var x := 2; (1 x) + x ",
10895 "var x := 2; var y := 3; (x y) ",
10896 "var x := 2; var y := 3; (y x) ",
10897 "var x := 2; var y := 3; 2 + (x y) ",
10898 "var x := 2; var y := 3; 2 + (y x) ",
10899 "var x := 2; var y := 3; x + (x y) ",
10900 "var x := 2; var y := 3; x + (y x) ",
10901 "var x := 2; var y := 3; (x y) + 2 ",
10902 "var x := 2; var y := 3; (y x) + 2 ",
10903 "var x := 2; var y := 3; (x y) + x ",
10904 "var x := 2; var y := 3; (y x) + x ",
10905 "var x := 2; 2 + x 1 ",
10906 "var x := 2; 2 + 1 x ",
10907 "var x := 2; x + x 1 ",
10908 "var x := 2; x + 1 x ",
10909 "var x := 2; var y := 3; 2 + x y ",
10910 "var x := 2; var y := 3; 2 + y x ",
10911 "var x := 2; var y := 3; x + x y ",
10912 "var x := 2; var y := 3; x + y x ",
10913 "~{1; 2; 3} 1 ",
10914 "1 ~{1; 2; 3} ",
10915 "var x := 2; x ~{x; 1; 2} ",
10916 "var x := 2; 1 ~{x; 1; 2} ",
10917 "var x := 2; ~{x; 1; 2} x ",
10918 "var x := 2; ~{x; 1; 2} 1 ",
10919 "~(1; 2; 3) 1 ",
10920 "1 ~(1; 2; 3) ",
10921 "var x := 2; x ~(x; 1; 2) ",
10922 "var x := 2; 1 ~(x; 1; 2) ",
10923 "var x := 2; ~(x; 1; 2) x ",
10924 "var x := 2; ~(x; 1; 2) 1 ",
10925 "var x := 2; (x + 1) ~{x; 1; 2} ",
10926 "var x := 2; (1 + x) ~{x; 1; 2} ",
10927 "var x := 2; ~{x; 1; 2} (x + 1) ",
10928 "var x := 2; ~{x; 1; 2} (1 + x) ",
10929 "var x := 2; x + 1 ~{x; 1; 2} ",
10930 "var x := 2; 1 + x ~{x; 1; 2} ",
10931 "var x := 2; ~{x; 1; 2} x + 1 ",
10932 "var x := 2; ~{x; 1; 2} 1 + x ",
10933 "~(1, 2, 3) 1 ",
10934 "1 ~(1, 2, 3) ",
10935 "var x := 2; x ~(x, 1, 2) ",
10936 "var x := 2; 1 ~(x, 1, 2) ",
10937 "var x := 2; ~(x, 1, 2) x ",
10938 "var x := 2; ~(x, 1, 2) 1 ",
10939 "var x := 2; 1 switch { case x > 1 : 1; case x < 3 : 2; default : 3; } ",
10940 "var x := 2; x switch { case x > 1 : 1; case x < 3 : 2; default : 3; } ",
10941 "var x := 2; switch { case x > 1 : 1; case x < 3 : 2; default : 3; } x ",
10942 "var x := 2; 1 [*] { case x > 1 : 1; case x < 3 : 2; } ",
10943 "var x := 2; x [*] { case x > 1 : 1; case x < 3 : 2; } ",
10944 "var x := 2; [*] { case x > 1 : 1; case x < 3 : 2; } x ",
10945 "var x := 2; (x + 1) switch { case x > 1 : 1; case x < 3 : 2; default : 3; } ",
10946 "var x := 2; switch { case x > 1 : 1; case x < 3 : 2; default : 3; } (x + 1) ",
10947 "var x := 2; (x + 1) [*] { case x > 1 : 1; case x < 3 : 2; } ",
10948 "var x := 2; [*] { case x > 1 : 1; case x < 3 : 2; } (x + 1) ",
10949 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] 1; } ",
10950 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 return [i]; } ",
10951 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] i; } ",
10952 "var x := 2; for (var i := 0; i < 2; i += 1) { i return [i]; } ",
10953 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] 1 + i; } ",
10954 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 + i return [i]; } ",
10955 "var x := 2; for (var i := 0; i < 2; i += 1) { return [i] i + 1; } ",
10956 "var x := 2; for (var i := 0; i < 2; i += 1) { i + 1 return [i]; } ",
10957 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 if (i > 3) return [i]; } ",
10958 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] 1; } ",
10959 "var x := 2; for (var i := 0; i < 2; i += 1) { x if (i > 3) return [i]; } ",
10960 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] x; } ",
10961 "var x := 2; for (var i := 0; i < 2; i += 1) { x + 1 if (i > 3) return [i]; }",
10962 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] x + 1; }",
10963 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 + x if (i > 3) return [i]; }",
10964 "var x := 2; for (var i := 0; i < 2; i += 1) { if (i > 3) return [i] 1 + x; }",
10965 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 for (var j := 0; j < 2; j += 1){} } ",
10966 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} 1 } ",
10967 "var x := 2; for (var i := 0; i < 2; i += 1) { x for (var j := 0; j < 2; j += 1){} } ",
10968 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} x } ",
10969 "var x := 2; for (var i := 0; i < 2; i += 1) { x + 1 for (var j := 0; j < 2; j += 1){} } ",
10970 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} x + 1 } ",
10971 "var x := 2; for (var i := 0; i < 2; i += 1) { 1 + x for (var j := 0; j < 2; j += 1){} } ",
10972 "var x := 2; for (var i := 0; i < 2; i += 1) { for (var j := 0; j < 2; j += 1){} 1 + x } "
10973 };
10974
10975 const std::size_t expressions_size = sizeof(invalid_expressions) / sizeof(std::string);
10976
10977 static const std::size_t compile_options =
10978 settings_t::e_replacer +
10979 settings_t::e_joiner +
10980 settings_t::e_numeric_check +
10981 settings_t::e_bracket_check +
10982 settings_t::e_sequence_check +
10983 settings_t::e_strength_reduction;
10984
10985 const settings_t settings(compile_options);
10986 parser_t parser(settings);
10987
10988 T a = T(2222);
10989 T b = T(3333);
10990 T c = T(4444);
10991
10992 symbol_table_t symbol_table;
10993 symbol_table.add_variable("a", a);
10994 symbol_table.add_variable("b", b);
10995 symbol_table.add_variable("c", c);
10996
10997 bool error_found = false;
10998
10999 for (std::size_t e = 0; e < expressions_size; ++e)
11000 {
11001 const std::string& expression_string = invalid_expressions[e];
11002
11003 expression_t expression;
11004 expression.register_symbol_table(symbol_table);
11005
11006 if (parser.compile(expression_string,expression))
11007 {
11008 printf("run_test21() - Expected compilation error for expression: %s\n",
11009 expression_string.c_str());
11010 error_found = true;
11011 continue;
11012 }
11013
11014 expression.value();
11015 }
11016
11017 if (error_found)
11018 {
11019 return false;
11020 }
11021 }
11022
11023 {
11024 const std::string expressions[] =
11025 {
11026 // conditional_vector_node
11027 "var x := 2; sum(if (x > 1) { vv8 } else { vv7 }) == sum(vv8)",
11028 "var x := 2; sum(if (x > 1) { vv8 + 1 } else { vv8 + 2 }) == sum(vv8 + 1)",
11029
11030 // unary_vector_node
11031 "var v[8] := {1,1,1,1,1,1,1,1}; vv8 += 1; sgn(vv8) == v",
11032 "abs(-1 * vv8) == vv8",
11033 "abs(vv8 * -1) == vv8",
11034 "var x := -1; abs(x * vv8) == vv8",
11035 "var x := -1; abs(vv8 * x) == vv8",
11036 "var x := 1; abs(-x * vv8) == vv8",
11037 "var x := 1; abs(vv8 * -x) == vv8",
11038 "var x := -2; abs(x * vv8) == 2vv8",
11039 "var x := -2; abs(vv8 * x) == 2vv8",
11040 "var x := 2; abs(-x * vv8) == 2vv8",
11041 "var x := 2; abs(vv8 * -x) == 2vv8",
11042 "var x := -2; abs(x * vv8) == -x * vv8",
11043 "var x := -2; abs(vv8 * x) == -x * vv8",
11044 "var x := 2; abs(-x * vv8) == x * vv8",
11045 "var x := 2; abs(vv8 * -x) == x * vv8",
11046 "var x := -2; abs(x * vv8) == vv8 * -x",
11047 "var x := -2; abs(vv8 * x) == vv8 * -x",
11048 "var x := 2; abs(-x * vv8) == vv8 * x",
11049 "var x := 2; abs(vv8 * -x) == vv8 * x",
11050 "var x := -2; abs(x * vv8) == abs(x) * vv8",
11051 "var x := -2; abs(vv8 * x) == abs(x) * vv8",
11052 "var x := -2; abs(x * vv8) == vv8 * abs(x)",
11053 "var x := -2; abs(vv8 * x) == vv8 * abs(x)",
11054
11055 // vec_binop_vecval_node and vec_binop_valvec_node
11056 "var v[8] := {1,2,3,4,5,6,7,8}; var x := 1; (vv8 + x) == v",
11057 "var v[7] := {1,2,3,4,5,6,7}; var x := 1; (vv8 + x) == v",
11058 "var v[6] := {1,2,3,4,5,6}; var x := 1; (vv8 + x) == v",
11059 "var v[5] := {1,2,3,4,5}; var x := 1; (vv8 + x) == v",
11060 "var v[4] := {1,2,3,4}; var x := 1; (vv8 + x) == v",
11061 "var v[3] := {1,2,3}; var x := 1; (vv8 + x) == v",
11062 "var v[2] := {1,2}; var x := 1; (vv8 + x) == v",
11063 "var v[1] := {1}; var x := 1; (vv8 + x) == v",
11064 "var v[8] := {1,2,3,4,5,6,7,8}; var x := 1; (x + vv8) == v",
11065 "var v[7] := {1,2,3,4,5,6,7}; var x := 1; (x + vv8) == v",
11066 "var v[6] := {1,2,3,4,5,6}; var x := 1; (x + vv8) == v",
11067 "var v[5] := {1,2,3,4,5}; var x := 1; (x + vv8) == v",
11068 "var v[4] := {1,2,3,4}; var x := 1; (x + vv8) == v",
11069 "var v[3] := {1,2,3}; var x := 1; (x + vv8) == v",
11070 "var v[2] := {1,2}; var x := 1; (x + vv8) == v",
11071 "var v[1] := {1}; var x := 1; (x + vv8) == v",
11072
11073 // vec_binop_vecvec_node
11074 "var v[8] := [-1]; v < vv8",
11075 "var v[7] := [-1]; v < vv8",
11076 "var v[3] := [-1]; v < vv8",
11077 "var v[2] := [-1]; v < vv8",
11078 "var v[1] := [-1]; v < vv8",
11079
11080 // assignment_vecvec_op_node
11081 "var vv8sum := sum(vv8); vv8 += (vv8 + 1); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1)",
11082 "var vv8sum := sum(vv8); vv8 += (vv8 - 1); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1)",
11083 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + x); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1)",
11084 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 - x); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1)",
11085 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 + x)); sum(vv8) == (3 * sum(vv8sum) + vv8[] * 1)",
11086 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 - x)); sum(vv8) == (3 * sum(vv8sum) - vv8[] * 1)",
11087 "var vv8sum := sum(vv8); vv8 += (vv8 += 1); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * 1))",
11088 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 += x); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * x))",
11089 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 -= x); sum(vv8) == (2 * vv8sum - 2 * (vv8[] * x))",
11090 "var vv8sum := sum(vv8); vv8 += (vv8 + 1); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1);",
11091 "var vv8sum := sum(vv8); vv8 += (vv8 - 1); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1);",
11092 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + x); sum(vv8) == (2 * sum(vv8sum) + vv8[] * 1);",
11093 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 - x); sum(vv8) == (2 * sum(vv8sum) - vv8[] * 1);",
11094 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 + x)); sum(vv8) == (3 * sum(vv8sum) + vv8[] * 1);",
11095 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 + (vv8 - x)); sum(vv8) == (3 * sum(vv8sum) - vv8[] * 1);",
11096 "var vv8sum := sum(vv8); vv8 += (vv8 += 1); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * 1));",
11097 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 += x); sum(vv8) == (2 * vv8sum + 2 * (vv8[] * x));",
11098 "var vv8sum := sum(vv8); var x := 1; vv8 += (vv8 -= x); sum(vv8) == (2 * vv8sum - 2 * (vv8[] * x));",
11099 "var vv3sum := sum(vv3); vv3 += (vv3 + 1); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1)",
11100 "var vv3sum := sum(vv3); vv3 += (vv3 - 1); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1)",
11101 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + x); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1)",
11102 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 - x); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1)",
11103 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 + x)); sum(vv3) == (3 * sum(vv3sum) + vv3[] * 1)",
11104 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 - x)); sum(vv3) == (3 * sum(vv3sum) - vv3[] * 1)",
11105 "var vv3sum := sum(vv3); vv3 += (vv3 += 1); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * 1))",
11106 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 += x); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * x))",
11107 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 -= x); sum(vv3) == (2 * vv3sum - 2 * (vv3[] * x))",
11108 "var vv3sum := sum(vv3); vv3 += (vv3 + 1); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1);",
11109 "var vv3sum := sum(vv3); vv3 += (vv3 - 1); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1);",
11110 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + x); sum(vv3) == (2 * sum(vv3sum) + vv3[] * 1);",
11111 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 - x); sum(vv3) == (2 * sum(vv3sum) - vv3[] * 1);",
11112 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 + x)); sum(vv3) == (3 * sum(vv3sum) + vv3[] * 1);",
11113 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 + (vv3 - x)); sum(vv3) == (3 * sum(vv3sum) - vv3[] * 1);",
11114 "var vv3sum := sum(vv3); vv3 += (vv3 += 1); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * 1));",
11115 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 += x); sum(vv3) == (2 * vv3sum + 2 * (vv3[] * x));",
11116 "var vv3sum := sum(vv3); var x := 1; vv3 += (vv3 -= x); sum(vv3) == (2 * vv3sum - 2 * (vv3[] * x));",
11117
11118 // assignment_vec_op_node
11119 "var vv8sum := sum(vv8); vv8 += 1; sum(vv8) == (vv8sum + vv8[] * 1)",
11120 "var vv7sum := sum(vv7); vv7 += 1; sum(vv7) == (vv7sum + vv7[] * 1)",
11121 "var vv6sum := sum(vv6); vv6 += 1; sum(vv6) == (vv6sum + vv6[] * 1)",
11122 "var vv5sum := sum(vv5); vv5 += 1; sum(vv5) == (vv5sum + vv5[] * 1)",
11123 "var vv4sum := sum(vv4); vv4 += 1; sum(vv4) == (vv4sum + vv4[] * 1)",
11124 "var vv3sum := sum(vv3); vv3 += 1; sum(vv3) == (vv3sum + vv3[] * 1)",
11125 "var vv2sum := sum(vv2); vv2 += 1; sum(vv2) == (vv2sum + vv2[] * 1)",
11126 "var vv1sum := sum(vv1); vv1 += 1; sum(vv1) == (vv1sum + vv1[] * 1)",
11127 "var vv8sum := sum(vv8); var x := 7; vv8 += (x - 1) / 2; sum(vv8) == (vv8sum + vv8[] * 3)",
11128 "var vv7sum := sum(vv7); var x := 7; vv7 += (x - 1) / 2; sum(vv7) == (vv7sum + vv7[] * 3)",
11129 "var vv6sum := sum(vv6); var x := 7; vv6 += (x - 1) / 2; sum(vv6) == (vv6sum + vv6[] * 3)",
11130 "var vv5sum := sum(vv5); var x := 7; vv5 += (x - 1) / 2; sum(vv5) == (vv5sum + vv5[] * 3)",
11131 "var vv4sum := sum(vv4); var x := 7; vv4 += (x - 1) / 2; sum(vv4) == (vv4sum + vv4[] * 3)",
11132 "var vv3sum := sum(vv3); var x := 7; vv3 += (x - 1) / 2; sum(vv3) == (vv3sum + vv3[] * 3)",
11133 "var vv2sum := sum(vv2); var x := 7; vv2 += (x - 1) / 2; sum(vv2) == (vv2sum + vv2[] * 3)",
11134 "var vv1sum := sum(vv1); var x := 7; vv1 += (x - 1) / 2; sum(vv1) == (vv1sum + vv1[] * 3)",
11135
11136 // assignment_vecvec_node
11137 "var v[8] := [-1]; vv8 := v; sum(vv8) == (-1 * 8 + 0)",
11138 "var v[7] := [-1]; vv8 := v; sum(vv8) == (-1 * 7 + (7))",
11139 "var v[6] := [-1]; vv8 := v; sum(vv8) == (-1 * 6 + (6+7))",
11140 "var v[5] := [-1]; vv8 := v; sum(vv8) == (-1 * 5 + (5+6+7))",
11141 "var v[4] := [-1]; vv8 := v; sum(vv8) == (-1 * 4 + (4+5+6+7))",
11142 "var v[3] := [-1]; vv8 := v; sum(vv8) == (-1 * 3 + (3+4+5+6+7))",
11143 "var v[2] := [-1]; vv8 := v; sum(vv8) == (-1 * 2 + (2+3+4+5+6+7))",
11144 "var v[1] := [-1]; vv8 := v; sum(vv8) == (-1 * 1 + (1+2+3+4+5+6+7))",
11145 "var v[8] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, -1 }; x == vv8",
11146 "var v[7] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, 7 }; x == vv8",
11147 "var v[6] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, -1, 6, 7 }; x == vv8",
11148 "var v[5] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, -1, 5, 6, 7 }; x == vv8",
11149 "var v[4] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, -1, 4, 5, 6, 7 }; x == vv8",
11150 "var v[3] := [-1]; vv8 := v; var x[8] := { -1, -1, -1, 3, 4, 5, 6, 7 }; x == vv8",
11151 "var v[2] := [-1]; vv8 := v; var x[8] := { -1, -1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11152 "var v[1] := [-1]; vv8 := v; var x[8] := { -1, 1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11153 "var v[3] := [-1]; vv3 := v; sum(vv3) == (-1 * 3 + (0))",
11154 "var v[2] := [-1]; vv3 := v; sum(vv3) == (-1 * 2 + (2))",
11155 "var v[1] := [-1]; vv3 := v; sum(vv3) == (-1 * 1 + (1+2))",
11156 "var v[3] := [-1]; vv3 := v; var x[3] := { -1, -1, -1}; x == vv3",
11157 "var v[2] := [-1]; vv3 := v; var x[3] := { -1, -1, 2}; x == vv3",
11158 "var v[1] := [-1]; vv3 := v; var x[3] := { -1, 1, 2}; x == vv3",
11159 "vv8 := vv7; sum(vv8) == (sum(vv7) + 7)",
11160 "vv8 := vv6; sum(vv8) == (sum(vv6) + 6+ 7)",
11161 "vv8 := vv5; sum(vv8) == (sum(vv5) + 5 + 6 + 7)",
11162 "vv8 := vv4; sum(vv8) == (sum(vv4) + 4 + 5 + 6 + 7)",
11163 "vv8 := vv3; sum(vv8) == (sum(vv3) + 3 + 4 + 5 + 6 + 7)",
11164 "vv8 := vv2; sum(vv8) == (sum(vv2) + 2 + 3 + 4 + 5 + 6 + 7)",
11165 "vv8 := vv1; sum(vv8) == (sum(vv1) + 1 + 2 + 3 + 4 + 5 + 6 + 7)",
11166 "vv8 := vv7 + vv7; sum(vv8) == (2 * sum(vv7) + 7)",
11167 "vv8 := vv6 + vv6; sum(vv8) == (2 * sum(vv6) + 6+ 7)",
11168 "vv8 := vv5 + vv5; sum(vv8) == (2 * sum(vv5) + 5 + 6 + 7)",
11169 "vv8 := vv4 + vv4; sum(vv8) == (2 * sum(vv4) + 4 + 5 + 6 + 7)",
11170 "vv8 := vv3 + vv3; sum(vv8) == (2 * sum(vv3) + 3 + 4 + 5 + 6 + 7)",
11171 "vv8 := vv2 + vv2; sum(vv8) == (2 * sum(vv2) + 2 + 3 + 4 + 5 + 6 + 7)",
11172 "vv8 := vv1 + vv1; sum(vv8) == (2 * sum(vv1) + 1 + 2 + 3 + 4 + 5 + 6 + 7)",
11173
11174 // assignment_vec_node
11175 "var x := 3; vv8 := 2*x+1; sum(vv8) == (vv8[] * 7)",
11176 "var x := 3; vv7 := 2*x+1; sum(vv7) == (vv7[] * 7)",
11177 "var x := 3; vv6 := 2*x+1; sum(vv6) == (vv6[] * 7)",
11178 "var x := 3; vv5 := 2*x+1; sum(vv5) == (vv5[] * 7)",
11179 "var x := 3; vv4 := 2*x+1; sum(vv4) == (vv4[] * 7)",
11180 "var x := 3; vv3 := 2*x+1; sum(vv3) == (vv3[] * 7)",
11181 "var x := 3; vv2 := 2*x+1; sum(vv2) == (vv2[] * 7)",
11182 "var x := 3; vv1 := 2*x+1; sum(vv1) == (vv1[] * 7)",
11183 "var x[3] := [3]; vv8 := 2x[0]+1; sum(vv8) == (vv8[] * 7)",
11184 "var x[3] := [3]; vv7 := 2x[1]+1; sum(vv7) == (vv7[] * 7)",
11185 "var x[3] := [3]; vv6 := 2x[2]+1; sum(vv6) == (vv6[] * 7)",
11186 "var x[3] := [3]; vv5 := 2x[0]+1; sum(vv5) == (vv5[] * 7)",
11187 "var x[3] := [3]; vv4 := 2x[1]+1; sum(vv4) == (vv4[] * 7)",
11188 "var x[3] := [3]; vv3 := 2x[2]+1; sum(vv3) == (vv3[] * 7)",
11189 "var x[3] := [3]; vv2 := 2x[0]+1; sum(vv2) == (vv2[] * 7)",
11190 "var x[3] := [3]; vv1 := 2x[1]+1; sum(vv1) == (vv1[] * 7)",
11191 "var x[3] := [3]; var y[3] := [1]; vv8 := 2x[0]+y[0]; sum(vv8) == (vv8[] * 7)",
11192 "var x[3] := [3]; var y[3] := [1]; vv7 := 2x[1]+y[1]; sum(vv7) == (vv7[] * 7)",
11193 "var x[3] := [3]; var y[3] := [1]; vv6 := 2x[2]+y[2]; sum(vv6) == (vv6[] * 7)",
11194 "var x[3] := [3]; var y[3] := [1]; vv5 := 2x[0]+y[0]; sum(vv5) == (vv5[] * 7)",
11195 "var x[3] := [3]; var y[3] := [1]; vv4 := 2x[1]+y[1]; sum(vv4) == (vv4[] * 7)",
11196 "var x[3] := [3]; var y[3] := [1]; vv3 := 2x[2]+y[2]; sum(vv3) == (vv3[] * 7)",
11197 "var x[3] := [3]; var y[3] := [1]; vv2 := 2x[0]+y[0]; sum(vv2) == (vv2[] * 7)",
11198 "var x[3] := [3]; var y[3] := [1]; vv1 := 2x[1]+y[1]; sum(vv1) == (vv1[] * 7)",
11199
11200 // swap vec vec node
11201 "var v[8] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 8 + 0)",
11202 "var v[7] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 7 + (7))",
11203 "var v[6] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 6 + (6+7))",
11204 "var v[5] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 5 + (5+6+7))",
11205 "var v[4] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 4 + (4+5+6+7))",
11206 "var v[3] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 3 + (3+4+5+6+7))",
11207 "var v[2] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 2 + (2+3+4+5+6+7))",
11208 "var v[1] := [-1]; vv8 <=> v; sum(vv8) == (-1 * 1 + (1+2+3+4+5+6+7))",
11209 "var v[8] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, -1 }; x == vv8",
11210 "var v[7] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, -1, 7 }; x == vv8",
11211 "var v[6] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, -1, 6, 7 }; x == vv8",
11212 "var v[5] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, -1, 5, 6, 7 }; x == vv8",
11213 "var v[4] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, -1, 4, 5, 6, 7 }; x == vv8",
11214 "var v[3] := [-1]; vv8 <=> v; var x[8] := { -1, -1, -1, 3, 4, 5, 6, 7 }; x == vv8",
11215 "var v[2] := [-1]; vv8 <=> v; var x[8] := { -1, -1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11216 "var v[1] := [-1]; vv8 <=> v; var x[8] := { -1, 1, 2, 3, 4, 5, 6, 7 }; x == vv8",
11217 "var v[3] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 3 + (0))",
11218 "var v[2] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 2 + (2))",
11219 "var v[1] := [-1]; vv3 <=> v; sum(vv3) == (-1 * 1 + (1+2))",
11220 "var v[3] := [-1]; vv3 <=> v; var x[3] := { -1, -1, -1}; x == vv3",
11221 "var v[2] := [-1]; vv3 <=> v; var x[3] := { -1, -1, 2}; x == vv3",
11222 "var v[1] := [-1]; vv3 <=> v; var x[3] := { -1, 1, 2}; x == vv3",
11223
11224 // rebasevector_elem_node
11225 "vv8[0] == 0",
11226 "vv8[2 - 2] == 0",
11227 "vv8[vv8[] - 1] == vv8[] - 1",
11228 "var vec_sum := 0; for (var i := 0; i < vv8[]; i +=1) { vec_sum += vv8[i]; }; vec_sum == (vv8[] - 1) * vv8[] / 2",
11229 "var vec_sum := 0; for (var i := 0; i < vv8[]; i +=1) { vec_sum += vv8[2i / 2]; }; vec_sum == (vv8[] - 1) * vv8[] / 2",
11230 "var x:= 1; var y:= 1; (vv8 + x)[y / x] == 2",
11231 "var x:= 1; var y:= 1; (vv8 + x - y)[y / x] == 1",
11232 "var x:= 1; (x + vv8)[1] == 2",
11233 "var x:= 1; var y:= 1; (x + vv8)[y / x] == 2",
11234 "var x:= 1; var y:= 1; (x + vv8 - y)[y / x] == 1",
11235 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + 1)[i] == i + 1; }; successes == vv8[]",
11236 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i] == i + x; }; successes == vv8[]",
11237 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i] == i + x; }; successes == vv8[]",
11238 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i / x] == i + x; }; successes == vv8[]",
11239 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i / x] == i + x; }; successes == vv8[]",
11240 "(1 + vv8)[1] == 2",
11241 "(vv8 + 1)[1] == 2",
11242 "(vv8 + 1)[2 / 2] == 2",
11243 "(1 + vv8)[2 / 2] == 2",
11244 "var x:= 1; (x + vv8)[1] == 2",
11245 "var x:= 1; (vv8 + x)[1] == 2",
11246 "var x:= 1; var y:= 1; (x + vv8)[y] == 2",
11247 "var x:= 1; var y:= 1; (vv8 + x)[y] == 2",
11248 "var x:= 1; var y:= 1; (vv8 + x)[y / x] == 2",
11249 "var x:= 1; var y:= 1; (vv8 + x - y)[y / x] == 1",
11250 "var x:= 1; var y:= 1; (x + vv8)[y / x] == 2",
11251 "var x:= 1; var y:= 1; (x + vv8 - y)[y / x] == 1",
11252 "(abs(vv8 + 1))[1] == 2",
11253 "(abs(1 + vv8))[1] == 2",
11254 "(abs(vv8 + 1))[2 / 2] == 2",
11255 "(abs(1 + vv8))[2 / 2] == 2",
11256 "(abs(vv8 + 1)/2)[1] == 1",
11257 "(abs(1 + vv8)/2)[1] == 1",
11258 "(abs(vv8 + 1)/2)[2 / 2] == 1",
11259 "(abs(1 + vv8)/2)[2 / 2] == 1",
11260 "(abs(abs(vv8 + 1)) - 1)[1] == 1",
11261 "(abs(2 * abs(vv8 + 1)) - 1)[1] == 3",
11262 "(abs(abs(vv8 + 1) * 2) - 1)[1] == 3",
11263 "(abs(2abs(vv8 + 1)) - 1)[1] == 3",
11264 "(abs(abs(vv8 + 1)2) - 1)[1] == 3",
11265 "var x:= 1; (abs(x + vv8))[1] == 2",
11266 "var x:= 1; (abs(vv8 + x))[1] == 2",
11267 "var x:= 1; var y:= 1; (abs(x + vv8))[y] == 2",
11268 "var x:= 1; var y:= 1; (abs(vv8 + x))[y] == 2",
11269 "var x:= 1; var y:= 1; (abs(vv8 + x))[y / x] == 2",
11270 "var x:= 1; var y:= 1; (abs(vv8 + x - y))[y / x] == 1",
11271 "var x:= 1; var y:= 1; (abs(x + vv8))[y / x] == 2",
11272 "var x:= 1; var y:= 1; (abs(x + vv8 - y))[y / x] == 1",
11273 "var x:= 1; (abs(x + vv8)/2)[1] == 1",
11274 "var x:= 1; (abs(vv8 + x)/2)[1] == 1",
11275 "var x:= 1; var y:= 1; (abs(x + vv8)/2)[y] == 1",
11276 "var x:= 1; var y:= 1; (abs(vv8 + x)/2)[y] == 1",
11277 "var x:= 1; var y:= 1; (abs(vv8 + x)/2)[y / x] == 1",
11278 "var x:= 1; var y:= 1; (abs(x + vv8)/2)[y / x] == 1",
11279 "var x := 1; (abs(abs(vv8 + x)) - x)[1] == 1",
11280 "var x := 1; (abs(2 * abs(vv8 + x)) - x)[1] == 3",
11281 "var x := 1; (abs(abs(vv8 + x) * 2) - x)[1] == 3",
11282 "var x := 1; (abs(2abs(vv8 + x)) - x)[1] == 3",
11283 "var x := 1; (abs(abs(vv8 + x)2) - x)[1] == 3",
11284 "var x := 1; var y := 1; (abs(abs(vv8 + x)) - x)[y] == 1",
11285 "var x := 1; var y := 1; (abs(2 * abs(vv8 + x)) - x)[y] == 3",
11286 "var x := 1; var y := 1; (abs(abs(vv8 + x) * 2) - x)[y] == 3",
11287 "var x := 1; var y := 1; (abs(2abs(vv8 + x)) - x)[y] == 3",
11288 "var x := 1; var y := 1; (abs(abs(vv8 + x)2) - x)[y] == 3",
11289 "var x := 1; var y := 1; (abs(abs(vv8 + x)) - x)[x / y] == 1",
11290 "var x := 1; var y := 1; (abs(2 * abs(vv8 + x)) - x)[x / y] == 3",
11291 "var x := 1; var y := 1; (abs(abs(vv8 + x) * 2) - x)[x / y] == 3",
11292 "var x := 1; var y := 1; (abs(2abs(vv8 + x)) - x)[x / y] == 3",
11293 "var x := 1; var y := 1; (abs(abs(vv8 + x)2) - x)[x / y] == 3",
11294 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + 1)[i] == i + 1; }; successes == vv8[]",
11295 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i] == i + x; }; successes == vv8[]",
11296 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i] == i + x; }; successes == vv8[]",
11297 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (vv8 + x)[i / x] == i + x; }; successes == vv8[]",
11298 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (x + vv8)[i / x] == i + x; }; successes == vv8[]",
11299 "var successes := 0; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + 1))[i] == i + 1; }; successes == vv8[]",
11300 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + x))[i] == i + x; }; successes == vv8[]",
11301 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(x + vv8))[i] == i + x; }; successes == vv8[]",
11302 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(vv8 + x))[i / x] == i + x; }; successes == vv8[]",
11303 "var successes := 0; var x := 1 ; for(var i:=0; i < vv8[]; i += 1) { successes += (abs(x + vv8))[i / x] == i + x; }; successes == vv8[]",
11304 };
11305
11306 bool error_found = false;
11307
11308 for (std::size_t e = 0; e < sizeof(expressions)/sizeof(std::string); ++e)
11309 {
11310 T vs8[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
11311 T vs7[] = { 0, 1, 2, 3, 4, 5, 6 };
11312 T vs6[] = { 0, 1, 2, 3, 4, 5 };
11313 T vs5[] = { 0, 1, 2, 3, 4 };
11314 T vs4[] = { 0, 1, 2, 3 };
11315 T vs3[] = { 0, 1, 2 };
11316 T vs2[] = { 0, 1 };
11317 T vs1[] = { 0 };
11318
11327
11328 symbol_table_t symbol_table;
11329
11330 symbol_table.add_vector("vv1", vv1);
11331 symbol_table.add_vector("vv2", vv2);
11332 symbol_table.add_vector("vv3", vv3);
11333 symbol_table.add_vector("vv4", vv4);
11334 symbol_table.add_vector("vv5", vv5);
11335 symbol_table.add_vector("vv6", vv6);
11336 symbol_table.add_vector("vv7", vv7);
11337 symbol_table.add_vector("vv8", vv8);
11338
11339 parser_t parser;
11340
11341 const std::string& expression_string = expressions[e];
11342 expression_t expression;
11343 expression.register_symbol_table(symbol_table);
11344
11345 if (!parser.compile(expression_string,expression))
11346 {
11347 printf("run_test21() - vector_veiw expression compilation error. Expression: %s\n",
11348 expression_string.c_str());
11349
11350 for (std::size_t i = 0; i < parser.error_count(); ++i)
11351 {
11352 error_type error = parser.get_error(i);
11353 exprtk::parser_error::update_error(error,expression_string);
11354
11355 printf("run_test21() - Exp[%02d] Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11356 static_cast<unsigned int>(e),
11357 static_cast<unsigned int>(i),
11358 static_cast<unsigned int>(error.token.position),
11359 static_cast<unsigned int>(error.line_no),
11360 static_cast<unsigned int>(error.column_no),
11361 exprtk::parser_error::to_str(error.mode).c_str(),
11362 error.diagnostic.c_str());
11363 }
11364
11365 error_found = true;
11366
11367 continue;
11368 }
11369
11370 const T result = expression.value();
11371
11372 if (result != T(1.0))
11373 {
11374 error_found = true;
11375
11376 printf("run_test21() - Error: Exp[%02d] Expression result: %5.3f expected: 1 expression: %s\n",
11377 static_cast<unsigned int>(e),
11378 static_cast<double>(result),
11379 expression_string.c_str());
11380 }
11381 }
11382
11383 if (error_found)
11384 {
11385 return false;
11386 }
11387 }
11388
11389 {
11390 const std::string expressions[] =
11391 {
11392 "vv0[] == vv0_size",
11393 "sum(vv0) == (vv0[] * (vv0[] + 1) / 2) and (vv0[] == vv0_size)",
11394 "(min(vv0) == 1) and (vv0[] == vv0_size)",
11395 "(max(vv0) == vv0[]) and (vv0[] == vv0_size)",
11396 "(avg(vv0) == (min(vv0) + max(vv0)) / 2) and (vv0[] == vv0_size)",
11397 "(sum(vv0 + 1) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * 1))) and (vv0[] == vv0_size)",
11398 "(sum(vv0 - 1) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * 1))) and (vv0[] == vv0_size)",
11399 "(sum(1 + vv0) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * 1))) and (vv0[] == vv0_size)",
11400 "(sum(-1 + vv0) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * 1))) and (vv0[] == vv0_size)",
11401 "var x:= 1; sum(vv0 + x) == (vv0[] * (vv0[] + 1) / 2 + (vv0[] * x)) and (vv0[] == vv0_size)",
11402 "var x:= 1; sum(vv0 - x) == (vv0[] * (vv0[] + 1) / 2 - (vv0[] * x)) and (vv0[] == vv0_size)",
11403 "sum(2vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11404 "sum(vv0 * 2) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11405 "sum(2vv0 + 1) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11406 "sum(1 + 2vv0) == (vv0[] * (vv0[] + 1) + vv0[]) and (vv0[] == vv0_size)",
11407 "var x := 1; sum(2vv0 + x) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11408 "var x := 1; sum(x + 2vv0) == (vv0[] * (vv0[] + 1) + x * vv0[]) and (vv0[] == vv0_size)",
11409 "sum(vv0 += 1) == (vv0[] * (vv0[] + 1) / 2 + vv0[]) and (vv0[] == vv0_size)",
11410 "var x:= 1; sum(vv0 += x) == (vv0[] * (vv0[] + 1) / 2 + x * vv0[]) and (vv0[] == vv0_size)",
11411 "var x:= 1; sum(vv0 -= x) == (vv0[] * (vv0[] + 1 - 2x) / 2) and (vv0[] == vv0_size)",
11412 "(sum(2vv0) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
11413 "(sum(vv0 * 2) == 2 * sum(vv0)) and (vv0[] == vv0_size)",
11414 "var x:= 1; sum(2vv0) == (vv0[] * (vv0[] + 1)) and (vv0[] == vv0_size)",
11415 "var x := 2; sum(if (x > 1) { vv0 } else { vv1 }) == sum(vv0)",
11416 "dot(2 * vv0,vv1 - 1) + dot(2 * vv0,vv1 - 1) == 2sum(2vv0 * (vv1 - 1))",
11417 "(0 * dot(2 * vv0,vv1 - 1)) == 0"
11418 };
11419
11420 bool error_found = false;
11421
11422 for (std::size_t e = 0; e < sizeof(expressions) / sizeof(std::string); ++e)
11423 {
11424 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11425 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11426
11427 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11429
11430 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11432
11433 T vv0_size = T(0.0);
11434
11435 symbol_table_t symbol_table;
11436 symbol_table.add_variable("vv0_size", vv0_size);
11437 symbol_table.add_vector ("vv0" , vv0 );
11438 symbol_table.add_vector ("vv1" , vv1 );
11439
11440 exprtk::rtl::vecops::package<T> vector_package;
11441 exprtk::rtl::io::package<T> io_package;
11442
11443 symbol_table.add_package( vector_package );
11444 symbol_table.add_package( io_package );
11445
11446 const std::string& expression_string = expressions[e];
11447 expression_t expression;
11448 expression.register_symbol_table(symbol_table);
11449
11450 parser_t parser;
11451
11452 if (!parser.compile(expression_string, expression))
11453 {
11454 printf("run_test21() - Error: %s\tExpression: %s\n",
11455 parser.error().c_str(),
11456 expression_string.c_str());
11457
11458 for (std::size_t i = 0; i < parser.error_count(); ++i)
11459 {
11460 error_type error = parser.get_error(i);
11461 exprtk::parser_error::update_error(error,expression_string);
11462
11463 printf("run_test21() - Exp[%02d] Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11464 static_cast<unsigned int>(e),
11465 static_cast<unsigned int>(i),
11466 static_cast<unsigned int>(error.token.position),
11467 static_cast<unsigned int>(error.line_no),
11468 static_cast<unsigned int>(error.column_no),
11469 exprtk::parser_error::to_str(error.mode).c_str(),
11470 error.diagnostic.c_str());
11471 }
11472
11473 continue;
11474 }
11475
11476 for (std::size_t i = 1; i <= vv0.base_size(); ++i)
11477 {
11478 v0.assign(vanilla, vanilla + vanilla_size);
11479 v1.assign(vanilla, vanilla + vanilla_size);
11480
11481 vv0_size = T(i);
11482 vv0.set_size(i);
11483
11484 const T result = expression.value();
11485
11486 if (result != 1)
11487 {
11488 printf("run_test21() - Exp[%02d] Error: size: %d expected 1 instead got: %f expr:%s\n",
11489 static_cast<unsigned int>(e),
11490 static_cast<unsigned int>(i),
11491 static_cast<double>(result),
11492 expression_string.c_str());
11493 }
11494 }
11495
11496 vv1.rebase(v0.data());
11497 vv0.rebase(v1.data());
11498 expression.value();
11499
11500 vv0.rebase(v0.data());
11501 vv1.rebase(v1.data());
11502 expression.value();
11503
11504 expression.release();
11505 }
11506
11507 if (error_found)
11508 {
11509 return false;
11510 }
11511 }
11512
11513 {
11514 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11515 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11516
11517 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11518 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11519
11521
11522 vv_size_handler_t<T> vv_size_handler;
11523 vv_size_handler.register_vector_view(vv);
11524
11525 symbol_table_t symbol_table;
11526 symbol_table.add_vector("v", vv);
11527
11528 exprtk::rtl::vecops::package<T> vector_package;
11529 exprtk::rtl::io::package<T> io_package;
11530
11531 symbol_table.add_package( vector_package );
11532 symbol_table.add_package( io_package );
11533 symbol_table.add_function("resize", vv_size_handler);
11534
11535 expression_t expression;
11536 expression.register_symbol_table(symbol_table);
11537
11538 parser_t parser;
11539
11540 const std::string resize_expression =
11541 " var vec_original_size := v[]; "
11542 " var success_count := 0; "
11543 " "
11544 " for (var i := 1; i <= vec_original_size; i += 1) "
11545 " { "
11546 " if (resize(v,i) == true and v[] == i) "
11547 " { "
11548 " success_count += 1; "
11549 " } "
11550 " }; "
11551 " "
11552 " success_count == vec_original_size ";
11553
11554 if (!parser.compile(resize_expression, expression))
11555 {
11556 printf("run_test21() - Error: %s\tExpression: %s\n",
11557 parser.error().c_str(),
11558 resize_expression.c_str());
11559
11560 for (std::size_t i = 0; i < parser.error_count(); ++i)
11561 {
11562 error_type error = parser.get_error(i);
11563 exprtk::parser_error::update_error(error,resize_expression);
11564
11565 printf("run_test21() - Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11566 static_cast<unsigned int>(i),
11567 static_cast<unsigned int>(error.token.position),
11568 static_cast<unsigned int>(error.line_no),
11569 static_cast<unsigned int>(error.column_no),
11570 exprtk::parser_error::to_str(error.mode).c_str(),
11571 error.diagnostic.c_str());
11572 }
11573
11574 return false;
11575 }
11576
11577 const T value0 = expression.value();
11578
11579 if (expression.value() != T(1))
11580 {
11581 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (1)\n", static_cast<double>(value0));
11582 }
11583
11584 vv.rebase(v1.data());
11585 vv_size_handler.register_vector_view(vv);
11586
11587 const T value1 = expression.value();
11588
11589 if (expression.value() != T(1))
11590 {
11591 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (1)\n", static_cast<double>(value1));
11592 }
11593
11594 vv.rebase(v0.data());
11595 vv_size_handler.register_vector_view(vv);
11596
11597 expression.release();
11598 }
11599
11600 {
11601 const T vanilla[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
11602 const std::size_t vanilla_size = sizeof(vanilla) / sizeof(T);
11603
11604 std::vector<T> v0(vanilla, vanilla + vanilla_size);
11605 std::vector<T> v1(vanilla, vanilla + vanilla_size);
11606
11608
11609 vv_size_handler_t<T> vv_size_handler;
11610 vv_size_handler.register_vector_view(vv);
11611
11612 symbol_table_t symbol_table;
11613 symbol_table.add_vector("v", vv);
11614
11615 exprtk::rtl::vecops::package<T> vector_package;
11616 exprtk::rtl::io::package<T> io_package;
11617
11618 symbol_table.add_package( vector_package );
11619 symbol_table.add_package( io_package );
11620 symbol_table.add_function("resize", vv_size_handler);
11621
11622 expression_t expression;
11623 expression.register_symbol_table(symbol_table);
11624
11625 parser_t parser;
11626
11627 const std::string resize_expression =
11628 " var vec_original_size := v[]; "
11629 " var failure_count := 0; "
11630 " "
11631 " for (var i := vec_original_size + 1; i <= 2 * vec_original_size; i += 1) "
11632 " { "
11633 " if (resize(v,i) == false or v[] != i) "
11634 " { "
11635 " failure_count += 1 "
11636 " } "
11637 " }; "
11638 " "
11639 " failure_count == vec_original_size ";
11640
11641 if (!parser.compile(resize_expression, expression))
11642 {
11643 printf("run_test21() - Error: %s\tExpression: %s\n",
11644 parser.error().c_str(),
11645 resize_expression.c_str());
11646
11647 for (std::size_t i = 0; i < parser.error_count(); ++i)
11648 {
11649 error_type error = parser.get_error(i);
11650 exprtk::parser_error::update_error(error,resize_expression);
11651
11652 printf("run_test21() - Error[%02d] Position: %02d line: %d column: %d Type: [%14s] Msg: %s\n",
11653 static_cast<unsigned int>(i),
11654 static_cast<unsigned int>(error.token.position),
11655 static_cast<unsigned int>(error.line_no),
11656 static_cast<unsigned int>(error.column_no),
11657 exprtk::parser_error::to_str(error.mode).c_str(),
11658 error.diagnostic.c_str());
11659 }
11660
11661 return false;
11662 }
11663
11664 const T value0 = expression.value();
11665
11666 if (expression.value() != T(1))
11667 {
11668 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (2)\n", static_cast<double>(value0));
11669 }
11670
11671 vv.rebase(v1.data());
11672 vv_size_handler.register_vector_view(vv);
11673
11674 const T value1 = expression.value();
11675
11676 if (expression.value() != T(1))
11677 {
11678 printf("run_test21() - Error: Failed evaluation Expected 1 got: %f (2)\n", static_cast<double>(value1));
11679 }
11680
11681 vv.rebase(v0.data());
11682 vv_size_handler.register_vector_view(vv);
11683
11684 expression.release();
11685 }
11686
11687 return true;
11688}
11689
11691{
11692 std::size_t assert_count;
11694 {
11695 ++assert_count;
11696 }
11697};
11698
11699template <typename T>
11701{
11702 typedef exprtk::symbol_table<T> symbol_table_t;
11703 typedef exprtk::expression<T> expression_t;
11704 typedef exprtk::parser<T> parser_t;
11705
11706 bool result = true;
11707
11708 {
11709 const std::string expressions[] =
11710 {
11711 " assert(1 > 1); ",
11712 " assert(1 > 2, 'assert statement 2'); ",
11713 " assert(1 > 3, 'assert ' + 'statement 3'); ",
11714 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); ",
11715 " assert(1 > 5, 'assert ' + 'statement 5'); ",
11716 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); "
11717 };
11718
11719 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11720
11721 for (std::size_t i = 0; i < expression_count; ++i)
11722 {
11723 expression_t expression;
11724 parser_t parser;
11725
11726 if (!parser.compile(expressions[i], expression))
11727 {
11728 printf("run_test22() - Error: %s\tExpression: %s [1]\n",
11729 parser.error().c_str(),
11730 expressions[i].c_str());
11731 result = false;
11732 continue;
11733 }
11734 else if (!exprtk::expression_helper<T>::is_null(expression))
11735 {
11736 printf("run_test22() - Error: Expression is not null! expression: %s [1]\n",
11737 expressions[i].c_str());
11738 result = false;
11739 continue;
11740 }
11741
11742 expression.value();
11743 }
11744 }
11745
11746 {
11747 const std::string expressions[] =
11748 {
11749 " assert(1 > 1); 1 + 0 ",
11750 " assert(1 > 2, 'assert statement 2'); 2 + 0 ",
11751 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0 ",
11752 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
11753 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 ",
11754 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
11755 };
11756
11757 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11758
11759 for (std::size_t i = 0; i < expression_count; ++i)
11760 {
11761 expression_t expression;
11762 parser_t parser;
11763
11764 if (!parser.compile(expressions[i], expression))
11765 {
11766 printf("run_test22() - Error: %s\tExpression: %s [2]\n",
11767 parser.error().c_str(),
11768 expressions[i].c_str());
11769 result = false;
11770 continue;
11771 }
11772 else if (!exprtk::expression_helper<T>::is_literal(expression))
11773 {
11774 printf("run_test22() - Error: Expression is not constant! expression: %s [2]\n",
11775 expressions[i].c_str());
11776 continue;
11777 }
11778
11779 expression.value();
11780 }
11781 }
11782
11783 {
11784 const std::string expressions[] =
11785 {
11786 " assert(1 > 1); "
11787 " assert(1 > 2, 'assert statement 2'); "
11788 " assert(1 > 3, 'assert ' + 'statement 3'); "
11789 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); "
11790 " assert(1 > 5, 'assert ' + 'statement 5'); "
11791 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); "
11792 };
11793
11794 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11795
11796 for (std::size_t i = 0; i < expression_count; ++i)
11797 {
11798 expression_t expression;
11799 parser_t parser;
11800 assert_handler handler;
11801
11802 handler.assert_count = 0;
11803
11804 parser.register_assert_check(handler);
11805
11806 if (!parser.compile(expressions[i], expression))
11807 {
11808 printf("run_test22() - Error: %s\tExpression: %s [3]\n",
11809 parser.error().c_str(),
11810 expressions[i].c_str());
11811 result = false;
11812 continue;
11813 }
11814
11815 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11816
11817 typedef typename exprtk::expression_helper<T> et_t;
11818 type_sequence.push_back(et_t::e_assert);
11819 type_sequence.push_back(et_t::e_assert);
11820 type_sequence.push_back(et_t::e_assert);
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
11825 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11826 {
11827 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [3]\n",
11828 expressions[i].c_str());
11829 result = false;
11830 continue;
11831 }
11832
11833 expression.value();
11834
11835 if (6 != handler.assert_count)
11836 {
11837 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [3]\n",
11838 static_cast<int>(handler.assert_count),
11839 expressions[i].c_str());
11840 result = false;
11841 continue;
11842 }
11843 }
11844 }
11845
11846 {
11847 const std::string expressions[] =
11848 {
11849 " assert(1 > 1); 1 ",
11850 " assert(1 > 2, 'assert statement 2'); 2 ",
11851 " assert(1 > 3, 'assert ' + 'statement 3'); 3 ",
11852 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 ",
11853 " assert(1 > 5, 'assert ' + 'statement 5'); 5 ",
11854 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 "
11855 };
11856
11857 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11858
11859 for (std::size_t i = 0; i < expression_count; ++i)
11860 {
11861 expression_t expression;
11862 parser_t parser;
11863 assert_handler handler;
11864
11865 handler.assert_count = 0;
11866
11867 parser.register_assert_check(handler);
11868
11869 if (!parser.compile(expressions[i], expression))
11870 {
11871 printf("run_test22() - Error: %s\tExpression: %s [4]\n",
11872 parser.error().c_str(),
11873 expressions[i].c_str());
11874 result = false;
11875 continue;
11876 }
11877
11878 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11879
11880 typedef typename exprtk::expression_helper<T> et_t;
11881 type_sequence.push_back(et_t::e_assert );
11882 type_sequence.push_back(et_t::e_literal);
11883
11884 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11885 {
11886 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [4]\n",
11887 expressions[i].c_str());
11888 result = false;
11889 continue;
11890 }
11891
11892 expression.value();
11893
11894 if (1 != handler.assert_count)
11895 {
11896 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [4]\n",
11897 static_cast<int>(handler.assert_count),
11898 expressions[i].c_str());
11899 result = false;
11900 continue;
11901 }
11902 }
11903 }
11904
11905 {
11906 const std::string expressions[] =
11907 {
11908 " assert(1 > 1); 1 + 0 ",
11909 " assert(1 > 2, 'assert statement 2'); 2 + 0 ",
11910 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0 ",
11911 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
11912 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 ",
11913 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
11914 };
11915
11916 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11917
11918 for (std::size_t i = 0; i < expression_count; ++i)
11919 {
11920 expression_t expression;
11921 parser_t parser;
11922 assert_handler handler;
11923
11924 handler.assert_count = 0;
11925
11926 parser.register_assert_check(handler);
11927
11928 if (!parser.compile(expressions[i], expression))
11929 {
11930 printf("run_test22() - Error: %s\tExpression: %s [5]\n",
11931 parser.error().c_str(),
11932 expressions[i].c_str());
11933 result = false;
11934 continue;
11935 }
11936
11937 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11938
11939 typedef typename exprtk::expression_helper<T> et_t;
11940 type_sequence.push_back(et_t::e_assert );
11941 type_sequence.push_back(et_t::e_literal);
11942
11943 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
11944 {
11945 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [5]\n",
11946 expressions[i].c_str());
11947 result = false;
11948 continue;
11949 }
11950
11951 expression.value();
11952
11953 if (1 != handler.assert_count)
11954 {
11955 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [5]\n",
11956 static_cast<int>(handler.assert_count),
11957 expressions[i].c_str());
11958 result = false;
11959 continue;
11960 }
11961 }
11962 }
11963
11964 {
11965 const std::string expressions[] =
11966 {
11967 " assert(1 > 1); 'assert statement 0001' ",
11968 " assert(1 > 2, 'assert statement 2'); 'assert statement 0002' ",
11969 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert statement 0003' ",
11970 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert statement 0004' ",
11971 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert statement 0005' ",
11972 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement 0006' "
11973 };
11974
11975 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
11976
11977 for (std::size_t i = 0; i < expression_count; ++i)
11978 {
11979 expression_t expression;
11980 parser_t parser;
11981 assert_handler handler;
11982
11983 handler.assert_count = 0;
11984
11985 parser.register_assert_check(handler);
11986
11987 if (!parser.compile(expressions[i], expression))
11988 {
11989 printf("run_test22() - Error: %s\tExpression: %s [6]\n",
11990 parser.error().c_str(),
11991 expressions[i].c_str());
11992 result = false;
11993 continue;
11994 }
11995
11996 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
11997
11998 typedef typename exprtk::expression_helper<T> et_t;
11999 type_sequence.push_back(et_t::e_assert);
12000 type_sequence.push_back(et_t::e_string);
12001
12002 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12003 {
12004 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [6]\n",
12005 expressions[i].c_str());
12006 result = false;
12007 continue;
12008 }
12009
12010 expression.value();
12011
12012 if (1 != handler.assert_count)
12013 {
12014 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [6]\n",
12015 static_cast<int>(handler.assert_count),
12016 expressions[i].c_str());
12017 result = false;
12018 continue;
12019 }
12020 }
12021 }
12022
12023 {
12024 const std::string expressions[] =
12025 {
12026 " assert(1 > 1); 'assert statement' + '0001' ",
12027 " assert(1 > 2, 'assert statement 2'); 'assert statement' + '0002' ",
12028 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert statement' + '0003' ",
12029 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert statement' + '0004' ",
12030 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert statement' + '0005' ",
12031 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement' + '0006' "
12032 };
12033
12034 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12035
12036 for (std::size_t i = 0; i < expression_count; ++i)
12037 {
12038 expression_t expression;
12039 parser_t parser;
12040 assert_handler handler;
12041
12042 handler.assert_count = 0;
12043
12044 parser.register_assert_check(handler);
12045
12046 if (!parser.compile(expressions[i], expression))
12047 {
12048 printf("run_test22() - Error: %s\tExpression: %s [7]\n",
12049 parser.error().c_str(),
12050 expressions[i].c_str());
12051 result = false;
12052 continue;
12053 }
12054
12055 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12056
12057 typedef typename exprtk::expression_helper<T> et_t;
12058 type_sequence.push_back(et_t::e_assert);
12059 type_sequence.push_back(et_t::e_string);
12060
12061 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12062 {
12063 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [7]\n",
12064 expressions[i].c_str());
12065 result = false;
12066 continue;
12067 }
12068
12069 expression.value();
12070
12071 if (1 != handler.assert_count)
12072 {
12073 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [7]\n",
12074 static_cast<int>(handler.assert_count),
12075 expressions[i].c_str());
12076 result = false;
12077 continue;
12078 }
12079 }
12080 }
12081
12082 {
12083 const std::string expressions[] =
12084 {
12085 " assert(x > y); ",
12086 " assert(x > y, 'assert statement 2'); ",
12087 " assert(x > y, 'assert ' + 'statement 3'); ",
12088 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); ",
12089 " assert(x > y, 'assert ' + 'statement 5'); ",
12090 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); "
12091 };
12092
12093 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12094
12095 for (std::size_t i = 0; i < expression_count; ++i)
12096 {
12097 T x = T(1);
12098 T y = T(2);
12099
12100 symbol_table_t symbol_table;
12101 expression_t expression;
12102 parser_t parser;
12103
12104 symbol_table.add_variable("x", x);
12105 symbol_table.add_variable("y", y);
12106 expression.register_symbol_table(symbol_table);
12107
12108 if (!parser.compile(expressions[i], expression))
12109 {
12110 printf("run_test22() - Error: %s\tExpression: %s [8]\n",
12111 parser.error().c_str(),
12112 expressions[i].c_str());
12113 result = false;
12114 continue;
12115 }
12116 else if (!exprtk::expression_helper<T>::is_null(expression))
12117 {
12118 printf("run_test22() - Error: Expression is not null! expression: %s [8]\n",
12119 expressions[i].c_str());
12120 result = false;
12121 continue;
12122 }
12123
12124 expression.value();
12125 }
12126 }
12127
12128 {
12129 const std::string expressions[] =
12130 {
12131 " assert(x > y); 1 + 0 ",
12132 " assert(x > y, 'assert statement 2'); 2 + 0 ",
12133 " assert(x > y, 'assert ' + 'statement 3'); 3 + 0 ",
12134 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
12135 " assert(x > y, 'assert ' + 'statement 5'); 5 + 0 ",
12136 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
12137 };
12138
12139 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12140
12141 for (std::size_t i = 0; i < expression_count; ++i)
12142 {
12143 T x = T(1);
12144 T y = T(2);
12145
12146 symbol_table_t symbol_table;
12147 expression_t expression;
12148 parser_t parser;
12149
12150 symbol_table.add_variable("x", x);
12151 symbol_table.add_variable("y", y);
12152 expression.register_symbol_table(symbol_table);
12153
12154 if (!parser.compile(expressions[i], expression))
12155 {
12156 printf("run_test22() - Error: %s\tExpression: %s [9]\n",
12157 parser.error().c_str(),
12158 expressions[i].c_str());
12159 result = false;
12160 continue;
12161 }
12162 else if (!exprtk::expression_helper<T>::is_literal(expression))
12163 {
12164 printf("run_test22() - Error: Expression is not constant! expression: %s [9]\n",
12165 expressions[i].c_str());
12166 continue;
12167 }
12168
12169 expression.value();
12170 }
12171 }
12172
12173 {
12174 const std::string expressions[] =
12175 {
12176 " assert(x > y); "
12177 " assert(x > y, 'assert statement 2'); "
12178 " assert(x > y, 'assert ' + 'statement 3'); "
12179 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); "
12180 " assert(x > y, 'assert ' + 'statement 5'); "
12181 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); "
12182 };
12183
12184 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12185
12186 for (std::size_t i = 0; i < expression_count; ++i)
12187 {
12188 T x = T(1);
12189 T y = T(2);
12190
12191 symbol_table_t symbol_table;
12192 expression_t expression;
12193 parser_t parser;
12194 assert_handler handler;
12195
12196 handler.assert_count = 0;
12197
12198 symbol_table.add_variable("x", x);
12199 symbol_table.add_variable("y", y);
12200 expression.register_symbol_table(symbol_table);
12201
12202 parser.register_assert_check(handler);
12203
12204 if (!parser.compile(expressions[i], expression))
12205 {
12206 printf("run_test22() - Error: %s\tExpression: %s [10]\n",
12207 parser.error().c_str(),
12208 expressions[i].c_str());
12209 result = false;
12210 continue;
12211 }
12212
12213 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12214
12215 typedef typename exprtk::expression_helper<T> et_t;
12216 type_sequence.push_back(et_t::e_assert);
12217 type_sequence.push_back(et_t::e_assert);
12218 type_sequence.push_back(et_t::e_assert);
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
12223 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12224 {
12225 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [10]\n",
12226 expressions[i].c_str());
12227 result = false;
12228 continue;
12229 }
12230
12231 expression.value();
12232
12233 if (6 != handler.assert_count)
12234 {
12235 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [10]\n",
12236 static_cast<int>(handler.assert_count),
12237 expressions[i].c_str());
12238 result = false;
12239 continue;
12240 }
12241 }
12242 }
12243
12244 {
12245 const std::string expressions[] =
12246 {
12247 " assert(x > y); 1 ",
12248 " assert(x > y, 'assert statement 2'); 2 ",
12249 " assert(x > y, 'assert ' + 'statement 3'); 3 ",
12250 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 ",
12251 " assert(x > y, 'assert ' + 'statement 5'); 5 ",
12252 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 "
12253 };
12254
12255 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12256
12257 for (std::size_t i = 0; i < expression_count; ++i)
12258 {
12259 T x = T(1);
12260 T y = T(2);
12261
12262 symbol_table_t symbol_table;
12263 expression_t expression;
12264 parser_t parser;
12265 assert_handler handler;
12266
12267 handler.assert_count = 0;
12268
12269 symbol_table.add_variable("x", x);
12270 symbol_table.add_variable("y", y);
12271 expression.register_symbol_table(symbol_table);
12272
12273 parser.register_assert_check(handler);
12274
12275 if (!parser.compile(expressions[i], expression))
12276 {
12277 printf("run_test22() - Error: %s\tExpression: %s [11]\n",
12278 parser.error().c_str(),
12279 expressions[i].c_str());
12280 result = false;
12281 continue;
12282 }
12283
12284 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12285
12286 typedef typename exprtk::expression_helper<T> et_t;
12287 type_sequence.push_back(et_t::e_assert );
12288 type_sequence.push_back(et_t::e_literal);
12289
12290 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12291 {
12292 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [11]\n",
12293 expressions[i].c_str());
12294 result = false;
12295 continue;
12296 }
12297
12298 expression.value();
12299
12300 if (1 != handler.assert_count)
12301 {
12302 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [11]\n",
12303 static_cast<int>(handler.assert_count),
12304 expressions[i].c_str());
12305 result = false;
12306 continue;
12307 }
12308
12309 }
12310 }
12311
12312 {
12313 const std::string expressions[] =
12314 {
12315 " assert(x > y); 1 + 0 ",
12316 " assert(x > y, 'assert statement 2'); 2 + 0 ",
12317 " assert(x > y, 'assert ' + 'statement 3'); 3 + 0 ",
12318 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 4 + 0 ",
12319 " assert(x > y, 'assert ' + 'statement 5'); 5 + 0 ",
12320 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0 "
12321 };
12322
12323 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12324
12325 for (std::size_t i = 0; i < expression_count; ++i)
12326 {
12327 T x = T(1);
12328 T y = T(2);
12329
12330 symbol_table_t symbol_table;
12331 expression_t expression;
12332 parser_t parser;
12333 assert_handler handler;
12334
12335 handler.assert_count = 0;
12336
12337 symbol_table.add_variable("x", x);
12338 symbol_table.add_variable("y", y);
12339 expression.register_symbol_table(symbol_table);
12340
12341 parser.register_assert_check(handler);
12342
12343 if (!parser.compile(expressions[i], expression))
12344 {
12345 printf("run_test22() - Error: %s\tExpression: %s [12]\n",
12346 parser.error().c_str(),
12347 expressions[i].c_str());
12348 result = false;
12349 continue;
12350 }
12351
12352 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12353
12354 typedef typename exprtk::expression_helper<T> et_t;
12355 type_sequence.push_back(et_t::e_assert );
12356 type_sequence.push_back(et_t::e_literal);
12357
12358 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12359 {
12360 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [12]\n",
12361 expressions[i].c_str());
12362 result = false;
12363 continue;
12364 }
12365
12366 expression.value();
12367
12368 if (1 != handler.assert_count)
12369 {
12370 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [12]\n",
12371 static_cast<int>(handler.assert_count),
12372 expressions[i].c_str());
12373 result = false;
12374 continue;
12375 }
12376 }
12377 }
12378
12379 {
12380 const std::string expressions[] =
12381 {
12382 " assert(x > y); 'assert statement 0001' ",
12383 " assert(x > y, 'assert statement 2'); 'assert statement 0002' ",
12384 " assert(x > y, 'assert ' + 'statement 3'); 'assert statement 0003' ",
12385 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert statement 0004' ",
12386 " assert(x > y, 'assert ' + 'statement 5'); 'assert statement 0005' ",
12387 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement 0006' "
12388 };
12389
12390 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12391
12392 for (std::size_t i = 0; i < expression_count; ++i)
12393 {
12394 T x = T(1);
12395 T y = T(2);
12396
12397 symbol_table_t symbol_table;
12398 expression_t expression;
12399 parser_t parser;
12400 assert_handler handler;
12401
12402 handler.assert_count = 0;
12403
12404 symbol_table.add_variable("x", x);
12405 symbol_table.add_variable("y", y);
12406 expression.register_symbol_table(symbol_table);
12407
12408 parser.register_assert_check(handler);
12409
12410 if (!parser.compile(expressions[i], expression))
12411 {
12412 printf("run_test22() - Error: %s\tExpression: %s [13]\n",
12413 parser.error().c_str(),
12414 expressions[i].c_str());
12415 result = false;
12416 continue;
12417 }
12418
12419 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12420
12421 typedef typename exprtk::expression_helper<T> et_t;
12422 type_sequence.push_back(et_t::e_assert);
12423 type_sequence.push_back(et_t::e_string);
12424
12425 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12426 {
12427 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [13]\n",
12428 expressions[i].c_str());
12429 result = false;
12430 continue;
12431 }
12432
12433 expression.value();
12434
12435 if (1 != handler.assert_count)
12436 {
12437 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [13]\n",
12438 static_cast<int>(handler.assert_count),
12439 expressions[i].c_str());
12440 result = false;
12441 continue;
12442 }
12443 }
12444 }
12445
12446 {
12447 const std::string expressions[] =
12448 {
12449 " assert(x > y); 'assert statement' + '0001' ",
12450 " assert(x > y, 'assert statement 2'); 'assert statement' + '0002' ",
12451 " assert(x > y, 'assert ' + 'statement 3'); 'assert statement' + '0003' ",
12452 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert statement' + '0004' ",
12453 " assert(x > y, 'assert ' + 'statement 5'); 'assert statement' + '0005' ",
12454 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert statement' + '0006' "
12455 };
12456
12457 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12458
12459 for (std::size_t i = 0; i < expression_count; ++i)
12460 {
12461 T x = T(1);
12462 T y = T(2);
12463
12464 symbol_table_t symbol_table;
12465 expression_t expression;
12466 parser_t parser;
12467 assert_handler handler;
12468
12469 handler.assert_count = 0;
12470
12471 symbol_table.add_variable("x", x);
12472 symbol_table.add_variable("y", y);
12473 expression.register_symbol_table(symbol_table);
12474
12475 parser.register_assert_check(handler);
12476
12477 if (!parser.compile(expressions[i], expression))
12478 {
12479 printf("run_test22() - Error: %s\tExpression: %s [14]\n",
12480 parser.error().c_str(),
12481 expressions[i].c_str());
12482 result = false;
12483 continue;
12484 }
12485
12486 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12487
12488 typedef typename exprtk::expression_helper<T> et_t;
12489 type_sequence.push_back(et_t::e_assert);
12490 type_sequence.push_back(et_t::e_string);
12491
12492 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12493 {
12494 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [14]\n",
12495 expressions[i].c_str());
12496 result = false;
12497 continue;
12498 }
12499
12500 expression.value();
12501
12502 if (1 != handler.assert_count)
12503 {
12504 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [14]\n",
12505 static_cast<int>(handler.assert_count),
12506 expressions[i].c_str());
12507 result = false;
12508 continue;
12509 }
12510 }
12511 }
12512
12513 {
12514 const std::string expressions[] =
12515 {
12516 " assert(1 > 1); 1 + 0; "
12517 " assert(1 > 2, 'assert statement 2'); 2 + 0; "
12518 " assert(1 > 3, 'assert ' + 'statement 3'); 3 + 0; "
12519 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 4 + 0; "
12520 " assert(1 > 5, 'assert ' + 'statement 5'); 5 + 0 "
12521 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 6 + 0; "
12522 };
12523
12524 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12525
12526 for (std::size_t i = 0; i < expression_count; ++i)
12527 {
12528 expression_t expression;
12529 parser_t parser;
12530 assert_handler handler;
12531
12532 handler.assert_count = 0;
12533
12534 parser.register_assert_check(handler);
12535
12536 if (!parser.compile(expressions[i], expression))
12537 {
12538 printf("run_test22() - Error: %s\tExpression: %s [15]\n",
12539 parser.error().c_str(),
12540 expressions[i].c_str());
12541 result = false;
12542 continue;
12543 }
12544
12545 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12546
12547 typedef typename exprtk::expression_helper<T> et_t;
12548 type_sequence.push_back(et_t::e_assert );
12549 type_sequence.push_back(et_t::e_assert );
12550 type_sequence.push_back(et_t::e_assert );
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_literal);
12555
12556 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12557 {
12558 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [15]\n",
12559 expressions[i].c_str());
12560 result = false;
12561 continue;
12562 }
12563
12564 expression.value();
12565
12566 if (6 != handler.assert_count)
12567 {
12568 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [15]\n",
12569 static_cast<int>(handler.assert_count),
12570 expressions[i].c_str());
12571 result = false;
12572 continue;
12573 }
12574 }
12575 }
12576
12577 {
12578 const std::string expressions[] =
12579 {
12580 " assert(1 > 1); 'assert' + '01'; "
12581 " assert(1 > 2, 'assert statement 2'); 'assert' + '02'; "
12582 " assert(1 > 3, 'assert ' + 'statement 3'); 'assert' + '03'; "
12583 " assert(1 > 4, 'assert ' + 'statement 4', 'Assert04'); 'assert' + '04'; "
12584 " assert(1 > 5, 'assert ' + 'statement 5'); 'assert' + '05'; "
12585 " assert(1 > 6, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert' + '06'; "
12586 };
12587
12588 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12589
12590 for (std::size_t i = 0; i < expression_count; ++i)
12591 {
12592 expression_t expression;
12593 parser_t parser;
12594 assert_handler handler;
12595
12596 handler.assert_count = 0;
12597
12598 parser.register_assert_check(handler);
12599
12600 if (!parser.compile(expressions[i], expression))
12601 {
12602 printf("run_test22() - Error: %s\tExpression: %s [16]\n",
12603 parser.error().c_str(),
12604 expressions[i].c_str());
12605 result = false;
12606 continue;
12607 }
12608
12609 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12610
12611 typedef typename exprtk::expression_helper<T> et_t;
12612 type_sequence.push_back(et_t::e_assert);
12613 type_sequence.push_back(et_t::e_assert);
12614 type_sequence.push_back(et_t::e_assert);
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_string);
12619
12620 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12621 {
12622 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [16]\n",
12623 expressions[i].c_str());
12624 result = false;
12625 continue;
12626 }
12627
12628 expression.value();
12629
12630 if (6 != handler.assert_count)
12631 {
12632 printf("run_test22() - Error: Invalid assert count of %d expected 1. Expression: %s [16]\n",
12633 static_cast<int>(handler.assert_count),
12634 expressions[i].c_str());
12635 result = false;
12636 continue;
12637 }
12638 }
12639 }
12640
12641 {
12642 const std::string expressions[] =
12643 {
12644 " assert(x > y); x + y + 1; "
12645 " assert(x > y, 'assert statement 2'); x + y + 1; "
12646 " assert(x > y, 'assert ' + 'statement 3'); x + y + 1; "
12647 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); x + y + 1; "
12648 " assert(x > y, 'assert ' + 'statement 5'); x + y + 1; "
12649 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); x + y + 1; "
12650 };
12651
12652 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12653
12654 for (std::size_t i = 0; i < expression_count; ++i)
12655 {
12656 T x = T(1);
12657 T y = T(2);
12658
12659 symbol_table_t symbol_table;
12660 expression_t expression;
12661 parser_t parser;
12662 assert_handler handler;
12663
12664 handler.assert_count = 0;
12665
12666 symbol_table.add_variable("x", x);
12667 symbol_table.add_variable("y", y);
12668 expression.register_symbol_table(symbol_table);
12669
12670 parser.register_assert_check(handler);
12671
12672 if (!parser.compile(expressions[i], expression))
12673 {
12674 printf("run_test22() - Error: %s\tExpression: %s [17]\n",
12675 parser.error().c_str(),
12676 expressions[i].c_str());
12677 result = false;
12678 continue;
12679 }
12680
12681 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12682
12683 typedef typename exprtk::expression_helper<T> et_t;
12684 type_sequence.push_back(et_t::e_assert);
12685 type_sequence.push_back(et_t::e_assert);
12686 type_sequence.push_back(et_t::e_assert);
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_sf3ext);
12691
12692 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12693 {
12694 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [17]\n",
12695 expressions[i].c_str());
12696 result = false;
12697 continue;
12698 }
12699
12700 expression.value();
12701
12702 if (6 != handler.assert_count)
12703 {
12704 printf("run_test22() - Error: Invalid assert count of %d expected 6. Expression: %s [17]\n",
12705 static_cast<int>(handler.assert_count),
12706 expressions[i].c_str());
12707 result = false;
12708 continue;
12709 }
12710 }
12711 }
12712
12713 {
12714 const std::string expressions[] =
12715 {
12716 " assert(x > y); 'assert' + ((x < y) ? '01' : 'XYZ'); "
12717 " assert(x > y, 'assert statement 2'); 'assert' + ((x < y) ? '02' : 'XYZ'); "
12718 " assert(x > y, 'assert ' + 'statement 3'); 'assert' + ((x < y) ? '03' : 'XYZ'); "
12719 " assert(x > y, 'assert ' + 'statement 4', 'Assert04'); 'assert' + ((x < y) ? '04' : 'XYZ'); "
12720 " assert(x > y, 'assert ' + 'statement 5'); 'assert' + ((x < y) ? '05' : 'XYZ'); "
12721 " assert(x > y, 'assert ' + 'statement 6', 'Assert' + '06'); 'assert' + ((x < y) ? '06' : 'XYZ'); "
12722 };
12723
12724 const std::size_t expression_count = sizeof(expressions) / sizeof(std::string);
12725
12726 for (std::size_t i = 0; i < expression_count; ++i)
12727 {
12728 T x = T(1);
12729 T y = T(2);
12730
12731 symbol_table_t symbol_table;
12732 expression_t expression;
12733 parser_t parser;
12734 assert_handler handler;
12735
12736 handler.assert_count = 0;
12737
12738 symbol_table.add_variable("x", x);
12739 symbol_table.add_variable("y", y);
12740 expression.register_symbol_table(symbol_table);
12741
12742 parser.register_assert_check(handler);
12743
12744 if (!parser.compile(expressions[i], expression))
12745 {
12746 printf("run_test22() - Error: %s\tExpression: %s [18]\n",
12747 parser.error().c_str(),
12748 expressions[i].c_str());
12749 result = false;
12750 continue;
12751 }
12752
12753 std::vector<typename exprtk::expression_helper<T>::node_types> type_sequence;
12754
12755 typedef typename exprtk::expression_helper<T> et_t;
12756 type_sequence.push_back(et_t::e_assert);
12757 type_sequence.push_back(et_t::e_assert);
12758 type_sequence.push_back(et_t::e_assert);
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_string);
12763
12764 if (!exprtk::expression_helper<T>::match_type_sequence(expression,type_sequence))
12765 {
12766 printf("run_test22() - Error: Expression failed to match type sequence. Expression: %s [18]\n",
12767 expressions[i].c_str());
12768 result = false;
12769 continue;
12770 }
12771
12772 expression.value();
12773
12774 if (6 != handler.assert_count)
12775 {
12776 printf("run_test22() - Error: Invalid assert count of %d expected 6. Expression: %s [18]\n",
12777 static_cast<int>(handler.assert_count),
12778 expressions[i].c_str());
12779 result = false;
12780 continue;
12781 }
12782 }
12783 }
12784
12785 return result;
12786}
12787
12788template <typename T>
12789struct type_name { static inline std::string value() { return "real::type"; } };
12790
12791int main(int argc, char*argv[])
12792{
12793 const std::string test_set = (argc == 2) ? std::string(argv[1]) : "";
12794
12795 #define perform_test(Type,Number) \
12796 { \
12797 const std::string test_name = "run_test"#Number; \
12798 if ( \
12799 test_set.empty() || \
12800 test_set.find(test_name) != std::string::npos \
12801 ) \
12802 { \
12803 exprtk::timer timer; \
12804 timer.start(); \
12805 if (!run_test##Number<Type>()) \
12806 { \
12807 printf("run_test"#Number" (%s) *** FAILED! ***\n", \
12808 type_name<Type>::value().c_str()); \
12809 result = EXIT_FAILURE; \
12810 } \
12811 else \
12812 { \
12813 timer.stop(); \
12814 printf("run_test"#Number" (%s) - Result: SUCCESS Time: %8.4fsec\n", \
12815 type_name<Type>::value().c_str(), \
12816 timer.time()); \
12817 } \
12818 } \
12819 } \
12820
12821 int result = 0;
12822
12846
12847 #undef perform_test
12848
12849 return result;
12850}
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
std::pair< std::string, numeric_type > test_t
bool not_equal(const T &t0, const T &t1, const T &epsilon=T(0.000000000001))
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)
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)
bool not_equal(const T &t0, const T &t1, const T &epsilon=T(0.0000000001))
numeric_type foo5(numeric_type v0, numeric_type v1, numeric_type v2, numeric_type v3, numeric_type v4)
bool run_test00()
bool run_test13()
#define perform_test(Type, Number)
static const test_t global_test_list[]
bool run_test05()
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 not_equal_impl(const T &t1, const T &t2, const T &epsilon=0.0000000001)
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)
real::type numeric_type
bool run_test14()
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
type sin(const type v)
type cos(const type v)
type max(const type v0, const type v1)
type abs(const type v)
type sqrt(const type v)
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 &)