diff --git a/src/language/modules/CoreModule.cpp b/src/language/modules/CoreModule.cpp index 47e0183256413b7579165b26364dff68f0614a74..5b5753eb8b3952d6d9c08c34ccc843f4bece2dc9 100644 --- a/src/language/modules/CoreModule.cpp +++ b/src/language/modules/CoreModule.cpp @@ -32,6 +32,7 @@ #include <language/utils/UnaryOperatorRegisterForRnxn.hpp> #include <language/utils/UnaryOperatorRegisterForZ.hpp> #include <utils/Messenger.hpp> +#include <utils/PartitionerOptions.hpp> #include <utils/PugsUtils.hpp> #include <utils/RandomEngine.hpp> #include <utils/Stop.hpp> @@ -94,6 +95,27 @@ CoreModule::CoreModule() : BuiltinModule(true) )); + this->_addBuiltinFunction("setPartitionerLibrary", std::function( + + [](const std::string& library_name) -> void { + PartitionerOptions::default_options.library() = + getPartitionerEnumFromName<PartitionerLibrary>(library_name); + } + + )); + + this->_addBuiltinFunction("getPartitionerOptions", std::function( + + []() -> std::string { + std::ostringstream os; + os << rang::fgB::yellow << "Partitioner options" + << rang::style::reset << '\n'; + os << PartitionerOptions::default_options; + return os.str(); + } + + )); + this->_addTypeDescriptor(ast_node_data_type_from<std::shared_ptr<const OStream>>); this->_addBuiltinFunction("ofstream", std::function( diff --git a/src/utils/PartitionerOptions.hpp b/src/utils/PartitionerOptions.hpp index 8ce9263b02168f497ea29decfd304865dd8bdab3..e4157f7659cac94ef8b4c7cd02a54d289156d4a8 100644 --- a/src/utils/PartitionerOptions.hpp +++ b/src/utils/PartitionerOptions.hpp @@ -32,6 +32,20 @@ name(const PartitionerLibrary library) throw UnexpectedError("Linear system library name is not defined!"); } +template <typename PartitionerEnumType> +inline PartitionerEnumType +getPartitionerEnumFromName(const std::string& enum_name) +{ + using BaseT = std::underlying_type_t<PartitionerEnumType>; + for (BaseT enum_value = static_cast<BaseT>(PartitionerEnumType::PT__begin); + enum_value < static_cast<BaseT>(PartitionerEnumType::PT__end); ++enum_value) { + if (name(PartitionerEnumType{enum_value}) == enum_name) { + return PartitionerEnumType{enum_value}; + } + } + throw NormalError(std::string{"could not find '"} + enum_name + "' associate type!"); +} + class PartitionerOptions { private: