Select Git revision
ASTNodeDataTypeBuilder.cpp
FunctionArgumentConverter.hpp 2.15 KiB
#ifndef FUNCTION_ARGUMENT_CONVERTER_HPP
#define FUNCTION_ARGUMENT_CONVERTER_HPP
#include <language/node_processor/ExecutionPolicy.hpp>
#include <language/utils/DataVariant.hpp>
class IFunctionArgumentConverter
{
public:
virtual DataVariant convert(ExecutionPolicy& exec_policy, DataVariant&& value) = 0;
IFunctionArgumentConverter() = default;
IFunctionArgumentConverter(const IFunctionArgumentConverter&) = delete;
IFunctionArgumentConverter(IFunctionArgumentConverter&&) = delete;
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 if constexpr (std::is_same_v<ProvidedValueType, ZeroType>) {
exec_policy.currentContext()[m_argument_id] = ExpectedValueType{ZeroType::zero};
} 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} {}
};
class FunctionArgumentToFunctionSymbolIdConverter final : public IFunctionArgumentConverter
{
private:
size_t m_argument_id;
std::shared_ptr<SymbolTable> m_symbol_table;
public:
DataVariant
convert(ExecutionPolicy& exec_policy, DataVariant&& value)
{
exec_policy.currentContext()[m_argument_id] = FunctionSymbolId{std::get<uint64_t>(value), m_symbol_table};
return {};
}
FunctionArgumentToFunctionSymbolIdConverter(size_t argument_id, const std::shared_ptr<SymbolTable>& symbol_table)
: m_argument_id{argument_id}, m_symbol_table{symbol_table}
{}
};
#endif // FUNCTION_ARGUMENT_CONVERTER_HPP