33 #pragma warning(disable : 26812)
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;
55 :m_pFun((void*)a_pFun)
61 , m_bAllowOpti(a_bAllowOpti)
66 :m_pFun((void*)a_pFun)
72 , m_bAllowOpti(a_bAllowOpti)
77 : ParserCallback(a_pFun, a_bAllowOpti, -1,
cmFUNC)
85 :m_pFun((void*)a_pFun)
91 , m_bAllowOpti(a_bAllowOpti)
106 :m_pFun((void*)a_pFun)
109 , m_eOprtAsct(a_eOprtAsct)
112 , m_bAllowOpti(a_bAllowOpti)
117 :m_pFun((void*)a_pFun)
120 , m_eOprtAsct(oaNONE)
123 , m_bAllowOpti(a_bAllowOpti)
128 :m_pFun((void*)a_pFun)
131 , m_eOprtAsct(oaNONE)
134 , m_bAllowOpti(a_bAllowOpti)
139 :m_pFun((void*)a_pFun)
142 , m_eOprtAsct(oaNONE)
145 , m_bAllowOpti(a_bAllowOpti)
150 :m_pFun((void*)a_pFun)
153 , m_eOprtAsct(oaNONE)
156 , m_bAllowOpti(a_bAllowOpti)
161 :m_pFun((void*)a_pFun)
164 , m_eOprtAsct(oaNONE)
167 , m_bAllowOpti(a_bAllowOpti)
172 :m_pFun((void*)a_pFun)
175 , m_eOprtAsct(oaNONE)
178 , m_bAllowOpti(a_bAllowOpti)
183 :m_pFun((void*)a_pFun)
186 , m_eOprtAsct(oaNONE)
189 , m_bAllowOpti(a_bAllowOpti)
194 :m_pFun((void*)a_pFun)
197 , m_eOprtAsct(oaNONE)
200 , m_bAllowOpti(a_bAllowOpti)
205 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
206 , m_iArgc(0 | CALLBACK_INTERNAL_WITH_USER_DATA)
208 , m_eOprtAsct(oaNONE)
211 , m_bAllowOpti(a_bAllowOpti)
216 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
217 , m_iArgc(1 | CALLBACK_INTERNAL_WITH_USER_DATA)
219 , m_eOprtAsct(oaNONE)
222 , m_bAllowOpti(a_bAllowOpti)
227 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
228 , m_iArgc(2 | CALLBACK_INTERNAL_WITH_USER_DATA)
230 , m_eOprtAsct(oaNONE)
233 , m_bAllowOpti(a_bAllowOpti)
238 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
239 , m_iArgc(3 | CALLBACK_INTERNAL_WITH_USER_DATA)
241 , m_eOprtAsct(oaNONE)
244 , m_bAllowOpti(a_bAllowOpti)
249 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
250 , m_iArgc(4 | CALLBACK_INTERNAL_WITH_USER_DATA)
252 , m_eOprtAsct(oaNONE)
255 , m_bAllowOpti(a_bAllowOpti)
260 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
261 , m_iArgc(5 | CALLBACK_INTERNAL_WITH_USER_DATA)
263 , m_eOprtAsct(oaNONE)
266 , m_bAllowOpti(a_bAllowOpti)
271 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
272 , m_iArgc(6 | CALLBACK_INTERNAL_WITH_USER_DATA)
274 , m_eOprtAsct(oaNONE)
277 , m_bAllowOpti(a_bAllowOpti)
282 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
283 , m_iArgc(7 | CALLBACK_INTERNAL_WITH_USER_DATA)
285 , m_eOprtAsct(oaNONE)
288 , m_bAllowOpti(a_bAllowOpti)
293 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
294 , m_iArgc(8 | CALLBACK_INTERNAL_WITH_USER_DATA)
296 , m_eOprtAsct(oaNONE)
299 , m_bAllowOpti(a_bAllowOpti)
304 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
305 , m_iArgc(9 | CALLBACK_INTERNAL_WITH_USER_DATA)
307 , m_eOprtAsct(oaNONE)
310 , m_bAllowOpti(a_bAllowOpti)
315 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
316 , m_iArgc(10 | CALLBACK_INTERNAL_WITH_USER_DATA)
318 , m_eOprtAsct(oaNONE)
321 , m_bAllowOpti(a_bAllowOpti)
326 :m_pFun((void*)a_pFun)
329 , m_eOprtAsct(oaNONE)
332 , m_bAllowOpti(a_bAllowOpti)
337 :m_pFun((void*)a_pFun)
340 , m_eOprtAsct(oaNONE)
343 , m_bAllowOpti(a_bAllowOpti)
351 :m_pFun((void*)a_pFun)
354 , m_eOprtAsct(oaNONE)
357 , m_bAllowOpti(a_bAllowOpti)
362 :m_pFun((void*)a_pFun)
365 , m_eOprtAsct(oaNONE)
368 , m_bAllowOpti(a_bAllowOpti)
373 :m_pFun((void*)a_pFun)
376 , m_eOprtAsct(oaNONE)
379 , m_bAllowOpti(a_bAllowOpti)
384 :m_pFun((void*)a_pFun)
387 , m_eOprtAsct(oaNONE)
390 , m_bAllowOpti(a_bAllowOpti)
395 :m_pFun((void*)a_pFun)
398 , m_eOprtAsct(oaNONE)
401 , m_bAllowOpti(a_bAllowOpti)
406 :m_pFun((void*)a_pFun)
409 , m_eOprtAsct(oaNONE)
412 , m_bAllowOpti(a_bAllowOpti)
417 :m_pFun((void*)a_pFun)
420 , m_eOprtAsct(oaNONE)
423 , m_bAllowOpti(a_bAllowOpti)
428 :m_pFun((void*)a_pFun)
431 , m_eOprtAsct(oaNONE)
434 , m_bAllowOpti(a_bAllowOpti)
439 :m_pFun((void*)a_pFun)
442 , m_eOprtAsct(oaNONE)
445 , m_bAllowOpti(a_bAllowOpti)
450 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
451 , m_iArgc(0 | CALLBACK_INTERNAL_WITH_USER_DATA)
453 , m_eOprtAsct(oaNONE)
456 , m_bAllowOpti(a_bAllowOpti)
461 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
462 , m_iArgc(1 | CALLBACK_INTERNAL_WITH_USER_DATA)
464 , m_eOprtAsct(oaNONE)
467 , m_bAllowOpti(a_bAllowOpti)
472 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
473 , m_iArgc(2 | CALLBACK_INTERNAL_WITH_USER_DATA)
475 , m_eOprtAsct(oaNONE)
478 , m_bAllowOpti(a_bAllowOpti)
483 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
484 , m_iArgc(3 | CALLBACK_INTERNAL_WITH_USER_DATA)
486 , m_eOprtAsct(oaNONE)
489 , m_bAllowOpti(a_bAllowOpti)
494 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
495 , m_iArgc(4 | CALLBACK_INTERNAL_WITH_USER_DATA)
497 , m_eOprtAsct(oaNONE)
500 , m_bAllowOpti(a_bAllowOpti)
505 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
506 , m_iArgc(5 | CALLBACK_INTERNAL_WITH_USER_DATA)
508 , m_eOprtAsct(oaNONE)
511 , m_bAllowOpti(a_bAllowOpti)
516 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
517 , m_iArgc(6 | CALLBACK_INTERNAL_WITH_USER_DATA)
519 , m_eOprtAsct(oaNONE)
522 , m_bAllowOpti(a_bAllowOpti)
527 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
528 , m_iArgc(7 | CALLBACK_INTERNAL_WITH_USER_DATA)
530 , m_eOprtAsct(oaNONE)
533 , m_bAllowOpti(a_bAllowOpti)
538 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
539 , m_iArgc(8 | CALLBACK_INTERNAL_WITH_USER_DATA)
541 , m_eOprtAsct(oaNONE)
544 , m_bAllowOpti(a_bAllowOpti)
549 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
550 , m_iArgc(9 | CALLBACK_INTERNAL_WITH_USER_DATA)
552 , m_eOprtAsct(oaNONE)
555 , m_bAllowOpti(a_bAllowOpti)
560 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
561 , m_iArgc(10 | CALLBACK_INTERNAL_WITH_USER_DATA)
563 , m_eOprtAsct(oaNONE)
566 , m_bAllowOpti(a_bAllowOpti)
571 :m_pFun((void*)a_pFun)
572 , m_iArgc(CALLBACK_INTERNAL_VAR_ARGS)
574 , m_eOprtAsct(oaNONE)
577 , m_bAllowOpti(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)
585 , m_eOprtAsct(oaNONE)
588 , m_bAllowOpti(a_bAllowOpti)
593 :m_pFun((void*)a_pFun)
596 , m_eOprtAsct(oaNONE)
599 , m_bAllowOpti(a_bAllowOpti)
604 :m_pFun((void*)a_pFun)
607 , m_eOprtAsct(oaNONE)
610 , m_bAllowOpti(a_bAllowOpti)
615 :m_pFun((void*)a_pFun)
618 , m_eOprtAsct(oaNONE)
621 , m_bAllowOpti(a_bAllowOpti)
626 :m_pFun((void*)a_pFun)
629 , m_eOprtAsct(oaNONE)
632 , m_bAllowOpti(a_bAllowOpti)
637 :m_pFun((void*)a_pFun)
640 , m_eOprtAsct(oaNONE)
643 , m_bAllowOpti(a_bAllowOpti)
647 :m_pFun((void*)a_pFun)
650 , m_eOprtAsct(oaNONE)
653 , m_bAllowOpti(a_bAllowOpti)
658 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
659 , m_iArgc(0 | CALLBACK_INTERNAL_WITH_USER_DATA)
661 , m_eOprtAsct(oaNONE)
664 , m_bAllowOpti(a_bAllowOpti)
669 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
670 , m_iArgc(1 | CALLBACK_INTERNAL_WITH_USER_DATA)
672 , m_eOprtAsct(oaNONE)
675 , m_bAllowOpti(a_bAllowOpti)
680 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
681 , m_iArgc(2 | CALLBACK_INTERNAL_WITH_USER_DATA)
683 , m_eOprtAsct(oaNONE)
686 , m_bAllowOpti(a_bAllowOpti)
691 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
692 , m_iArgc(3 | CALLBACK_INTERNAL_WITH_USER_DATA)
694 , m_eOprtAsct(oaNONE)
697 , m_bAllowOpti(a_bAllowOpti)
702 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData})
703 , m_iArgc(4 | CALLBACK_INTERNAL_WITH_USER_DATA)
705 , m_eOprtAsct(oaNONE)
708 , m_bAllowOpti(a_bAllowOpti)
713 :m_pFun(new CbWithUserData{
reinterpret_cast<void*
>(a_pFun), a_pUserData })
714 , m_iArgc(5 | CALLBACK_INTERNAL_WITH_USER_DATA)
716 , m_eOprtAsct(oaNONE)
719 , m_bAllowOpti(a_bAllowOpti)
729 , m_eOprtAsct(oaNONE)
752 ParserCallback::~ParserCallback()
754 if (m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA)
755 delete reinterpret_cast<CbWithUserData*
>(m_pFun);
763 void ParserCallback::Assign(
const ParserCallback& ref)
768 if (m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA) {
769 delete reinterpret_cast<CbWithUserData*
>(m_pFun);
773 if (ref.m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA)
774 m_pFun =
new CbWithUserData(*reinterpret_cast<CbWithUserData*>(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;
782 m_eOprtAsct = ref.m_eOprtAsct;
813 if (m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA)
826 if (m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA)
842 && !((m_iArgc & CALLBACK_INTERNAL_WITH_USER_DATA)
854 ETypeCode ParserCallback::GetType()
const
888 return (m_iArgc & CALLBACK_INTERNAL_VAR_ARGS) ? -1 : (m_iArgc & CALLBACK_INTERNAL_FIXED_ARGS_MASK);
892 #if defined(_MSC_VER)
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...
value_type(* strfun_type1)(const char_type *)
Callback type used for functions taking a string as an argument.
user defined binary operator
value_type(* bulkfun_type1)(int, int, value_type)
Callback type used for functions with a single arguments.
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.
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.
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.
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.
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.
value_type(* fun_type5)(value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with five arguments.
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.
value_type(* bulkfun_type2)(int, int, value_type, value_type)
Callback type used for functions with two arguments.
value_type(* fun_type1)(value_type)
Callback type used for functions with a single arguments.
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.
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.
value_type(* fun_userdata_type0)(void *)
Callback type with user data (not null) used for functions without arguments.
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...
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.
value_type(* strfun_type3)(const char_type *, value_type, value_type)
Callback type used for functions taking a string and two values as arguments.
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.
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.
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...
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.
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.
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.
Code for a generic function item.
EOprtAssociativity
Parser operator precedence values.
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.
value_type(* bulkfun_type5)(int, int, value_type, value_type, value_type, value_type, value_type)
Callback type used for functions with five arguments.
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.
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.
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.
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.
ETypeCode
Types internally used by the parser.
value_type(* bulkfun_userdata_type1)(void *, int, int, value_type)
Callback type with user data (not null) used for functions with a single arguments.
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.
value_type(* fun_type2)(value_type, value_type)
Callback type used for functions with two arguments.
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.
value_type(* fun_userdata_type1)(void *, value_type)
Callback type with user data (not null) used for functions with a single arguments.
String type (Function arguments and constants only, no string variables)
value_type(* strfun_type2)(const char_type *, value_type)
Callback type used for functions taking a string and a value as arguments.
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.
Namespace for mathematical applications.
value_type(* fun_type3)(value_type, value_type, value_type)
Callback type used for functions with three arguments.
value_type(* fun_type0)()
Callback type used for functions without arguments.
Special callbacks for Bulk mode with an additional parameter for the bulk index.
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.
Code for a function with a string parameter.
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.
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.
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.
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...
value_type(* fun_type4)(value_type, value_type, value_type, value_type)
Callback type used for functions with four arguments.
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.
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.
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.
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.
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...
value_type(* fun_userdata_type2)(void *, value_type, value_type)
Callback type with user data (not null) used for functions with two arguments.
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.
value_type(* bulkfun_type0)(int, int)
Callback type used for functions without arguments.
void * GetUserData() const
Get the user data if present, else nullptr.
Floating point variables.
value_type(* bulkfun_type3)(int, int, value_type, value_type, value_type)
Callback type used for functions with three arguments.
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.
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.
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...
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.