ALib C++ Framework
by
Library Version: 2605 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
math.cpp
1
2#if !defined(M_PI)
3# define M_PI 3.14159265358979323846
4#endif
5#if !defined(M_E)
6# define M_E 2.7182818284590452354
7#endif
8#if !defined(M_LN10)
9# define M_LN10 2.30258509299404568402
10#endif
11
12
13//! @cond NO_DOX
14
15#define INT(box) (box).Unbox<integer>()
16#define FLT(box) (box).Unbox<double >()
17#define FUNC( name,...) Box name( Scope& scope, \
18 ArgIterator args, \
19 ArgIterator end ) \
20 { (void) scope; (void) args; (void) end; __VA_ARGS__ }
21
22namespace alib { namespace expressions { namespace plugins {
23
24namespace {
25
26//##################################################################################################
27// ### Math - constants
28//##################################################################################################
29
30Box constPI;
31Box constE;
32
33//##################################################################################################
34// ### Math - functions
35//##################################################################################################
36FUNC( max_I , return (std::max) (INT(*args),INT(*(args+1))); )
37FUNC( max_F , return (::fmax) (FLT(*args),FLT(*(args+1))); )
38FUNC( min_I , return (std::min) (INT(*args),INT(*(args+1))); )
39FUNC( min_F , return (::fmin) (FLT(*args),FLT(*(args+1))); )
40FUNC( abs_I , return std::abs (INT(*args)); )
41FUNC( abs , return ::fabs (FLT(*args)); )
42FUNC( ceil , return ::ceil (FLT(*args)); )
43FUNC( floor , return ::floor (FLT(*args)); )
44FUNC( trunc , return ::round (FLT(*args)); )
45FUNC( round , return ::round (FLT(*args)); )
46FUNC( rint , return integer(::llrint(FLT(*args))); )
47FUNC( remainder, return ::remainder(FLT(*args),FLT(*(args+1))); )
48
49FUNC( rand , return double(std::rand()) / double(RAND_MAX); )
50
51FUNC( sin , return ::sin (FLT(*args)); )
52FUNC( asin , return ::asin (FLT(*args)); )
53FUNC( cos , return ::cos (FLT(*args)); )
54FUNC( acos , return ::acos (FLT(*args)); )
55FUNC( tan , return ::tan (FLT(*args)); )
56FUNC( atan , return ::atan (FLT(*args)); )
57
58FUNC( sinh , return ::sinh (FLT(*args)); )
59FUNC( asinh , return ::asinh (FLT(*args)); )
60FUNC( cosh , return ::cosh (FLT(*args)); )
61FUNC( acosh , return ::acosh (FLT(*args)); )
62FUNC( tanh , return ::tanh (FLT(*args)); )
63FUNC( atanh , return ::atanh (FLT(*args)); )
64
65FUNC( exp , return ::exp (FLT(*args)); )
66FUNC( exp2 , return ::exp2 (FLT(*args)); )
67#if defined(_WIN32) || defined(__APPLE__) || defined(__ANDROID_NDK__)
68 FUNC(exp10 , return ::pow (10.0 ,FLT(*args)); )
69#else
70 FUNC(exp10 , return ::exp10 (FLT(*args)); )
71#endif
72
73
74FUNC( log , return ::log (FLT(*args)); )
75FUNC( log2 , return ::log2 (FLT(*args)); )
76#if defined(_WIN32)
77 FUNC( log10 , return ::log (FLT(*args)) / M_LN10; )
78#else
79 FUNC( log10 , return ::log10 (FLT(*args)); )
80#endif
81
82FUNC( pow , return ::pow (FLT(*args++),FLT(*args)); )
83#if defined(_WIN32) || defined(__APPLE__) || defined(__ANDROID_NDK__)
84 FUNC(pow10 , return ::pow (10.0 ,FLT(*args)); )
85#else
86 FUNC(pow10 , return ::exp10 (FLT(*args)); )
87#endif
88FUNC( sqrt , return ::sqrt (FLT(*args)); )
89FUNC( cbrt , return ::cbrt (FLT(*args)); )
90
91
92
93} // anonymous namespace
94
95
96//##################################################################################################
97// ### Math - Constructor. Creates the hash map
98//##################################################################################################
99Math::Math( Compiler& compiler )
100: Calculus( "ALib Math", compiler, CompilePriorities::Math ) {
101 constPI= M_PI; // Initialize constant static boxes. This must not be done
102 constE = M_E; // in the C++ bootstrap code.
103
104 // load identifier/function names from resources
105 constexpr int tableSize= 34;
106 Token functionNames[tableSize];
107 strings::util::LoadResourcedTokens( EXPRESSIONS, "CPM", functionNames
108 ALIB_DBG(,tableSize) );
109
110 Token* descriptor= functionNames;
111
112 // Constant identifiers
113 ConstantIdentifiers=
114 {
115 { *descriptor++, constPI },
116 { *descriptor++, constE },
117 };
118
119 Functions=
120 {
121 { *descriptor , CALCULUS_SIGNATURE(Signatures::I ), CALCULUS_CALLBACK(abs_I ), &Types::Integer , CTI },
122 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(abs ), &Types::Float , CTI },
123 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(ceil ), &Types::Float , CTI },
124 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(floor ), &Types::Float , CTI },
125 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(trunc ), &Types::Float , CTI },
126 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(round ), &Types::Float , CTI },
127 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(rint ), &Types::Integer , CTI },
128 { *descriptor , CALCULUS_SIGNATURE(Signatures::II), CALCULUS_CALLBACK(max_I ), &Types::Integer , CTI },
129 { *descriptor++, CALCULUS_SIGNATURE(Signatures::FF), CALCULUS_CALLBACK(max_F ), &Types::Float , CTI },
130 { *descriptor , CALCULUS_SIGNATURE(Signatures::II), CALCULUS_CALLBACK(min_I ), &Types::Integer , CTI },
131 { *descriptor++, CALCULUS_SIGNATURE(Signatures::FF), CALCULUS_CALLBACK(min_F ), &Types::Float , CTI },
132 { *descriptor++, CALCULUS_SIGNATURE(Signatures::FF), CALCULUS_CALLBACK(remainder), &Types::Float , CTI },
133 { *descriptor++, CALCULUS_SIGNATURE(nullptr ), CALCULUS_CALLBACK(rand ), &Types::Float , ETI },
134 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(sin ), &Types::Float , CTI },
135 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(asin ), &Types::Float , CTI },
136 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(cos ), &Types::Float , CTI },
137 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(acos ), &Types::Float , CTI },
138 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(tan ), &Types::Float , CTI },
139 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(atan ), &Types::Float , CTI },
140 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(sinh ), &Types::Float , CTI },
141 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(asinh ), &Types::Float , CTI },
142 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(cosh ), &Types::Float , CTI },
143 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(acosh ), &Types::Float , CTI },
144 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(tanh ), &Types::Float , CTI },
145 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(atanh ), &Types::Float , CTI },
146 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(exp ), &Types::Float , CTI },
147 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(exp2 ), &Types::Float , CTI },
148 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(exp10 ), &Types::Float , CTI },
149 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(log ), &Types::Float , CTI },
150 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(log2 ), &Types::Float , CTI },
151 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(log10 ), &Types::Float , CTI },
152 { *descriptor++, CALCULUS_SIGNATURE(Signatures::FF), CALCULUS_CALLBACK(pow ), &Types::Float , CTI },
153 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(pow10 ), &Types::Float , CTI },
154 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(sqrt ), &Types::Float , CTI },
155 { *descriptor++, CALCULUS_SIGNATURE(Signatures::F ), CALCULUS_CALLBACK(cbrt ), &Types::Float , CTI },
156 };
157
158 ALIB_ASSERT_ERROR( descriptor - functionNames == tableSize, "EXPR",
159 "Descriptor table size mismatch: Consumed {} descriptors, {} available.",
160 descriptor - functionNames, tableSize )
161}
162
163
164}}} // namespace [alib::expressions::detail]
165
166#undef INT
167#undef FLT
168#undef FUNC
169
170
171//! @endcond
#define ALIB_DBG(...)
#define ALIB_ASSERT_ERROR(cond, domain,...)
#define CALCULUS_CALLBACK(func)
#define CALCULUS_SIGNATURE(BoxPointerArray)
Definition alox.cpp:14
lang::integer integer
Type alias in namespace #"%alib".
Definition integers.hpp:149
boxing::Box Box
Type alias in namespace #"%alib".
Definition box.hpp:1128
expressions::Compiler Compiler
Type alias in namespace #"%alib".
Definition compiler.hpp:535
strings::util::Token Token
Type alias in namespace #"%alib".
Definition token.hpp:396