ALib C++ Library
Library Version: 2511 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
arithmetics.cpp
1//##################################################################################################
2// ALib C++ Library
3//
4// Copyright 2013-2025 A-Worx GmbH, Germany
5// Published under 'Boost Software License' (a free software license, see LICENSE.txt)
6//##################################################################################################
7#include "alib_precompile.hpp"
8#if !defined(ALIB_C20_MODULES) || ((ALIB_C20_MODULES != 0) && (ALIB_C20_MODULES != 1))
9# error "Symbol ALIB_C20_MODULES has to be given to the compiler as either 0 or 1"
10#endif
11#if ALIB_C20_MODULES
12 module;
13#endif
14//========================================= Global Fragment ========================================
17#include <math.h>
18
19//============================================== Module ============================================
20#if ALIB_C20_MODULES
21 module ALib.Expressions.Impl;
22 import ALib.Characters.Functions;
23 import ALib.Strings;
24#else
26# include "ALib.Strings.H"
28#endif
29//========================================== Implementation ========================================
30#if !DOXYGEN
31
32#define ARG0 (*args)
33#define ARG1 (*(args+1))
34#define BOL(box) (box).Unbox<bool >()
35#define INT(box) (box).Unbox<integer>()
36#define ITF(box) double((box).Unbox<integer>() )
37#define BTF(box) double((box).Unbox<bool >() )
38#define FLT(box) (box).Unbox<double >()
39#define FUNC( name,...) Box name( Scope& scope, \
40 ArgIterator args, \
41 ArgIterator end ) \
42 { (void) scope; (void) args; (void) end; __VA_ARGS__ }
43
44#if !ALIB_FEAT_BOXING_BIJECTIVE_INTEGRALS
45# define TOINT(arg) arg
46#else
47# define TOINT(arg) integer(arg)
48#endif
49
50
51namespace alib { namespace expressions { namespace plugins {
52
53
54FUNC( ToBoolean , return args->Call<FIsTrue>(); )
55
56namespace {
57
58
59//##################################################################################################
60// ### Arithmetics - constants
61//##################################################################################################
62
63Box constTrue = true;
64Box constFalse = false;
65Box identity = nullptr;
66Box bool_false = false;
67Box bool_true = true;
68Box int_0 = integer( 0 );
69Box int_1 = integer( 1 );
70Box float_0 = 0.0;
71Box float_1 = 1.0;
72
73
74//##################################################################################################
75// ### Arithmetics - Functions
76//##################################################################################################
77FUNC( toInt_B , return integer(BOL(ARG0)); )
78FUNC( toInt_I , return ARG0; )
79FUNC( toInt_F , return integer(FLT(ARG0)); )
80FUNC( toFloat_B, return double (BOL(ARG0)); )
81FUNC( toFloat_I, return double (INT(ARG0)); )
82FUNC( toFloat_F, return ARG0; )
83
84FUNC( arrLen, return ARG0.UnboxLength(); )
85
86
87//##################################################################################################
88// ### Arithmetics - unary operations
89//##################################################################################################
90
91FUNC( pos , return ARG0; )
92FUNC( pos_B , return integer(BOL(ARG0)); )
93FUNC( neg_B , return - integer(BOL(ARG0)); )
94FUNC( neg_I , return -INT(ARG0); )
95FUNC( neg_F , return -FLT(ARG0); )
96FUNC( bitNot , return ~INT(ARG0); )
97FUNC( boolNot_B, return !BOL(ARG0); )
98FUNC( boolNot_I, return INT(ARG0) == integer(0); )
99FUNC( boolNot_F, return FLT(ARG0) == 0.0; )
100
101
102//##################################################################################################
103// ### Arithmetics - binary operations
104//##################################################################################################
105
106#if defined(_MSC_VER)
107 #pragma warning( push )
108 #pragma warning( disable : 4804 ) // unsafe use of type bool
109 #pragma warning( disable : 4805 ) // unsafe mix of type bool and int
110#endif
111
112FUNC( mul_BB, return BOL(ARG0) * BOL(ARG1) ; )
113FUNC( mul_BI, return BOL(ARG0) * INT(ARG1) ; )
114FUNC( mul_BF, return BOL(ARG0) * FLT(ARG1) ; )
115FUNC( mul_IB, return INT(ARG0) * BOL(ARG1) ; )
116FUNC( mul_II, return INT(ARG0) * INT(ARG1) ; )
117FUNC( mul_IF, return ITF(ARG0) * FLT(ARG1) ; )
118FUNC( mul_FB, return FLT(ARG0) * BTF(ARG1) ; )
119FUNC( mul_FI, return FLT(ARG0) * ITF(ARG1) ; )
120FUNC( mul_FF, return FLT(ARG0) * FLT(ARG1) ; )
121FUNC( div_BI, return BOL(ARG0) / INT(ARG1) ; )
122FUNC( div_BF, return BOL(ARG0) / FLT(ARG1) ; )
123FUNC( div_II, return INT(ARG0) / INT(ARG1) ; )
124FUNC( div_IF, return ITF(ARG0) / FLT(ARG1) ; )
125FUNC( div_FI, return FLT(ARG0) / ITF(ARG1) ; )
126FUNC( div_FF, return FLT(ARG0) / FLT(ARG1) ; )
127FUNC( mod_BI, return BOL(ARG0) % INT(ARG1) ; )
128FUNC( mod_II, return INT(ARG0) % INT(ARG1) ; )
129FUNC( mod_BF, return fmod(BOL(ARG0), FLT(ARG1)); )
130FUNC( mod_FI, return fmod(FLT(ARG0), INT(ARG1)); )
131FUNC( mod_IF, return fmod(INT(ARG0), FLT(ARG1)); )
132FUNC( mod_FF, return fmod(FLT(ARG0), FLT(ARG1)); )
133
134FUNC( add_BB, return BOL(ARG0) + BOL(ARG1) ; )
135FUNC( add_BI, return BOL(ARG0) + INT(ARG1) ; )
136FUNC( add_BF, return BOL(ARG0) + FLT(ARG1) ; )
137FUNC( add_IB, return INT(ARG0) + BOL(ARG1) ; )
138FUNC( add_II, return INT(ARG0) + INT(ARG1) ; )
139FUNC( add_IF, return ITF(ARG0) + FLT(ARG1) ; )
140FUNC( add_FB, return FLT(ARG0) + BOL(ARG1) ; )
141FUNC( add_FI, return FLT(ARG0) + ITF(ARG1) ; )
142FUNC( add_FF, return FLT(ARG0) + FLT(ARG1) ; )
143FUNC( sub_BB, return BOL(ARG0) - BOL(ARG1) ; )
144FUNC( sub_BI, return BOL(ARG0) - INT(ARG1) ; )
145FUNC( sub_BF, return BOL(ARG0) - FLT(ARG1) ; )
146FUNC( sub_IB, return INT(ARG0) - BOL(ARG1) ; )
147FUNC( sub_II, return INT(ARG0) - INT(ARG1) ; )
148FUNC( sub_IF, return ITF(ARG0) - FLT(ARG1) ; )
149FUNC( sub_FB, return FLT(ARG0) - BOL(ARG1) ; )
150FUNC( sub_FI, return FLT(ARG0) - ITF(ARG1) ; )
151FUNC( sub_FF, return FLT(ARG0) - FLT(ARG1) ; )
152
153FUNC( shfL_BI, return TOINT( BOL(ARG0) << INT(ARG1) ); )
154FUNC( shfL_IB, return INT(ARG0) << BOL(ARG1) ; )
155FUNC( shfL_II, return INT(ARG0) << INT(ARG1) ; )
156FUNC( shfR_BI, return TOINT( BOL(ARG0) << INT(ARG1) ); )
157FUNC( shfR_IB, return INT(ARG0) << BOL(ARG1) ; )
158FUNC( shfR_II, return INT(ARG0) >> INT(ARG1) ; )
159
160FUNC( sm_BB, return BOL(ARG0) < BOL(ARG1) ; )
161FUNC( sm_BI, return BOL(ARG0) < INT(ARG1) ; )
162FUNC( sm_BF, return isless(double(BOL(ARG0)), FLT(ARG1) ); )
163FUNC( sm_IB, return INT(ARG0) < BOL(ARG1) ; )
164FUNC( sm_II, return INT(ARG0) < INT(ARG1) ; )
165FUNC( sm_IF, return isless(double (INT(ARG0)), FLT(ARG1) ); )
166FUNC( sm_FB, return isless( FLT(ARG0) , double(BOL(ARG1))); )
167FUNC( sm_FI, return isless( FLT(ARG0) , double(INT(ARG1))); )
168FUNC( sm_FF, return isless( FLT(ARG0) , FLT(ARG1) ); )
169FUNC( smeq_BB, return BOL(ARG0) <= BOL(ARG1) ; )
170FUNC( smeq_BI, return BOL(ARG0) <= INT(ARG1) ; )
171FUNC( smeq_BF, return islessequal(double(BOL(ARG0)), FLT(ARG1) ); )
172FUNC( smeq_IB, return INT(ARG0) <= BOL(ARG1) ; )
173FUNC( smeq_II, return INT(ARG0) <= INT(ARG1) ; )
174FUNC( smeq_IF, return islessequal(double(INT(ARG0)), FLT(ARG1) ); )
175FUNC( smeq_FB, return islessequal( FLT(ARG0) , double(BOL(ARG1))); )
176FUNC( smeq_FI, return islessequal( FLT(ARG0) , double(INT(ARG1))); )
177FUNC( smeq_FF, return islessequal( FLT(ARG0) , FLT(ARG1) ); )
178FUNC( gt_BB, return BOL(ARG0) > BOL(ARG1) ; )
179FUNC( gt_BI, return BOL(ARG0) > INT(ARG1) ; )
180FUNC( gt_BF, return isgreater(double(BOL(ARG0)), FLT(ARG1) ); )
181FUNC( gt_IB, return INT(ARG0) > BOL(ARG1) ; )
182FUNC( gt_II, return INT(ARG0) > INT(ARG1) ; )
183FUNC( gt_IF, return isgreater(double(INT(ARG0)), FLT(ARG1) ); )
184FUNC( gt_FB, return isgreater( FLT(ARG0) , double(BOL(ARG1))); )
185FUNC( gt_FI, return isgreater( FLT(ARG0) , double(INT(ARG1))); )
186FUNC( gt_FF, return isgreater( FLT(ARG0) , FLT(ARG1) ); )
187FUNC( gteq_BB, return BOL(ARG0) >= BOL(ARG1) ; )
188FUNC( gteq_BI, return BOL(ARG0) >= INT(ARG1) ; )
189FUNC( gteq_BF, return isgreaterequal(double(BOL(ARG0)), FLT(ARG1) ); )
190FUNC( gteq_IB, return INT(ARG0) >= BOL(ARG1) ; )
191FUNC( gteq_II, return INT(ARG0) >= INT(ARG1) ; )
192FUNC( gteq_IF, return isgreaterequal(double(INT(ARG0)), FLT(ARG1) ); )
193FUNC( gteq_FB, return isgreaterequal( FLT(ARG0) , double(BOL(ARG1))); )
194FUNC( gteq_FI, return isgreaterequal( FLT(ARG0) , double(INT(ARG1))); )
195FUNC( gteq_FF, return isgreaterequal( FLT(ARG0) , FLT(ARG1) ); )
196
197FUNC( eq_BB, return BOL(ARG0) == BOL(ARG1) ; )
198FUNC( eq_BI, return BOL(ARG0) == INT(ARG1) ; )
199FUNC( eq_BF, return std::fabs( BOL(ARG0) - FLT(ARG1) ) <= std::numeric_limits<double>::epsilon(); )
200FUNC( eq_IB, return INT(ARG0) == BOL(ARG1) ; )
201FUNC( eq_II, return INT(ARG0) == INT(ARG1) ; )
202FUNC( eq_IF, return std::fabs( ITF(ARG0) - FLT(ARG1) ) <= std::numeric_limits<double>::epsilon(); )
203FUNC( eq_FB, return std::fabs( FLT(ARG0) - BOL(ARG1) ) <= std::numeric_limits<double>::epsilon(); )
204FUNC( eq_FI, return std::fabs( FLT(ARG0) - ITF(ARG1) ) <= std::numeric_limits<double>::epsilon(); )
205FUNC( eq_FF, return std::fabs( FLT(ARG0) - FLT(ARG1) ) <= std::numeric_limits<double>::epsilon(); )
206
207
208
209FUNC( neq_BB, return BOL(ARG0) != BOL(ARG1) ; )
210FUNC( neq_BI, return BOL(ARG0) != INT(ARG1) ; )
211FUNC( neq_BF, return std::fabs( BOL(ARG0) - FLT(ARG1) ) > std::numeric_limits<double>::epsilon(); )
212FUNC( neq_IB, return INT(ARG0) != BOL(ARG1) ; )
213FUNC( neq_II, return INT(ARG0) != INT(ARG1) ; )
214FUNC( neq_IF, return std::fabs( INT(ARG0) - INT(ARG1) ) > std::numeric_limits<double>::epsilon(); )
215FUNC( neq_FB, return std::fabs( FLT(ARG0) - BOL(ARG1) ) > std::numeric_limits<double>::epsilon(); )
216FUNC( neq_FI, return std::fabs( FLT(ARG0) - ITF(ARG1) ) > std::numeric_limits<double>::epsilon(); )
217FUNC( neq_FF, return std::fabs( FLT(ARG0) - FLT(ARG1) ) > std::numeric_limits<double>::epsilon(); )
218
219
220FUNC( bitAnd, return INT(ARG0) & INT(ARG1) ; )
221FUNC( bitXOr, return INT(ARG0) ^ INT(ARG1) ; )
222FUNC( bitOr , return INT(ARG0) | INT(ARG1) ; )
223FUNC( boolAnd_BB, return BOL(ARG0) && BOL(ARG1) ; )
224FUNC( boolAnd_BI, return BOL(ARG0) && INT(ARG1) != 0 ; )
225FUNC( boolAnd_BF, return BOL(ARG0) && FLT(ARG1) != 0.0 ; )
226FUNC( boolAnd_IB, return INT(ARG0) != 0 && BOL(ARG1) ; )
227FUNC( boolAnd_II, return INT(ARG0) != 0 && INT(ARG1) != 0 ; )
228FUNC( boolAnd_IF, return INT(ARG0) != 0 && FLT(ARG1) != 0.0 ; )
229FUNC( boolAnd_FB, return FLT(ARG0) != 0.0 && BOL(ARG1) ; )
230FUNC( boolAnd_FI, return FLT(ARG0) != 0.0 && INT(ARG1) != 0 ; )
231FUNC( boolAnd_FF, return FLT(ARG0) != 0.0 && FLT(ARG1) != 0.0 ; )
232FUNC( boolOr_BB, return BOL(ARG0) || BOL(ARG1) ; )
233FUNC( boolOr_BI, return BOL(ARG0) || INT(ARG1) != 0 ; )
234FUNC( boolOr_BF, return BOL(ARG0) || FLT(ARG1) != 0.0 ; )
235FUNC( boolOr_IB, return INT(ARG0) != 0 || BOL(ARG1) ; )
236FUNC( boolOr_II, return INT(ARG0) != 0 || INT(ARG1) != 0 ; )
237FUNC( boolOr_IF, return INT(ARG0) != 0 || FLT(ARG1) != 0.0 ; )
238FUNC( boolOr_FB, return FLT(ARG0) != 0.0 || BOL(ARG1) ; )
239FUNC( boolOr_FI, return FLT(ARG0) != 0.0 || INT(ARG1) != 0 ; )
240FUNC( boolOr_FF, return FLT(ARG0) != 0.0 || FLT(ARG1) != 0.0 ; )
241
242#if defined(_MSC_VER)
243 #pragma warning( pop )
244#endif
245
246Calculus::OperatorTableEntry OperatorTable[] =
247{
248 // unary operators
259
260 // binary operators
381};
382
383Calculus::OperatorAliasTableEntry bitwiseOpsAliasBooleanOps[] =
384{
385 { A_CHAR("&"), Types::Boolean, Types::Boolean ,A_CHAR("&&") },
386 { A_CHAR("&"), Types::Boolean, Types::Integer ,A_CHAR("&&") },
387 { A_CHAR("&"), Types::Boolean, Types::Float ,A_CHAR("&&") },
388 { A_CHAR("&"), Types::Integer, Types::Boolean ,A_CHAR("&&") },
389 { A_CHAR("&"), Types::Float , Types::Boolean ,A_CHAR("&&") },
390 { A_CHAR("|"), Types::Boolean, Types::Boolean ,A_CHAR("||") },
391 { A_CHAR("|"), Types::Boolean, Types::Integer ,A_CHAR("||") },
392 { A_CHAR("|"), Types::Boolean, Types::Float ,A_CHAR("||") },
393 { A_CHAR("|"), Types::Integer, Types::Boolean ,A_CHAR("||") },
394 { A_CHAR("|"), Types::Float , Types::Boolean ,A_CHAR("||") },
395};
396
397Calculus::BinaryOpOptimizationsTableEntry binaryOperatorOptimizations[] =
398{
399 // optimizations with LEFT side constant value
400 { A_CHAR("||"), lang::Side::Left , bool_true , Types::Boolean, bool_true },
401 { A_CHAR("||"), lang::Side::Left , bool_false, Types::Boolean, identity },
402 { A_CHAR("&&"), lang::Side::Left , bool_true , Types::Boolean, identity },
403 { A_CHAR("&&"), lang::Side::Left , bool_false, Types::Boolean, bool_false },
404
405 { A_CHAR("+") , lang::Side::Left , int_0 , Types::Integer, identity },
406 { A_CHAR("+") , lang::Side::Left , float_0 , Types::Float , identity },
407 { A_CHAR("-") , lang::Side::Left , int_0 , Types::Integer, identity },
408 { A_CHAR("-") , lang::Side::Left , float_0 , Types::Float , identity },
409
410 { A_CHAR("*") , lang::Side::Left , int_0 , Types::Integer, int_0 },
411 { A_CHAR("*") , lang::Side::Left , int_1 , Types::Integer, identity },
412 { A_CHAR("*") , lang::Side::Left , float_0 , Types::Float , float_0 },
413 { A_CHAR("*") , lang::Side::Left , float_1 , Types::Float , identity },
414
415
416 // optimizations with RIGHT side constant value (repeat from above)
417 { A_CHAR("||"), lang::Side::Right, bool_true , Types::Boolean, bool_true },
418 { A_CHAR("||"), lang::Side::Right, bool_false, Types::Boolean, identity },
419 { A_CHAR("&&"), lang::Side::Right, bool_true , Types::Boolean, identity },
420 { A_CHAR("&&"), lang::Side::Right, bool_false, Types::Boolean, bool_false },
421
422 { A_CHAR("+") , lang::Side::Right, int_0 , Types::Integer, identity },
423 { A_CHAR("+") , lang::Side::Right, float_0 , Types::Float , identity },
424 { A_CHAR("-") , lang::Side::Right, int_0 , Types::Integer, identity },
425 { A_CHAR("-") , lang::Side::Right, float_0 , Types::Float , identity },
426
427 { A_CHAR("*") , lang::Side::Right, int_0 , Types::Integer, int_0 },
428 { A_CHAR("*") , lang::Side::Right, int_1 , Types::Integer, identity },
429 { A_CHAR("*") , lang::Side::Right, float_0 , Types::Float , float_0 },
430 { A_CHAR("*") , lang::Side::Right, float_1 , Types::Float , identity },
431
432 // further optimizations with RIGHT side constant value (not available for left-side)
433 { A_CHAR("/") , lang::Side::Right, int_1 , Types::Integer, identity },
434 { A_CHAR("/") , lang::Side::Right, int_1 , Types::Float , identity },
435 { A_CHAR("/") , lang::Side::Right, float_1 , Types::Float , identity },
436
437 { A_CHAR("%") , lang::Side::Right, int_1 , Types::Integer, identity },
438 { A_CHAR("%") , lang::Side::Right, int_1 , Types::Float , identity },
439 { A_CHAR("%") , lang::Side::Right, float_1 , Types::Float , identity },
440};
441
442
443} // anonymous namespace
444
445
446//##################################################################################################
447// ### Arithmetics - Constructor. Creates the hash map
448//##################################################################################################
450: Calculus( "ALib Arithmetics", compiler, CompilePriorities::Arithmetics ) {
451 constexpr int tableSize= 9;
452 Token functionNames[tableSize];
453 strings::util::LoadResourcedTokens( EXPRESSIONS, "CPA", functionNames
454 ALIB_DBG(,tableSize) );
455 Token* descriptor= functionNames;
456 ConstantIdentifiers=
457 {
458 { *descriptor++, constTrue },
459 { *descriptor++, constFalse },
460 { *descriptor++, constTrue },
461 { *descriptor++, constFalse },
462 { *descriptor++, constTrue },
463 { *descriptor++, constFalse },
464 };
465
466 Functions=
467 {
468 { *descriptor++, CALCULUS_SIGNATURE(Signatures::Var), CALCULUS_CALLBACK(ToBoolean), &Types::Boolean , CTI },
469 { *descriptor , CALCULUS_SIGNATURE(Signatures::B ), CALCULUS_CALLBACK(toInt_B ), &Types::Integer , CTI },
470 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(toInt_I ), &Types::Integer , CTI },
471 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(toInt_F ), &Types::Integer , CTI },
472 { *descriptor , CALCULUS_SIGNATURE(Signatures::B ), CALCULUS_CALLBACK(toFloat_B), &Types::Float , CTI },
473 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(toFloat_I), &Types::Float , CTI },
474 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(toFloat_F), &Types::Float , CTI },
475 };
476
477 AddOperators( OperatorTable );
478
479 if( HasBits(compiler.CfgCompilation, Compilation::AllowBitwiseBooleanOperators ) ) {
480 AddOperatorAliases( bitwiseOpsAliasBooleanOps );
481 AddOperatorAlias ( A_CHAR("~"), Types::Boolean, Types::Void, A_CHAR("!") );
482 }
483
484 AddBinaryOpOptimizations( binaryOperatorOptimizations);
485
486 ALIB_ASSERT_ERROR( descriptor - functionNames == tableSize, "EXPR",
487 "Descriptor table size mismatch: Consumed {} descriptors, {} available.",
488 descriptor - functionNames, tableSize)
489}
490
491bool Arithmetics::TryCompilation( CIFunction& ciFunction ) {
492 if( Calculus::TryCompilation( ciFunction ) )
493 return true;
494
495 if( ciFunction.QtyArgs() == 1 && ciFunction.ArgsBegin->IsArray() ) {
496 constexpr int tableSize= 1;
497 Token functionNames[tableSize];
498
499 strings::util::LoadResourcedTokens( EXPRESSIONS, "CPALen", functionNames
500 ALIB_DBG(,tableSize) );
501
502 if( functionNames[0].Match( ciFunction.Name ) ) {
503 ciFunction.Name.Reset( functionNames[0] );
504ALIB_DBG( ciFunction.DbgCallbackName = "arrLen"; )
505
506 // for constants, the callback might b invoked right away (optimizing call out)
507 if( ciFunction.AllArgsAreConst ) {
508 ciFunction.TypeOrValue = ciFunction.ArgsBegin->UnboxLength();
509 return true;
510 }
511
512 ciFunction.Callback = arrLen;
513 ciFunction.TypeOrValue = Types::Integer;
514
515 return true;
516 } }
517
518 return false;
519}
520
521}}} // namespace [alib::expressions::detail]
522
523#undef BOL
524#undef INT
525#undef FLT
526#undef FUNC
527#undef FUNC
528#undef UN_MAP_ENTRY
529#undef BIN_MAP_ENTRY
530#undef BIN_ALIAS_ENTRY
531
532
533#endif //DOXYGEN
#define A_CHAR(STR)
#define CALCULUS_CALLBACK(func)
#define CALCULUS_SIGNATURE(BoxPointerArray)
#define ALIB_DBG(...)
Definition alib.inl:853
#define ALIB_ASSERT_ERROR(cond, domain,...)
Definition alib.inl:1066
constexpr bool HasBits(TEnum element, TEnum selection) noexcept
Definition bitwise.inl:325
ALIB_DLL Box ToBoolean(Scope &scope, ArgIterator args, ArgIterator)
@ Right
Denotes the right side of something.
@ Left
Denotes the left side of something.
strings::util::Token Token
Type alias in namespace alib.
Definition token.inl:398
lang::integer integer
Type alias in namespace alib.
Definition integers.inl:149
boxing::Box Box
Type alias in namespace alib.
Definition box.inl:1149
expressions::Compiler Compiler
Type alias in namespace alib.
Definition compiler.inl:540
boxing::FIsTrue FIsTrue
Type alias in namespace alib.
static ALIB_DLL Box Integer
Sample type-box for integer types. (Precisely for type integer.)
static ALIB_DLL Box Boolean
Sample type-box for C++ type bool.
static ALIB_DLL Box Void
Sample type-box for C++ type void.
static ALIB_DLL Box Float
Sample type-box for C++ type double.
ALIB_DLL Arithmetics(Compiler &compiler)
const std::tuple< String, lang::Side, Type, const Box &, const Box & > BinaryOpOptimizationsTableEntry
Definition calculus.inl:627
static constexpr CTInvokable CTI
Definition calculus.inl:234
const std::tuple< String, Type, Type, String > OperatorAliasTableEntry
Definition calculus.inl:462
const std::tuple< String, Type, Type, CallbackDecl, Type, CTInvokable > OperatorTableEntry
Definition calculus.inl:449