Select Git revision
BuiltinModule.cpp
-
Stéphane Del Pino authored
Mandatory modules are load without the need to be explicitly imported in the script file. By now the only required module is 'core'.
Stéphane Del Pino authoredMandatory modules are load without the need to be explicitly imported in the script file. By now the only required module is 'core'.
CoreModule.cpp 6.97 KiB
#include <language/modules/CoreModule.hpp>
#include <language/modules/CoreModule.hpp>
#include <language/modules/ModuleRepository.hpp>
#include <language/utils/ASTExecutionInfo.hpp>
#include <language/utils/AffectationProcessorBuilder.hpp>
#include <language/utils/AffectationRegisterForB.hpp>
#include <language/utils/AffectationRegisterForN.hpp>
#include <language/utils/AffectationRegisterForR.hpp>
#include <language/utils/AffectationRegisterForRn.hpp>
#include <language/utils/AffectationRegisterForRnxn.hpp>
#include <language/utils/AffectationRegisterForString.hpp>
#include <language/utils/AffectationRegisterForZ.hpp>
#include <language/utils/BinaryOperatorRegisterForB.hpp>
#include <language/utils/BinaryOperatorRegisterForN.hpp>
#include <language/utils/BinaryOperatorRegisterForR.hpp>
#include <language/utils/BinaryOperatorRegisterForRn.hpp>
#include <language/utils/BinaryOperatorRegisterForRnxn.hpp>
#include <language/utils/BinaryOperatorRegisterForString.hpp>
#include <language/utils/BinaryOperatorRegisterForZ.hpp>
#include <language/utils/BuiltinFunctionEmbedder.hpp>
#include <language/utils/Exit.hpp>
#include <language/utils/IncDecOperatorRegisterForN.hpp>
#include <language/utils/IncDecOperatorRegisterForZ.hpp>
#include <language/utils/OFStream.hpp>
#include <language/utils/OStream.hpp>
#include <language/utils/UnaryOperatorRegisterForB.hpp>
#include <language/utils/UnaryOperatorRegisterForN.hpp>
#include <language/utils/UnaryOperatorRegisterForR.hpp>
#include <language/utils/UnaryOperatorRegisterForRn.hpp>
#include <language/utils/UnaryOperatorRegisterForRnxn.hpp>
#include <language/utils/UnaryOperatorRegisterForZ.hpp>
#include <utils/Messenger.hpp>
#include <utils/PugsUtils.hpp>
#include <utils/RandomEngine.hpp>
#include <random>
CoreModule::CoreModule() : BuiltinModule(true)
{
this->_addBuiltinFunction("getPugsVersion", std::function(
[]() -> std::string { return pugsVersion(); }
));
this->_addBuiltinFunction("getPugsBuildInfo", std::function(
[]() -> std::string { return pugsBuildInfo(); }
));
this->_addBuiltinFunction("getAvailableModules", std::function(
[]() -> std::string {
const ModuleRepository& repository =
ASTExecutionInfo::current().moduleRepository();
return repository.getAvailableModules();
}
));
this->_addBuiltinFunction("getModuleInfo", std::function(
[](const std::string& module_name) -> std::string {
const ModuleRepository& repository =
ASTExecutionInfo::current().moduleRepository();
return repository.getModuleInfo(module_name);
}
));
this->_addBuiltinFunction("setRandomSeed", std::function(
[](const int64_t& random_seed) -> void {
RandomEngine::instance().setRandomSeed(random_seed);
}
));
this->_addBuiltinFunction("resetRandomSeed", std::function(
[]() -> void { RandomEngine::instance().resetRandomSeed(); }
));
this->_addTypeDescriptor(ast_node_data_type_from<std::shared_ptr<const OStream>>);
this->_addBuiltinFunction("ofstream", std::function(
[](const std::string& filename) -> std::shared_ptr<const OStream> {
return std::make_shared<const OFStream>(filename);
}
));
this->_addBuiltinFunction("exit", std::function(
[](const int64_t& exit_code) -> void {
const auto& location = ASTBacktrace::getInstance().sourceLocation();
std::cout << "\n** " << rang::fgB::yellow << "exit" << rang::fg::reset
<< " explicitly called with code " << rang::fgB::cyan << exit_code
<< rang::fg::reset << "\n from " << rang::style::underline
<< location.filename() << rang::style::reset << ':'
<< rang::fgB::yellow << location.line() << rang::fg::reset << '\n';
throw language::Exit(exit_code);
}
));
this->_addNameValue("cout", ast_node_data_type_from<std::shared_ptr<const OStream>>,
EmbeddedData{std::make_shared<DataHandler<const OStream>>(std::make_shared<OStream>(std::cout))});
this->_addNameValue("cerr", ast_node_data_type_from<std::shared_ptr<const OStream>>,
EmbeddedData{std::make_shared<DataHandler<const OStream>>(std::make_shared<OStream>(std::cerr))});
this->_addNameValue("clog", ast_node_data_type_from<std::shared_ptr<const OStream>>,
EmbeddedData{std::make_shared<DataHandler<const OStream>>(std::make_shared<OStream>(std::clog))});
}
void
CoreModule::registerOperators() const
{
AffectationRegisterForB{};
AffectationRegisterForN{};
AffectationRegisterForZ{};
AffectationRegisterForR{};
AffectationRegisterForRn<1>{};
AffectationRegisterForRn<2>{};
AffectationRegisterForRn<3>{};
AffectationRegisterForRnxn<1>{};
AffectationRegisterForRnxn<2>{};
AffectationRegisterForRnxn<3>{};
AffectationRegisterForString{};
BinaryOperatorRegisterForB{};
BinaryOperatorRegisterForN{};
BinaryOperatorRegisterForZ{};
BinaryOperatorRegisterForR{};
BinaryOperatorRegisterForRn<1>{};
BinaryOperatorRegisterForRn<2>{};
BinaryOperatorRegisterForRn<3>{};
BinaryOperatorRegisterForRnxn<1>{};
BinaryOperatorRegisterForRnxn<2>{};
BinaryOperatorRegisterForRnxn<3>{};
BinaryOperatorRegisterForString{};
IncDecOperatorRegisterForN{};
IncDecOperatorRegisterForZ{};
UnaryOperatorRegisterForB{};
UnaryOperatorRegisterForN{};
UnaryOperatorRegisterForZ{};
UnaryOperatorRegisterForR{};
UnaryOperatorRegisterForRn<1>{};
UnaryOperatorRegisterForRn<2>{};
UnaryOperatorRegisterForRn<3>{};
UnaryOperatorRegisterForRnxn<1>{};
UnaryOperatorRegisterForRnxn<2>{};
UnaryOperatorRegisterForRnxn<3>{};
}