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