muParser API -  1.35
muParserCallback.cpp
Go to the documentation of this file.
1 /*
2 
3  _____ __ _____________ _______ ______ ___________
4  / \| | \____ \__ \\_ __ \/ ___// __ \_ __ \
5  | Y Y \ | / |_> > __ \| | \/\___ \\ ___/| | \/
6  |__|_| /____/| __(____ /__| /____ >\___ >__|
7  \/ |__| \/ \/ \/
8  Copyright (C) 2022 Ingo Berg
9 
10  Redistribution and use in source and binary forms, with or without modification, are permitted
11  provided that the following conditions are met:
12 
13  * Redistributions of source code must retain the above copyright notice, this list of
14  conditions and the following disclaimer.
15  * Redistributions in binary form must reproduce the above copyright notice, this list of
16  conditions and the following disclaimer in the documentation and/or other materials provided
17  with the distribution.
18 
19  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
20  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28 
29 #include "muParserCallback.h"
30 
31 #if defined(_MSC_VER)
32  #pragma warning(push)
33  #pragma warning(disable : 26812)
34 #endif
35 
36 /** \file
37  \brief Implementation of the parser callback class.
38 */
39 
40 
41 namespace mu
42 {
43  static constexpr int CALLBACK_INTERNAL_VAR_ARGS = 1 << 14;
44  static constexpr int CALLBACK_INTERNAL_FIXED_ARGS_MASK = 0xf;
45  static constexpr int CALLBACK_INTERNAL_WITH_USER_DATA = 1 << 13;
46 
48  {
49  void* pFun;
50  void* pUserData;
51  };
52 
53 
54  ParserCallback::ParserCallback(fun_type0 a_pFun, bool a_bAllowOpti)
55  :m_pFun((void*)a_pFun)
56  , m_iArgc(0)
57  , m_iPri(-1)
58  , m_eOprtAsct(oaNONE)
59  , m_iCode(cmFUNC)
60  , m_iType(tpDBL)
61  , m_bAllowOpti(a_bAllowOpti)
62  {}
63 
64 
65  ParserCallback::ParserCallback(fun_type1 a_pFun, bool a_bAllowOpti, int a_iPrec, ECmdCode a_iCode)
66  :m_pFun((void*)a_pFun)
67  , m_iArgc(1)
68  , m_iPri(a_iPrec)
69  , m_eOprtAsct(oaNONE)
70  , m_iCode(a_iCode)
71  , m_iType(tpDBL)
72  , m_bAllowOpti(a_bAllowOpti)
73  {}
74 
75 
76  ParserCallback::ParserCallback(fun_type1 a_pFun, bool a_bAllowOpti)
77  : ParserCallback(a_pFun, a_bAllowOpti, -1, cmFUNC)
78  {}
79 
80 
81  /** \brief Constructor for constructing function callbacks taking two arguments.
82  \throw nothrow
83  */
84  ParserCallback::ParserCallback(fun_type2 a_pFun, bool a_bAllowOpti)
85  :m_pFun((void*)a_pFun)
86  , m_iArgc(2)
87  , m_iPri(-1)
88  , m_eOprtAsct(oaNONE)
89  , m_iCode(cmFUNC)
90  , m_iType(tpDBL)
91  , m_bAllowOpti(a_bAllowOpti)
92  {}
93 
94 
95  /** \brief Constructor for constructing binary operator callbacks.
96  \param a_pFun Pointer to a static function taking two arguments
97  \param a_bAllowOpti A flag indicating this function can be optimized
98  \param a_iPrec The operator precedence
99  \param a_eOprtAsct The operators associativity
100  \throw nothrow
101  */
103  bool a_bAllowOpti,
104  int a_iPrec,
105  EOprtAssociativity a_eOprtAsct)
106  :m_pFun((void*)a_pFun)
107  , m_iArgc(2)
108  , m_iPri(a_iPrec)
109  , m_eOprtAsct(a_eOprtAsct)
110  , m_iCode(cmOPRT_BIN)
111  , m_iType(tpDBL)
112  , m_bAllowOpti(a_bAllowOpti)
113  {}
114 
115 
116  ParserCallback::ParserCallback(fun_type3 a_pFun, bool a_bAllowOpti)
117  :m_pFun((void*)a_pFun)
118  , m_iArgc(3)
119  , m_iPri(-1)
120  , m_eOprtAsct(oaNONE)
121  , m_iCode(cmFUNC)
122  , m_iType(tpDBL)
123  , m_bAllowOpti(a_bAllowOpti)
124  {}
125 
126 
127  ParserCallback::ParserCallback(fun_type4 a_pFun, bool a_bAllowOpti)
128  :m_pFun((void*)a_pFun)
129  , m_iArgc(4)
130  , m_iPri(-1)
131  , m_eOprtAsct(oaNONE)
132  , m_iCode(cmFUNC)
133  , m_iType(tpDBL)
134  , m_bAllowOpti(a_bAllowOpti)
135  {}
136 
137 
138  ParserCallback::ParserCallback(fun_type5 a_pFun, bool a_bAllowOpti)
139  :m_pFun((void*)a_pFun)
140  , m_iArgc(5)
141  , m_iPri(-1)
142  , m_eOprtAsct(oaNONE)
143  , m_iCode(cmFUNC)
144  , m_iType(tpDBL)
145  , m_bAllowOpti(a_bAllowOpti)
146  {}
147 
148 
149  ParserCallback::ParserCallback(fun_type6 a_pFun, bool a_bAllowOpti)
150  :m_pFun((void*)a_pFun)
151  , m_iArgc(6)
152  , m_iPri(-1)
153  , m_eOprtAsct(oaNONE)
154  , m_iCode(cmFUNC)
155  , m_iType(tpDBL)
156  , m_bAllowOpti(a_bAllowOpti)
157  {}
158 
159 
160  ParserCallback::ParserCallback(fun_type7 a_pFun, bool a_bAllowOpti)
161  :m_pFun((void*)a_pFun)
162  , m_iArgc(7)
163  , m_iPri(-1)
164  , m_eOprtAsct(oaNONE)
165  , m_iCode(cmFUNC)
166  , m_iType(tpDBL)
167  , m_bAllowOpti(a_bAllowOpti)
168  {}
169 
170 
171  ParserCallback::ParserCallback(fun_type8 a_pFun, bool a_bAllowOpti)
172  :m_pFun((void*)a_pFun)
173  , m_iArgc(8)
174  , m_iPri(-1)
175  , m_eOprtAsct(oaNONE)
176  , m_iCode(cmFUNC)
177  , m_iType(tpDBL)
178  , m_bAllowOpti(a_bAllowOpti)
179  {}
180 
181 
182  ParserCallback::ParserCallback(fun_type9 a_pFun, bool a_bAllowOpti)
183  :m_pFun((void*)a_pFun)
184  , m_iArgc(9)
185  , m_iPri(-1)
186  , m_eOprtAsct(oaNONE)
187  , m_iCode(cmFUNC)
188  , m_iType(tpDBL)
189  , m_bAllowOpti(a_bAllowOpti)
190  {}
191 
192 
193  ParserCallback::ParserCallback(fun_type10 a_pFun, bool a_bAllowOpti)
194  :m_pFun((void*)a_pFun)
195  , m_iArgc(10)
196  , m_iPri(-1)
197  , m_eOprtAsct(oaNONE)
198  , m_iCode(cmFUNC)
199  , m_iType(tpDBL)
200  , m_bAllowOpti(a_bAllowOpti)
201  {}
202 
203 
204  ParserCallback::ParserCallback(fun_userdata_type0 a_pFun, void* a_pUserData, bool a_bAllowOpti)
205  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
206  , m_iArgc(0 | CALLBACK_INTERNAL_WITH_USER_DATA)
207  , m_iPri(-1)
208  , m_eOprtAsct(oaNONE)
209  , m_iCode(cmFUNC)
210  , m_iType(tpDBL)
211  , m_bAllowOpti(a_bAllowOpti)
212  {}
213 
214 
215  ParserCallback::ParserCallback(fun_userdata_type1 a_pFun, void* a_pUserData, bool a_bAllowOpti)
216  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
217  , m_iArgc(1 | CALLBACK_INTERNAL_WITH_USER_DATA)
218  , m_iPri(-1)
219  , m_eOprtAsct(oaNONE)
220  , m_iCode(cmFUNC)
221  , m_iType(tpDBL)
222  , m_bAllowOpti(a_bAllowOpti)
223  {}
224 
225 
226  ParserCallback::ParserCallback(fun_userdata_type2 a_pFun, void* a_pUserData, bool a_bAllowOpti)
227  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
228  , m_iArgc(2 | CALLBACK_INTERNAL_WITH_USER_DATA)
229  , m_iPri(-1)
230  , m_eOprtAsct(oaNONE)
231  , m_iCode(cmFUNC)
232  , m_iType(tpDBL)
233  , m_bAllowOpti(a_bAllowOpti)
234  {}
235 
236 
237  ParserCallback::ParserCallback(fun_userdata_type3 a_pFun, void* a_pUserData, bool a_bAllowOpti)
238  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
239  , m_iArgc(3 | CALLBACK_INTERNAL_WITH_USER_DATA)
240  , m_iPri(-1)
241  , m_eOprtAsct(oaNONE)
242  , m_iCode(cmFUNC)
243  , m_iType(tpDBL)
244  , m_bAllowOpti(a_bAllowOpti)
245  {}
246 
247 
248  ParserCallback::ParserCallback(fun_userdata_type4 a_pFun, void* a_pUserData, bool a_bAllowOpti)
249  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
250  , m_iArgc(4 | CALLBACK_INTERNAL_WITH_USER_DATA)
251  , m_iPri(-1)
252  , m_eOprtAsct(oaNONE)
253  , m_iCode(cmFUNC)
254  , m_iType(tpDBL)
255  , m_bAllowOpti(a_bAllowOpti)
256  {}
257 
258 
259  ParserCallback::ParserCallback(fun_userdata_type5 a_pFun, void* a_pUserData, bool a_bAllowOpti)
260  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
261  , m_iArgc(5 | CALLBACK_INTERNAL_WITH_USER_DATA)
262  , m_iPri(-1)
263  , m_eOprtAsct(oaNONE)
264  , m_iCode(cmFUNC)
265  , m_iType(tpDBL)
266  , m_bAllowOpti(a_bAllowOpti)
267  {}
268 
269 
270  ParserCallback::ParserCallback(fun_userdata_type6 a_pFun, void* a_pUserData, bool a_bAllowOpti)
271  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
272  , m_iArgc(6 | CALLBACK_INTERNAL_WITH_USER_DATA)
273  , m_iPri(-1)
274  , m_eOprtAsct(oaNONE)
275  , m_iCode(cmFUNC)
276  , m_iType(tpDBL)
277  , m_bAllowOpti(a_bAllowOpti)
278  {}
279 
280 
281  ParserCallback::ParserCallback(fun_userdata_type7 a_pFun, void* a_pUserData, bool a_bAllowOpti)
282  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
283  , m_iArgc(7 | CALLBACK_INTERNAL_WITH_USER_DATA)
284  , m_iPri(-1)
285  , m_eOprtAsct(oaNONE)
286  , m_iCode(cmFUNC)
287  , m_iType(tpDBL)
288  , m_bAllowOpti(a_bAllowOpti)
289  {}
290 
291 
292  ParserCallback::ParserCallback(fun_userdata_type8 a_pFun, void* a_pUserData, bool a_bAllowOpti)
293  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
294  , m_iArgc(8 | CALLBACK_INTERNAL_WITH_USER_DATA)
295  , m_iPri(-1)
296  , m_eOprtAsct(oaNONE)
297  , m_iCode(cmFUNC)
298  , m_iType(tpDBL)
299  , m_bAllowOpti(a_bAllowOpti)
300  {}
301 
302 
303  ParserCallback::ParserCallback(fun_userdata_type9 a_pFun, void* a_pUserData, bool a_bAllowOpti)
304  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
305  , m_iArgc(9 | CALLBACK_INTERNAL_WITH_USER_DATA)
306  , m_iPri(-1)
307  , m_eOprtAsct(oaNONE)
308  , m_iCode(cmFUNC)
309  , m_iType(tpDBL)
310  , m_bAllowOpti(a_bAllowOpti)
311  {}
312 
313 
314  ParserCallback::ParserCallback(fun_userdata_type10 a_pFun, void* a_pUserData, bool a_bAllowOpti)
315  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
316  , m_iArgc(10 | CALLBACK_INTERNAL_WITH_USER_DATA)
317  , m_iPri(-1)
318  , m_eOprtAsct(oaNONE)
319  , m_iCode(cmFUNC)
320  , m_iType(tpDBL)
321  , m_bAllowOpti(a_bAllowOpti)
322  {}
323 
324 
325  ParserCallback::ParserCallback(bulkfun_type0 a_pFun, bool a_bAllowOpti)
326  :m_pFun((void*)a_pFun)
327  , m_iArgc(0)
328  , m_iPri(-1)
329  , m_eOprtAsct(oaNONE)
330  , m_iCode(cmFUNC_BULK)
331  , m_iType(tpDBL)
332  , m_bAllowOpti(a_bAllowOpti)
333  {}
334 
335 
336  ParserCallback::ParserCallback(bulkfun_type1 a_pFun, bool a_bAllowOpti)
337  :m_pFun((void*)a_pFun)
338  , m_iArgc(1)
339  , m_iPri(-1)
340  , m_eOprtAsct(oaNONE)
341  , m_iCode(cmFUNC_BULK)
342  , m_iType(tpDBL)
343  , m_bAllowOpti(a_bAllowOpti)
344  {}
345 
346 
347  /** \brief Constructor for constructing function callbacks taking two arguments.
348  \throw nothrow
349  */
351  :m_pFun((void*)a_pFun)
352  , m_iArgc(2)
353  , m_iPri(-1)
354  , m_eOprtAsct(oaNONE)
355  , m_iCode(cmFUNC_BULK)
356  , m_iType(tpDBL)
357  , m_bAllowOpti(a_bAllowOpti)
358  {}
359 
360 
361  ParserCallback::ParserCallback(bulkfun_type3 a_pFun, bool a_bAllowOpti)
362  :m_pFun((void*)a_pFun)
363  , m_iArgc(3)
364  , m_iPri(-1)
365  , m_eOprtAsct(oaNONE)
366  , m_iCode(cmFUNC_BULK)
367  , m_iType(tpDBL)
368  , m_bAllowOpti(a_bAllowOpti)
369  {}
370 
371 
372  ParserCallback::ParserCallback(bulkfun_type4 a_pFun, bool a_bAllowOpti)
373  :m_pFun((void*)a_pFun)
374  , m_iArgc(4)
375  , m_iPri(-1)
376  , m_eOprtAsct(oaNONE)
377  , m_iCode(cmFUNC_BULK)
378  , m_iType(tpDBL)
379  , m_bAllowOpti(a_bAllowOpti)
380  {}
381 
382 
383  ParserCallback::ParserCallback(bulkfun_type5 a_pFun, bool a_bAllowOpti)
384  :m_pFun((void*)a_pFun)
385  , m_iArgc(5)
386  , m_iPri(-1)
387  , m_eOprtAsct(oaNONE)
388  , m_iCode(cmFUNC_BULK)
389  , m_iType(tpDBL)
390  , m_bAllowOpti(a_bAllowOpti)
391  {}
392 
393 
394  ParserCallback::ParserCallback(bulkfun_type6 a_pFun, bool a_bAllowOpti)
395  :m_pFun((void*)a_pFun)
396  , m_iArgc(6)
397  , m_iPri(-1)
398  , m_eOprtAsct(oaNONE)
399  , m_iCode(cmFUNC_BULK)
400  , m_iType(tpDBL)
401  , m_bAllowOpti(a_bAllowOpti)
402  {}
403 
404 
405  ParserCallback::ParserCallback(bulkfun_type7 a_pFun, bool a_bAllowOpti)
406  :m_pFun((void*)a_pFun)
407  , m_iArgc(7)
408  , m_iPri(-1)
409  , m_eOprtAsct(oaNONE)
410  , m_iCode(cmFUNC_BULK)
411  , m_iType(tpDBL)
412  , m_bAllowOpti(a_bAllowOpti)
413  {}
414 
415 
416  ParserCallback::ParserCallback(bulkfun_type8 a_pFun, bool a_bAllowOpti)
417  :m_pFun((void*)a_pFun)
418  , m_iArgc(8)
419  , m_iPri(-1)
420  , m_eOprtAsct(oaNONE)
421  , m_iCode(cmFUNC_BULK)
422  , m_iType(tpDBL)
423  , m_bAllowOpti(a_bAllowOpti)
424  {}
425 
426 
427  ParserCallback::ParserCallback(bulkfun_type9 a_pFun, bool a_bAllowOpti)
428  :m_pFun((void*)a_pFun)
429  , m_iArgc(9)
430  , m_iPri(-1)
431  , m_eOprtAsct(oaNONE)
432  , m_iCode(cmFUNC_BULK)
433  , m_iType(tpDBL)
434  , m_bAllowOpti(a_bAllowOpti)
435  {}
436 
437 
438  ParserCallback::ParserCallback(bulkfun_type10 a_pFun, bool a_bAllowOpti)
439  :m_pFun((void*)a_pFun)
440  , m_iArgc(10)
441  , m_iPri(-1)
442  , m_eOprtAsct(oaNONE)
443  , m_iCode(cmFUNC_BULK)
444  , m_iType(tpDBL)
445  , m_bAllowOpti(a_bAllowOpti)
446  {}
447 
448 
449  ParserCallback::ParserCallback(bulkfun_userdata_type0 a_pFun, void* a_pUserData, bool a_bAllowOpti)
450  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
451  , m_iArgc(0 | CALLBACK_INTERNAL_WITH_USER_DATA)
452  , m_iPri(-1)
453  , m_eOprtAsct(oaNONE)
454  , m_iCode(cmFUNC_BULK)
455  , m_iType(tpDBL)
456  , m_bAllowOpti(a_bAllowOpti)
457  {}
458 
459 
460  ParserCallback::ParserCallback(bulkfun_userdata_type1 a_pFun, void* a_pUserData, bool a_bAllowOpti)
461  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
462  , m_iArgc(1 | CALLBACK_INTERNAL_WITH_USER_DATA)
463  , m_iPri(-1)
464  , m_eOprtAsct(oaNONE)
465  , m_iCode(cmFUNC_BULK)
466  , m_iType(tpDBL)
467  , m_bAllowOpti(a_bAllowOpti)
468  {}
469 
470 
471  ParserCallback::ParserCallback(bulkfun_userdata_type2 a_pFun, void* a_pUserData, bool a_bAllowOpti)
472  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
473  , m_iArgc(2 | CALLBACK_INTERNAL_WITH_USER_DATA)
474  , m_iPri(-1)
475  , m_eOprtAsct(oaNONE)
476  , m_iCode(cmFUNC_BULK)
477  , m_iType(tpDBL)
478  , m_bAllowOpti(a_bAllowOpti)
479  {}
480 
481 
482  ParserCallback::ParserCallback(bulkfun_userdata_type3 a_pFun, void* a_pUserData, bool a_bAllowOpti)
483  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
484  , m_iArgc(3 | CALLBACK_INTERNAL_WITH_USER_DATA)
485  , m_iPri(-1)
486  , m_eOprtAsct(oaNONE)
487  , m_iCode(cmFUNC_BULK)
488  , m_iType(tpDBL)
489  , m_bAllowOpti(a_bAllowOpti)
490  {}
491 
492 
493  ParserCallback::ParserCallback(bulkfun_userdata_type4 a_pFun, void* a_pUserData, bool a_bAllowOpti)
494  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
495  , m_iArgc(4 | CALLBACK_INTERNAL_WITH_USER_DATA)
496  , m_iPri(-1)
497  , m_eOprtAsct(oaNONE)
498  , m_iCode(cmFUNC_BULK)
499  , m_iType(tpDBL)
500  , m_bAllowOpti(a_bAllowOpti)
501  {}
502 
503 
504  ParserCallback::ParserCallback(bulkfun_userdata_type5 a_pFun, void* a_pUserData, bool a_bAllowOpti)
505  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
506  , m_iArgc(5 | CALLBACK_INTERNAL_WITH_USER_DATA)
507  , m_iPri(-1)
508  , m_eOprtAsct(oaNONE)
509  , m_iCode(cmFUNC_BULK)
510  , m_iType(tpDBL)
511  , m_bAllowOpti(a_bAllowOpti)
512  {}
513 
514 
515  ParserCallback::ParserCallback(bulkfun_userdata_type6 a_pFun, void* a_pUserData, bool a_bAllowOpti)
516  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
517  , m_iArgc(6 | CALLBACK_INTERNAL_WITH_USER_DATA)
518  , m_iPri(-1)
519  , m_eOprtAsct(oaNONE)
520  , m_iCode(cmFUNC_BULK)
521  , m_iType(tpDBL)
522  , m_bAllowOpti(a_bAllowOpti)
523  {}
524 
525 
526  ParserCallback::ParserCallback(bulkfun_userdata_type7 a_pFun, void* a_pUserData, bool a_bAllowOpti)
527  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
528  , m_iArgc(7 | CALLBACK_INTERNAL_WITH_USER_DATA)
529  , m_iPri(-1)
530  , m_eOprtAsct(oaNONE)
531  , m_iCode(cmFUNC_BULK)
532  , m_iType(tpDBL)
533  , m_bAllowOpti(a_bAllowOpti)
534  {}
535 
536 
537  ParserCallback::ParserCallback(bulkfun_userdata_type8 a_pFun, void* a_pUserData, bool a_bAllowOpti)
538  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
539  , m_iArgc(8 | CALLBACK_INTERNAL_WITH_USER_DATA)
540  , m_iPri(-1)
541  , m_eOprtAsct(oaNONE)
542  , m_iCode(cmFUNC_BULK)
543  , m_iType(tpDBL)
544  , m_bAllowOpti(a_bAllowOpti)
545  {}
546 
547 
548  ParserCallback::ParserCallback(bulkfun_userdata_type9 a_pFun, void* a_pUserData, bool a_bAllowOpti)
549  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
550  , m_iArgc(9 | CALLBACK_INTERNAL_WITH_USER_DATA)
551  , m_iPri(-1)
552  , m_eOprtAsct(oaNONE)
553  , m_iCode(cmFUNC_BULK)
554  , m_iType(tpDBL)
555  , m_bAllowOpti(a_bAllowOpti)
556  {}
557 
558 
559  ParserCallback::ParserCallback(bulkfun_userdata_type10 a_pFun, void* a_pUserData, bool a_bAllowOpti)
560  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
561  , m_iArgc(10 | CALLBACK_INTERNAL_WITH_USER_DATA)
562  , m_iPri(-1)
563  , m_eOprtAsct(oaNONE)
564  , m_iCode(cmFUNC_BULK)
565  , m_iType(tpDBL)
566  , m_bAllowOpti(a_bAllowOpti)
567  {}
568 
569 
570  ParserCallback::ParserCallback(multfun_type a_pFun, bool a_bAllowOpti)
571  :m_pFun((void*)a_pFun)
572  , m_iArgc(CALLBACK_INTERNAL_VAR_ARGS)
573  , m_iPri(-1)
574  , m_eOprtAsct(oaNONE)
575  , m_iCode(cmFUNC)
576  , m_iType(tpDBL)
577  , m_bAllowOpti(a_bAllowOpti)
578  {}
579 
580 
581  ParserCallback::ParserCallback(multfun_userdata_type a_pFun, void* a_pUserData, bool a_bAllowOpti)
582  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
583  , m_iArgc(CALLBACK_INTERNAL_VAR_ARGS | CALLBACK_INTERNAL_WITH_USER_DATA)
584  , m_iPri(-1)
585  , m_eOprtAsct(oaNONE)
586  , m_iCode(cmFUNC)
587  , m_iType(tpDBL)
588  , m_bAllowOpti(a_bAllowOpti)
589  {}
590 
591 
592  ParserCallback::ParserCallback(strfun_type1 a_pFun, bool a_bAllowOpti)
593  :m_pFun((void*)a_pFun)
594  , m_iArgc(0)
595  , m_iPri(-1)
596  , m_eOprtAsct(oaNONE)
597  , m_iCode(cmFUNC_STR)
598  , m_iType(tpSTR)
599  , m_bAllowOpti(a_bAllowOpti)
600  {}
601 
602 
603  ParserCallback::ParserCallback(strfun_type2 a_pFun, bool a_bAllowOpti)
604  :m_pFun((void*)a_pFun)
605  , m_iArgc(1)
606  , m_iPri(-1)
607  , m_eOprtAsct(oaNONE)
608  , m_iCode(cmFUNC_STR)
609  , m_iType(tpSTR)
610  , m_bAllowOpti(a_bAllowOpti)
611  {}
612 
613 
614  ParserCallback::ParserCallback(strfun_type3 a_pFun, bool a_bAllowOpti)
615  :m_pFun((void*)a_pFun)
616  , m_iArgc(2)
617  , m_iPri(-1)
618  , m_eOprtAsct(oaNONE)
619  , m_iCode(cmFUNC_STR)
620  , m_iType(tpSTR)
621  , m_bAllowOpti(a_bAllowOpti)
622  {}
623 
624 
625  ParserCallback::ParserCallback(strfun_type4 a_pFun, bool a_bAllowOpti)
626  :m_pFun((void*)a_pFun)
627  , m_iArgc(3)
628  , m_iPri(-1)
629  , m_eOprtAsct(oaNONE)
630  , m_iCode(cmFUNC_STR)
631  , m_iType(tpSTR)
632  , m_bAllowOpti(a_bAllowOpti)
633  {}
634 
635 
636  ParserCallback::ParserCallback(strfun_type5 a_pFun, bool a_bAllowOpti)
637  :m_pFun((void*)a_pFun)
638  , m_iArgc(4)
639  , m_iPri(-1)
640  , m_eOprtAsct(oaNONE)
641  , m_iCode(cmFUNC_STR)
642  , m_iType(tpSTR)
643  , m_bAllowOpti(a_bAllowOpti)
644  {}
645 
646  ParserCallback::ParserCallback(strfun_type6 a_pFun, bool a_bAllowOpti)
647  :m_pFun((void*)a_pFun)
648  , m_iArgc(5)
649  , m_iPri(-1)
650  , m_eOprtAsct(oaNONE)
651  , m_iCode(cmFUNC_STR)
652  , m_iType(tpSTR)
653  , m_bAllowOpti(a_bAllowOpti)
654  {}
655 
656 
657  ParserCallback::ParserCallback(strfun_userdata_type1 a_pFun, void* a_pUserData, bool a_bAllowOpti)
658  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
659  , m_iArgc(0 | CALLBACK_INTERNAL_WITH_USER_DATA)
660  , m_iPri(-1)
661  , m_eOprtAsct(oaNONE)
662  , m_iCode(cmFUNC_STR)
663  , m_iType(tpSTR)
664  , m_bAllowOpti(a_bAllowOpti)
665  {}
666 
667 
668  ParserCallback::ParserCallback(strfun_userdata_type2 a_pFun, void* a_pUserData, bool a_bAllowOpti)
669  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
670  , m_iArgc(1 | CALLBACK_INTERNAL_WITH_USER_DATA)
671  , m_iPri(-1)
672  , m_eOprtAsct(oaNONE)
673  , m_iCode(cmFUNC_STR)
674  , m_iType(tpSTR)
675  , m_bAllowOpti(a_bAllowOpti)
676  {}
677 
678 
679  ParserCallback::ParserCallback(strfun_userdata_type3 a_pFun, void* a_pUserData, bool a_bAllowOpti)
680  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
681  , m_iArgc(2 | CALLBACK_INTERNAL_WITH_USER_DATA)
682  , m_iPri(-1)
683  , m_eOprtAsct(oaNONE)
684  , m_iCode(cmFUNC_STR)
685  , m_iType(tpSTR)
686  , m_bAllowOpti(a_bAllowOpti)
687  {}
688 
689 
690  ParserCallback::ParserCallback(strfun_userdata_type4 a_pFun, void* a_pUserData, bool a_bAllowOpti)
691  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
692  , m_iArgc(3 | CALLBACK_INTERNAL_WITH_USER_DATA)
693  , m_iPri(-1)
694  , m_eOprtAsct(oaNONE)
695  , m_iCode(cmFUNC_STR)
696  , m_iType(tpSTR)
697  , m_bAllowOpti(a_bAllowOpti)
698  {}
699 
700 
701  ParserCallback::ParserCallback(strfun_userdata_type5 a_pFun, void* a_pUserData, bool a_bAllowOpti)
702  :m_pFun(new CbWithUserData{reinterpret_cast<void*>(a_pFun), a_pUserData})
703  , m_iArgc(4 | CALLBACK_INTERNAL_WITH_USER_DATA)
704  , m_iPri(-1)
705  , m_eOprtAsct(oaNONE)
706  , m_iCode(cmFUNC_STR)
707  , m_iType(tpSTR)
708  , m_bAllowOpti(a_bAllowOpti)
709  {}
710 
711 
712  ParserCallback::ParserCallback(strfun_userdata_type6 a_pFun, void* a_pUserData, bool a_bAllowOpti)
713  :m_pFun(new CbWithUserData{ reinterpret_cast<void*>(a_pFun), a_pUserData })
714  , m_iArgc(5 | CALLBACK_INTERNAL_WITH_USER_DATA)
715  , m_iPri(-1)
716  , m_eOprtAsct(oaNONE)
717  , m_iCode(cmFUNC_STR)
718  , m_iType(tpSTR)
719  , m_bAllowOpti(a_bAllowOpti)
720  {}
721 
722  /** \brief Default constructor.
723  \throw nothrow
724  */
726  :m_pFun(0)
727  , m_iArgc(0)
728  , m_iPri(-1)
729  , m_eOprtAsct(oaNONE)
730  , m_iCode(cmUNKNOWN)
731  , m_iType(tpVOID)
732  , m_bAllowOpti(0)
733  {}
734 
735 
736  /** \brief Copy constructor.
737  \throw nothrow
738  */
740  :ParserCallback()
741  {
742  Assign(ref);
743  }
744 
745  ParserCallback & ParserCallback::operator=(const ParserCallback & ref)
746  {
747  Assign(ref);
748  return *this;
749  }
750 
751 
752  ParserCallback::~ParserCallback()
753  {
754  if (m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA)
755  delete reinterpret_cast<CbWithUserData*>(m_pFun);
756  }
757 
758 
759  /** \brief Copy callback from argument.
760 
761  \throw nothrow
762  */
763  void ParserCallback::Assign(const ParserCallback& ref)
764  {
765  if (this == &ref)
766  return;
767 
768  if (m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA) {
769  delete reinterpret_cast<CbWithUserData*>(m_pFun);
770  m_pFun = nullptr;
771  }
772 
773  if (ref.m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA)
774  m_pFun = new CbWithUserData(*reinterpret_cast<CbWithUserData*>(ref.m_pFun));
775  else
776  m_pFun = ref.m_pFun;
777  m_iArgc = ref.m_iArgc;
778  m_bAllowOpti = ref.m_bAllowOpti;
779  m_iCode = ref.m_iCode;
780  m_iType = ref.m_iType;
781  m_iPri = ref.m_iPri;
782  m_eOprtAsct = ref.m_eOprtAsct;
783  }
784 
785 
786  /** \brief Clone this instance and return a pointer to the new instance. */
788  {
789  return new ParserCallback(*this);
790  }
791 
792 
793  /** \brief Return tru if the function is conservative.
794 
795  Conservative functions return always the same result for the same argument.
796  \throw nothrow
797  */
799  {
800  return m_bAllowOpti;
801  }
802 
803 
804  /** \brief Get the callback address for the parser function.
805 
806  The type of the address is void. It needs to be recasted according to the
807  argument number to the right type.
808 
809  \throw nothrow
810  */
812  {
813  if (m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA)
814  return reinterpret_cast<CbWithUserData*>(m_pFun)->pFun;
815  else
816  return m_pFun;
817  }
818 
819 
820  /** \brief Get the user data if present, else nullptr
821 
822  \throw nothrow
823  */
825  {
826  if (m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA)
827  return reinterpret_cast<CbWithUserData*>(m_pFun)->pUserData;
828  else
829  return nullptr;
830  }
831 
832 
833  /** \brief Check that the callback looks valid
834  \throw nothrow
835 
836  Check that the function pointer is not null,
837  and if there are user data that they are not null.
838  */
840  {
841  return GetAddr() != nullptr
842  && !((m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA)
843  && GetUserData() == nullptr);
844  }
845 
846 
847  /** \brief Return the callback code. */
849  {
850  return m_iCode;
851  }
852 
853 
854  ETypeCode ParserCallback::GetType() const
855  {
856  return m_iType;
857  }
858 
859 
860  /** \brief Return the operator precedence.
861  \throw nothrown
862 
863  Only valid if the callback token is an operator token (binary or infix).
864  */
866  {
867  return m_iPri;
868  }
869 
870 
871  /** \brief Return the operators associativity.
872  \throw nothrown
873 
874  Only valid if the callback token is a binary operator token.
875  */
877  {
878  return m_eOprtAsct;
879  }
880 
881 
882  /** \brief Returns the number of numeric function Arguments.
883 
884  This number is negative for functions with variable number of arguments.
885  */
887  {
888  return (m_iArgc & CALLBACK_INTERNAL_VAR_ARGS) ? -1 : (m_iArgc & CALLBACK_INTERNAL_FIXED_ARGS_MASK);
889  }
890 } // namespace mu
891 
892 #if defined(_MSC_VER)
893  #pragma warning(pop)
894 #endif
ParserCallback()
Default constructor.
value_type(* multfun_userdata_type)(void *, const value_type *, int)
Callback type with user data (not null) used for functions and a variable argument list...
Definition: muParserDef.h:465
value_type(* strfun_type1)(const char_type *)
Callback type used for functions taking a string as an argument.
Definition: muParserDef.h:468
user defined binary operator
Definition: muParserDef.h:174
value_type(* bulkfun_type1)(int, int, value_type)
Callback type used for functions with a single arguments.
Definition: muParserDef.h:399
value_type(* strfun_type6)(const char_type *, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions taking a string and five values as arguments.
Definition: muParserDef.h:483
value_type(* bulkfun_userdata_type10)(void *, int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with ten arguments.
Definition: muParserDef.h:459
value_type(* fun_userdata_type8)(void *, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with eight arguments.
Definition: muParserDef.h:387
bool IsValid() const
Check that the callback looks valid.
value_type(* bulkfun_userdata_type0)(void *, int, int)
Callback type with user data (not null) used for functions without arguments.
Definition: muParserDef.h:429
value_type(* bulkfun_type8)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with eight arguments.
Definition: muParserDef.h:420
value_type(* fun_type5)(value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with five arguments.
Definition: muParserDef.h:345
value_type(* fun_userdata_type7)(void *, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with seven arguments.
Definition: muParserDef.h:384
value_type(* bulkfun_type2)(int, int, value_type, value_type)
Callback type used for functions with two arguments.
Definition: muParserDef.h:402
value_type(* fun_type1)(value_type)
Callback type used for functions with a single arguments.
Definition: muParserDef.h:333
value_type(* bulkfun_userdata_type9)(void *, int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with nine arguments.
Definition: muParserDef.h:456
value_type(* strfun_type4)(const char_type *, value_type, value_type, value_type)
Callback type used for functions taking a string and three values as arguments.
Definition: muParserDef.h:477
value_type(* fun_userdata_type0)(void *)
Callback type with user data (not null) used for functions without arguments.
Definition: muParserDef.h:363
value_type(* strfun_userdata_type4)(void *, const char_type *, value_type, value_type, value_type)
Callback type with user data (not null) used for functions taking a string and a value as arguments...
Definition: muParserDef.h:495
value_type(* bulkfun_type9)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with nine arguments.
Definition: muParserDef.h:423
value_type(* strfun_type3)(const char_type *, value_type, value_type)
Callback type used for functions taking a string and two values as arguments.
Definition: muParserDef.h:474
value_type(* bulkfun_userdata_type3)(void *, int, int, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with three arguments.
Definition: muParserDef.h:438
value_type(* fun_userdata_type6)(void *, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with six arguments.
Definition: muParserDef.h:381
ECmdCode GetCode() const
Return the callback code.
value_type(* strfun_userdata_type2)(void *, const char_type *, value_type)
Callback type with user data (not null) used for functions taking a string and a value as arguments...
Definition: muParserDef.h:489
bool IsOptimizable() const
Return tru if the function is conservative.
value_type(* multfun_type)(const value_type *, int)
Callback type used for functions with a variable argument list.
Definition: muParserDef.h:462
value_type(* fun_userdata_type9)(void *, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with nine arguments.
Definition: muParserDef.h:390
value_type(* bulkfun_userdata_type5)(void *, int, int, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with five arguments.
Definition: muParserDef.h:444
Code for a generic function item.
Definition: muParserDef.h:170
EOprtAssociativity
Parser operator precedence values.
Definition: muParserDef.h:199
value_type(* fun_type8)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with eight arguments.
Definition: muParserDef.h:354
value_type(* bulkfun_type5)(int, int, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with five arguments.
Definition: muParserDef.h:411
value_type(* bulkfun_type6)(int, int, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with six arguments.
Definition: muParserDef.h:414
value_type(* strfun_type5)(const char_type *, value_type, value_type, value_type, value_type)
Callback type used for functions taking a string and four values as arguments.
Definition: muParserDef.h:480
ParserCallback * Clone() const
Clone this instance and return a pointer to the new instance.
EOprtAssociativity GetAssociativity() const
Return the operators associativity.
value_type(* fun_type10)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with ten arguments.
Definition: muParserDef.h:360
value_type(* fun_type9)(value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with nine arguments.
Definition: muParserDef.h:357
ETypeCode
Types internally used by the parser.
Definition: muParserDef.h:183
value_type(* bulkfun_userdata_type1)(void *, int, int, value_type)
Callback type with user data (not null) used for functions with a single arguments.
Definition: muParserDef.h:432
value_type(* fun_userdata_type5)(void *, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with five arguments.
Definition: muParserDef.h:378
value_type(* fun_type2)(value_type, value_type)
Callback type used for functions with two arguments.
Definition: muParserDef.h:336
ECmdCode
Bytecode values.
Definition: muParserDef.h:135
value_type(* fun_userdata_type3)(void *, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with three arguments.
Definition: muParserDef.h:372
value_type(* fun_userdata_type1)(void *, value_type)
Callback type with user data (not null) used for functions with a single arguments.
Definition: muParserDef.h:366
String type (Function arguments and constants only, no string variables)
Definition: muParserDef.h:185
value_type(* strfun_type2)(const char_type *, value_type)
Callback type used for functions taking a string and a value as arguments.
Definition: muParserDef.h:471
value_type(* bulkfun_userdata_type6)(void *, int, int, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with six arguments.
Definition: muParserDef.h:447
Namespace for mathematical applications.
Definition: muParser.cpp:48
value_type(* fun_type3)(value_type, value_type, value_type)
Callback type used for functions with three arguments.
Definition: muParserDef.h:339
value_type(* fun_type0)()
Callback type used for functions without arguments.
Definition: muParserDef.h:330
Undefined type.
Definition: muParserDef.h:187
Special callbacks for Bulk mode with an additional parameter for the bulk index.
Definition: muParserDef.h:172
Definition of the parser callback class.
value_type(* bulkfun_userdata_type8)(void *, int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with eight arguments.
Definition: muParserDef.h:453
Code for a function with a string parameter.
Definition: muParserDef.h:171
void * GetAddr() const
Get the callback address for the parser function.
value_type(* bulkfun_type7)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with seven arguments.
Definition: muParserDef.h:417
value_type(* fun_userdata_type4)(void *, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with four arguments.
Definition: muParserDef.h:375
value_type(* bulkfun_userdata_type2)(void *, int, int, value_type, value_type)
Callback type with user data (not null) used for functions with two arguments.
Definition: muParserDef.h:435
value_type(* strfun_userdata_type3)(void *, const char_type *, value_type, value_type)
Callback type with user data (not null) used for functions taking a string and two values as argument...
Definition: muParserDef.h:492
uninitialized item
Definition: muParserDef.h:178
value_type(* fun_type4)(value_type, value_type, value_type, value_type)
Callback type used for functions with four arguments.
Definition: muParserDef.h:342
value_type(* strfun_userdata_type1)(void *, const char_type *)
Callback type with user data (not null) used for functions taking a string as an argument.
Definition: muParserDef.h:486
value_type(* fun_type7)(value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with seven arguments.
Definition: muParserDef.h:351
int GetArgc() const
Returns the number of numeric function Arguments.
value_type(* bulkfun_type4)(int, int, value_type, value_type, value_type, value_type)
Callback type used for functions with four arguments.
Definition: muParserDef.h:408
value_type(* bulkfun_userdata_type4)(void *, int, int, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with four arguments.
Definition: muParserDef.h:441
value_type(* strfun_userdata_type5)(void *, const char_type *, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions taking a string and two values as argument...
Definition: muParserDef.h:498
value_type(* fun_userdata_type2)(void *, value_type, value_type)
Callback type with user data (not null) used for functions with two arguments.
Definition: muParserDef.h:369
value_type(* fun_userdata_type10)(void *, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with ten arguments.
Definition: muParserDef.h:393
value_type(* bulkfun_type0)(int, int)
Callback type used for functions without arguments.
Definition: muParserDef.h:396
void * GetUserData() const
Get the user data if present, else nullptr.
Floating point variables.
Definition: muParserDef.h:186
value_type(* bulkfun_type3)(int, int, value_type, value_type, value_type)
Callback type used for functions with three arguments.
Definition: muParserDef.h:405
value_type(* bulkfun_userdata_type7)(void *, int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions with seven arguments.
Definition: muParserDef.h:450
Encapsulation of prototypes for a numerical parser function.
int GetPri() const
Return the operator precedence.
value_type(* fun_type6)(value_type, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with six arguments.
Definition: muParserDef.h:348
value_type(* strfun_userdata_type6)(void *, const char_type *, value_type, value_type, value_type, value_type, value_type)
Callback type with user data (not null) used for functions taking a string and five values as argumen...
Definition: muParserDef.h:501
value_type(* bulkfun_type10)(int, int, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with ten arguments.
Definition: muParserDef.h:426