diff --git a/src/language/ASTNodeFunctionExpressionBuilder.cpp b/src/language/ASTNodeFunctionExpressionBuilder.cpp index 7da5559d832b2be47d272d620a261e99274f721b..156811f7847b3e7e1f737181e1844dcf64b7e719 100644 --- a/src/language/ASTNodeFunctionExpressionBuilder.cpp +++ b/src/language/ASTNodeFunctionExpressionBuilder.cpp @@ -10,24 +10,26 @@ template <typename SymbolType> std::unique_ptr<IFunctionArgumentConverter> -ASTNodeFunctionExpressionBuilder::_getArgumentProcessor(SymbolType& parameter_symbol, +ASTNodeFunctionExpressionBuilder::_getArgumentConverter(SymbolType& parameter_symbol, const ASTNodeSubDataType& node_sub_data_type) { - auto get_function_argument_processor_for = + const size_t parameter_id = std::get<size_t>(parameter_symbol.attributes().value()); + + auto get_function_argument_converter_for = [&](const auto& parameter_v) -> std::unique_ptr<IFunctionArgumentConverter> { using ParameterT = std::decay_t<decltype(parameter_v)>; switch (node_sub_data_type.m_data_type) { case ASTNodeDataType::bool_t: { - return std::make_unique<FunctionArgumentConverter<ParameterT, bool>>(parameter_symbol); + return std::make_unique<FunctionArgumentConverter<ParameterT, bool>>(parameter_id); } case ASTNodeDataType::unsigned_int_t: { - return std::make_unique<FunctionArgumentConverter<ParameterT, uint64_t>>(parameter_symbol); + return std::make_unique<FunctionArgumentConverter<ParameterT, uint64_t>>(parameter_id); } case ASTNodeDataType::int_t: { - return std::make_unique<FunctionArgumentConverter<ParameterT, int64_t>>(parameter_symbol); + return std::make_unique<FunctionArgumentConverter<ParameterT, int64_t>>(parameter_id); } case ASTNodeDataType::double_t: { - return std::make_unique<FunctionArgumentConverter<ParameterT, double>>(parameter_symbol); + return std::make_unique<FunctionArgumentConverter<ParameterT, double>>(parameter_id); } // LCOV_EXCL_START default: { @@ -37,22 +39,22 @@ ASTNodeFunctionExpressionBuilder::_getArgumentProcessor(SymbolType& parameter_sy } }; - auto get_function_argument_processor_for_string = [&]() -> std::unique_ptr<IFunctionArgumentConverter> { + auto get_function_argument_converter_for_string = [&]() -> std::unique_ptr<IFunctionArgumentConverter> { switch (node_sub_data_type.m_data_type) { case ASTNodeDataType::bool_t: { - return std::make_unique<FunctionArgumentConverter<std::string, bool>>(parameter_symbol); + return std::make_unique<FunctionArgumentConverter<std::string, bool>>(parameter_id); } case ASTNodeDataType::unsigned_int_t: { - return std::make_unique<FunctionArgumentConverter<std::string, uint64_t>>(parameter_symbol); + return std::make_unique<FunctionArgumentConverter<std::string, uint64_t>>(parameter_id); } case ASTNodeDataType::int_t: { - return std::make_unique<FunctionArgumentConverter<std::string, int64_t>>(parameter_symbol); + return std::make_unique<FunctionArgumentConverter<std::string, int64_t>>(parameter_id); } case ASTNodeDataType::double_t: { - return std::make_unique<FunctionArgumentConverter<std::string, double>>(parameter_symbol); + return std::make_unique<FunctionArgumentConverter<std::string, double>>(parameter_id); } case ASTNodeDataType::string_t: { - return std::make_unique<FunctionArgumentConverter<std::string, std::string>>(parameter_symbol); + return std::make_unique<FunctionArgumentConverter<std::string, std::string>>(parameter_id); } // LCOV_EXCL_START default: { @@ -62,22 +64,22 @@ ASTNodeFunctionExpressionBuilder::_getArgumentProcessor(SymbolType& parameter_sy } }; - auto get_function_argument_processor_for_parameter_type = [&]() { + auto get_function_argument_converter_for_parameter_type = [&]() { switch (parameter_symbol.attributes().dataType()) { case ASTNodeDataType::bool_t: { - return get_function_argument_processor_for(bool{}); + return get_function_argument_converter_for(bool{}); } case ASTNodeDataType::unsigned_int_t: { - return get_function_argument_processor_for(uint64_t{}); + return get_function_argument_converter_for(uint64_t{}); } case ASTNodeDataType::int_t: { - return get_function_argument_processor_for(int64_t{}); + return get_function_argument_converter_for(int64_t{}); } case ASTNodeDataType::double_t: { - return get_function_argument_processor_for(double{}); + return get_function_argument_converter_for(double{}); } case ASTNodeDataType::string_t: { - return get_function_argument_processor_for_string(); + return get_function_argument_converter_for_string(); } // LCOV_EXCL_START @@ -88,11 +90,11 @@ ASTNodeFunctionExpressionBuilder::_getArgumentProcessor(SymbolType& parameter_sy } }; - return get_function_argument_processor_for_parameter_type(); + return get_function_argument_converter_for_parameter_type(); } void -ASTNodeFunctionExpressionBuilder::_storeArgumentProcessor(ASTNode& parameter_variable, +ASTNodeFunctionExpressionBuilder::_storeArgumentConverter(ASTNode& parameter_variable, ASTNodeSubDataType& node_sub_data_type, FunctionProcessor& function_processor) { @@ -102,11 +104,11 @@ ASTNodeFunctionExpressionBuilder::_storeArgumentProcessor(ASTNode& parameter_var parameter_variable.m_symbol_table->find(parameter_variable.string(), parameter_variable.begin()); Assert(found); - function_processor.addArgumentProcessor(this->_getArgumentProcessor(*i_parameter_symbol, node_sub_data_type)); + function_processor.addArgumentConverter(this->_getArgumentConverter(*i_parameter_symbol, node_sub_data_type)); } std::unique_ptr<FunctionProcessor> -ASTNodeFunctionExpressionBuilder::_buildArgumentProcessors(FunctionDescriptor& function_descriptor, ASTNode& node) +ASTNodeFunctionExpressionBuilder::_buildArgumentConverter(FunctionDescriptor& function_descriptor, ASTNode& node) { ASTNode& function_expression = *function_descriptor.definitionNode().children[1]; @@ -138,10 +140,10 @@ ASTNodeFunctionExpressionBuilder::_buildArgumentProcessors(FunctionDescriptor& f if (arguments_number > 1) { for (size_t i = 0; i < arguments_number; ++i) { ASTNode& parameter_variable = *parameter_variables.children[i]; - this->_storeArgumentProcessor(parameter_variable, flattened_datatype_list[i], *function_processor); + this->_storeArgumentConverter(parameter_variable, flattened_datatype_list[i], *function_processor); } } else { - this->_storeArgumentProcessor(parameter_variables, flattened_datatype_list[0], *function_processor); + this->_storeArgumentConverter(parameter_variables, flattened_datatype_list[0], *function_processor); } return function_processor; @@ -222,7 +224,7 @@ ASTNodeFunctionExpressionBuilder::ASTNodeFunctionExpressionBuilder(ASTNode& node FunctionDescriptor& function_descriptor = node.m_symbol_table->functionTable()[function_id]; - std::unique_ptr function_processor = this->_buildArgumentProcessors(function_descriptor, node); + std::unique_ptr function_processor = this->_buildArgumentConverter(function_descriptor, node); auto add_component_expression = [&](ASTNode& expression_node, ASTNode& domain_node) { ASTNodeDataType expression_value_type = expression_node.m_data_type; diff --git a/src/language/ASTNodeFunctionExpressionBuilder.hpp b/src/language/ASTNodeFunctionExpressionBuilder.hpp index 8db494b2a4ebc6beb849b9671f0f3775d18f8752..54c3297c6e368d8824bb5e84f0ab5d805a1b24c8 100644 --- a/src/language/ASTNodeFunctionExpressionBuilder.hpp +++ b/src/language/ASTNodeFunctionExpressionBuilder.hpp @@ -16,14 +16,14 @@ class ASTNodeFunctionExpressionBuilder ASTNode& m_node; template <typename SymbolType> - std::unique_ptr<IFunctionArgumentConverter> _getArgumentProcessor(SymbolType& parameter_symbol, + std::unique_ptr<IFunctionArgumentConverter> _getArgumentConverter(SymbolType& parameter_symbol, const ASTNodeSubDataType& node_sub_data_type); - void _storeArgumentProcessor(ASTNode& parameter_variable, + void _storeArgumentConverter(ASTNode& parameter_variable, ASTNodeSubDataType& node_sub_data_type, FunctionProcessor& function_processor); - std::unique_ptr<FunctionProcessor> _buildArgumentProcessors(FunctionDescriptor& function_descriptor, ASTNode& node); + std::unique_ptr<FunctionProcessor> _buildArgumentConverter(FunctionDescriptor& function_descriptor, ASTNode& node); std::unique_ptr<INodeProcessor> _getFunctionProcessor(const ASTNodeDataType expression_value_type, const ASTNodeDataType return_value_type, diff --git a/src/language/node_processor/FunctionArgumentConverter.hpp b/src/language/node_processor/FunctionArgumentConverter.hpp new file mode 100644 index 0000000000000000000000000000000000000000..48455d0bd7f9e9ae429ab0546f109637a25d1887 --- /dev/null +++ b/src/language/node_processor/FunctionArgumentConverter.hpp @@ -0,0 +1,39 @@ +#ifndef FUNCTION_ARGUMENT_CONVERTER_HPP +#define FUNCTION_ARGUMENT_CONVERTER_HPP + +#include <DataVariant.hpp> +#include <node_processor/ExecutionPolicy.hpp> + +class IFunctionArgumentConverter +{ + public: + virtual DataVariant convert(ExecutionPolicy& exec_policy, DataVariant&& value) = 0; + + virtual ~IFunctionArgumentConverter() = default; +}; + +template <typename ExpectedValueType, typename ProvidedValueType> +class FunctionArgumentConverter final : public IFunctionArgumentConverter +{ + private: + size_t m_argument_id; + + public: + DataVariant + convert(ExecutionPolicy& exec_policy, DataVariant&& value) + { + if constexpr (std::is_same_v<ExpectedValueType, ProvidedValueType>) { + exec_policy.currentContext()[m_argument_id] = std::move(value); + } else if constexpr (std::is_same_v<ExpectedValueType, std::string>) { + exec_policy.currentContext()[m_argument_id] = std::move(std::to_string(std::get<ProvidedValueType>(value))); + } else { + exec_policy.currentContext()[m_argument_id] = + std::move(static_cast<ExpectedValueType>(std::get<ProvidedValueType>(value))); + } + return {}; + } + + FunctionArgumentConverter(size_t argument_id) : m_argument_id{argument_id} {} +}; + +#endif // FUNCTION_ARGUMENT_CONVERTER_HPP diff --git a/src/language/node_processor/FunctionProcessor.hpp b/src/language/node_processor/FunctionProcessor.hpp index be95d2affcd106307762c68f4cecf1ecc49d3ea4..2a8db08f29fa7ad061c46c7c1b7679a53138ea2b 100644 --- a/src/language/node_processor/FunctionProcessor.hpp +++ b/src/language/node_processor/FunctionProcessor.hpp @@ -10,39 +10,7 @@ #include <node_processor/ASTNodeExpressionListProcessor.hpp> -class IFunctionArgumentConverter -{ - public: - virtual DataVariant convert(ExecutionPolicy& exec_policy, DataVariant&& value) = 0; - - virtual ~IFunctionArgumentConverter() = default; -}; - -template <typename ExpectedValueType, typename ProvidedValueType> -class FunctionArgumentConverter final : public IFunctionArgumentConverter -{ - private: - size_t m_symbol_id; - - public: - DataVariant - convert(ExecutionPolicy& exec_policy, DataVariant&& value) - { - if constexpr (std::is_same_v<ExpectedValueType, ProvidedValueType>) { - exec_policy.currentContext()[m_symbol_id] = std::move(value); - } else if constexpr (std::is_same_v<ExpectedValueType, std::string>) { - exec_policy.currentContext()[m_symbol_id] = std::move(std::to_string(std::get<ProvidedValueType>(value))); - } else { - exec_policy.currentContext()[m_symbol_id] = - std::move(static_cast<ExpectedValueType>(std::get<ProvidedValueType>(value))); - } - return {}; - } - - FunctionArgumentConverter(SymbolTable::Symbol& argument_symbol) - : m_symbol_id{std::get<size_t>(argument_symbol.attributes().value())} - {} -}; +#include <node_processor/FunctionArgumentConverter.hpp> template <typename ReturnType, typename ExpressionValueType> class FunctionExpressionProcessor final : public INodeProcessor @@ -81,7 +49,7 @@ class FunctionProcessor : public INodeProcessor public: void - addArgumentProcessor(std::unique_ptr<IFunctionArgumentConverter>&& argument_converter) + addArgumentConverter(std::unique_ptr<IFunctionArgumentConverter>&& argument_converter) { m_argument_converters.emplace_back(std::move(argument_converter)); }