1 #define _USE_MATH_DEFINES
2 #include <cmath>
3
4 #include "builtincontext.h"
5 #include "builtin.h"
6 #include "expression.h"
7 #include "function.h"
8 #include "ModuleInstantiation.h"
9 #include "printutils.h"
10 #include "evalcontext.h"
11 #include "boost-utils.h"
12
BuiltinContext()13 BuiltinContext::BuiltinContext() : Context()
14 {
15 }
16
init()17 void BuiltinContext::init()
18 {
19 for(const auto &assignment : Builtins::instance()->getAssignments()) {
20 this->set_variable(assignment->getName(), assignment->getExpr()->evaluate(shared_from_this()));
21 }
22
23 this->set_constant("PI", M_PI);
24 }
25
evaluate_function(const std::string & name,const std::shared_ptr<EvalContext> & evalctx) const26 Value BuiltinContext::evaluate_function(const std::string &name, const std::shared_ptr<EvalContext>& evalctx) const
27 {
28 const auto &search = Builtins::instance()->getFunctions().find(name);
29 if (search != Builtins::instance()->getFunctions().end()) {
30 AbstractFunction *f = search->second;
31 if (f->is_enabled()) return f->evaluate((const_cast<BuiltinContext *>(this))->get_shared_ptr(), evalctx);
32 else LOG(message_group::Warning,evalctx->loc,this->documentPath(),"Experimental builtin function '%1$s' is not enabled",name);
33 }
34 return Context::evaluate_function(name, evalctx);
35 }
36
instantiate_module(const class ModuleInstantiation & inst,const std::shared_ptr<EvalContext> & evalctx) const37 class AbstractNode *BuiltinContext::instantiate_module(const class ModuleInstantiation &inst, const std::shared_ptr<EvalContext>& evalctx) const
38 {
39 const std::string &name = inst.name();
40 const auto &search = Builtins::instance()->getModules().find(name);
41 if (search != Builtins::instance()->getModules().end()) {
42 AbstractModule *m = search->second;
43 if (!m->is_enabled()) {
44 LOG(message_group::Warning,evalctx->loc,this->documentPath(),"Experimental builtin module '%1$s' is not enabled",name);
45 }
46 std::string replacement = Builtins::instance()->instance()->isDeprecated(name);
47 if (!replacement.empty()) {
48 LOG(message_group::Deprecated,evalctx->loc,this->documentPath(),"The %1$s() module will be removed in future releases. Use %2$s instead.", std::string(name),std::string(replacement));
49 }
50 return m->instantiate((const_cast<BuiltinContext *>(this))->get_shared_ptr(), &inst, evalctx);
51 }
52 return Context::instantiate_module(inst, evalctx);
53 }
54
55