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