diff --git a/src/language/ast/ASTNodeDataTypeBuilder.cpp b/src/language/ast/ASTNodeDataTypeBuilder.cpp index 0f8f1d287b88435c904c00557e7fc0dc729dcb56..54697f4a0b3aa0cd6b18f6cdac970e7ffd69e67d 100644 --- a/src/language/ast/ASTNodeDataTypeBuilder.cpp +++ b/src/language/ast/ASTNodeDataTypeBuilder.cpp @@ -615,6 +615,6 @@ ASTNodeDataTypeBuilder::ASTNodeDataTypeBuilder(ASTNode& node) this->_buildNodeDataTypes(node); if (ConsoleManager::showPreamble()) { - std::cout << " - build node data types\n"; + std::cout << " - built node data types\n"; } } diff --git a/src/language/node_processor/AffectationProcessor.hpp b/src/language/node_processor/AffectationProcessor.hpp index f4c0d731a7a11ab91ffe7cb005bf14ebb5525dcf..b06a96ac54f055f12b5afb626d7740a89d07b485 100644 --- a/src/language/node_processor/AffectationProcessor.hpp +++ b/src/language/node_processor/AffectationProcessor.hpp @@ -549,6 +549,58 @@ class AffectationToTupleProcessor final : public AffectationToDataVariantProcess {} }; +template <typename ValueT> +class AffectationFromTupleProcessor final : public AffectationToDataVariantProcessorBase +{ + private: + ASTNode& m_lhs_node; + ASTNode& m_rhs_node; + + public: + DataVariant + execute(ExecutionPolicy& exec_policy) + { + DataVariant value = m_rhs_node.execute(exec_policy); + + std::visit( + [&](auto&& v) { + using T = std::decay_t<decltype(v)>; + if constexpr (is_std_vector_v<T>) { + using TupleContentType = std::decay_t<typename T::value_type>; + if (v.size() == 1) { + std::cout << "TUPLE [" << demangle<TupleContentType>() << "] -> " << demangle<ValueT>() << '\n'; + if constexpr (std::is_same_v<TupleContentType, ValueT>) { + *m_lhs = v[0]; + } else if constexpr (std::is_arithmetic_v<ValueT> and std::is_convertible_v<TupleContentType, ValueT>) { +#warning treat the case (Z) -> N (check sign) + *m_lhs = static_cast<ValueT>(v[0]); + } else { +#warning missing cases + throw NotImplementedError("remaining cases?"); + } + } else { + std::ostringstream error_msg; + error_msg << "cannot affect a " << rang::fgB::yellow << dataTypeName(m_rhs_node.m_data_type) + << rang::fg::reset << " of size " << v.size() << " to a " << rang::fgB::yellow + << dataTypeName(m_lhs_node.m_data_type) << rang::fg::reset; + throw ParseError(error_msg.str(), m_rhs_node.begin()); + } + } else { + // LCOV_EXCL_START + throw UnexpectedError("right hand side must be a tuple"); + // LCOV_EXCL_STOP + } + }, + value); + + return {}; + } + + AffectationFromTupleProcessor(ASTNode& lhs_node, ASTNode& rhs_node) + : AffectationToDataVariantProcessorBase(lhs_node), m_lhs_node(lhs_node), m_rhs_node{rhs_node} + {} +}; + template <typename ValueT> class AffectationToTupleFromListProcessor final : public AffectationToDataVariantProcessorBase { @@ -627,15 +679,57 @@ class AffectationToTupleFromListProcessor final : public AffectationToDataVarian *m_lhs = std::move(tuple_value); } + public: + DataVariant + execute(ExecutionPolicy& exec_policy) + { + try { + std::visit( + [&](auto&& value_list) { + using ValueListT = std::decay_t<decltype(value_list)>; + if constexpr (std::is_same_v<AggregateDataVariant, ValueListT>) { + this->_copyAggregateDataVariant(value_list); + } else { + // LCOV_EXCL_START + throw UnexpectedError("invalid rhs (expecting list)"); + // LCOV_EXCL_STOP + } + }, + m_rhs_node.execute(exec_policy)); + } + catch (std::domain_error& e) { + throw ParseError(e.what(), m_rhs_node.begin()); + } + return {}; + } + + AffectationToTupleFromListProcessor(ASTNode& lhs_node, ASTNode& rhs_node) + : AffectationToDataVariantProcessorBase(lhs_node), m_rhs_node{rhs_node} + {} +}; + +template <typename ValueT> +class AffectationToTupleFromTupleProcessor final : public AffectationToDataVariantProcessorBase +{ + private: + ASTNode& m_rhs_node; + + template <typename T> + std::string + stringify(const T& value) + { + std::ostringstream os; + os << std::boolalpha << value; + return os.str(); + } + template <typename DataType> void _copyVector(const std::vector<DataType>& values) { std::vector<ValueT> v(values.size()); if constexpr (std::is_same_v<ValueT, DataType>) { - for (size_t i = 0; i < values.size(); ++i) { - v[i] = values[i]; - } + v = std::move(values); } else if constexpr (std::is_arithmetic_v<ValueT> and std::is_convertible_v<DataType, ValueT>) { for (size_t i = 0; i < values.size(); ++i) { const DataType& vi = values[i]; @@ -646,6 +740,14 @@ class AffectationToTupleFromListProcessor final : public AffectationToDataVarian } v[i] = static_cast<DataType>(vi); } + } else if constexpr (std::is_same_v<TinyVector<1>, ValueT> and std::is_arithmetic_v<DataType>) { + for (size_t i = 0; i < values.size(); ++i) { + v[i][0] = values[i]; + } + } else if constexpr (std::is_same_v<TinyMatrix<1>, ValueT> and std::is_arithmetic_v<DataType>) { + for (size_t i = 0; i < values.size(); ++i) { + v[i](0, 0) = values[i]; + } } else if constexpr (std::is_same_v<ValueT, std::string>) { for (size_t i = 0; i < values.size(); ++i) { v[i] = std::move(stringify(values[i])); @@ -667,13 +769,11 @@ class AffectationToTupleFromListProcessor final : public AffectationToDataVarian std::visit( [&](auto&& value_list) { using ValueListT = std::decay_t<decltype(value_list)>; - if constexpr (std::is_same_v<AggregateDataVariant, ValueListT>) { - this->_copyAggregateDataVariant(value_list); - } else if constexpr (is_std_vector_v<ValueListT>) { + if constexpr (is_std_vector_v<ValueListT>) { this->_copyVector(value_list); } else { // LCOV_EXCL_START - throw UnexpectedError("invalid lhs (expecting list or tuple)"); + throw UnexpectedError("invalid rhs (expecting tuple)"); // LCOV_EXCL_STOP } }, @@ -685,7 +785,7 @@ class AffectationToTupleFromListProcessor final : public AffectationToDataVarian return {}; } - AffectationToTupleFromListProcessor(ASTNode& lhs_node, ASTNode& rhs_node) + AffectationToTupleFromTupleProcessor(ASTNode& lhs_node, ASTNode& rhs_node) : AffectationToDataVariantProcessorBase(lhs_node), m_rhs_node{rhs_node} {} }; diff --git a/src/language/utils/AffectationMangler.hpp b/src/language/utils/AffectationMangler.hpp index 85aaab35bfbabde5b9bdbc9b250f8440e68829e6..42592a091d1e1792f99d3d76e5af0d167732aeba 100644 --- a/src/language/utils/AffectationMangler.hpp +++ b/src/language/utils/AffectationMangler.hpp @@ -40,8 +40,6 @@ affectationMangler(const ASTNodeDataType& lhs, const ASTNodeDataType& rhs) const std::string rhs_name = [&]() -> std::string { if (rhs == ASTNodeDataType::list_t) { return "list"; - } else if (rhs == ASTNodeDataType::tuple_t) { - return "tuple"; } else { return dataTypeName(rhs); } diff --git a/src/language/utils/AffectationProcessorBuilder.hpp b/src/language/utils/AffectationProcessorBuilder.hpp index cc66971b2ccfbcc4a9a16ae708121c7905a1478b..6b5ff55841863b9e93afd8a12498bf306e4d51f4 100644 --- a/src/language/utils/AffectationProcessorBuilder.hpp +++ b/src/language/utils/AffectationProcessorBuilder.hpp @@ -44,6 +44,18 @@ class AffectationToTupleProcessorBuilder final : public IAffectationProcessorBui } }; +template <typename ValueT> +class AffectationFromTupleProcessorBuilder final : public IAffectationProcessorBuilder +{ + public: + AffectationFromTupleProcessorBuilder() = default; + std::unique_ptr<INodeProcessor> + getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final + { + return std::make_unique<AffectationFromTupleProcessor<ValueT>>(lhs_node, rhs_node); + } +}; + template <typename ValueT> class AffectationToTupleFromListProcessorBuilder final : public IAffectationProcessorBuilder { @@ -57,6 +69,19 @@ class AffectationToTupleFromListProcessorBuilder final : public IAffectationProc } }; +template <typename ValueT> +class AffectationToTupleFromTupleProcessorBuilder final : public IAffectationProcessorBuilder +{ + public: + AffectationToTupleFromTupleProcessorBuilder() = default; + std::unique_ptr<INodeProcessor> + getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final + { + ASTNodeNaturalConversionChecker<AllowRToR1Conversion>(rhs_node, lhs_node.m_data_type); + return std::make_unique<AffectationToTupleFromTupleProcessor<ValueT>>(lhs_node, rhs_node); + } +}; + template <typename OperatorT, typename ValueT> class AffectationFromZeroProcessorBuilder final : public IAffectationProcessorBuilder { diff --git a/src/language/utils/AffectationRegisterForN.cpp b/src/language/utils/AffectationRegisterForN.cpp index 64f93ad0f74da6490b636c3643de62bcf7afc0fc..ecb982c23359c716aaf7e799cfa13288e03bdd9a 100644 --- a/src/language/utils/AffectationRegisterForN.cpp +++ b/src/language/utils/AffectationRegisterForN.cpp @@ -9,23 +9,30 @@ AffectationRegisterForN::_register_eq_op() { OperatorRepository& repository = OperatorRepository::instance(); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); repository - .addAffectation<language::eq_op>(N, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + .addAffectation<language::eq_op>(N, B, std::make_shared<AffectationProcessorBuilder<language::eq_op, uint64_t, bool>>()); repository.addAffectation< - language::eq_op>(N, ASTNodeDataType::build<ASTNodeDataType::int_t>(), - std::make_shared<AffectationProcessorBuilder<language::eq_op, uint64_t, int64_t>>()); + language::eq_op>(N, Z, std::make_shared<AffectationProcessorBuilder<language::eq_op, uint64_t, int64_t>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), - ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), B, std::make_shared<AffectationToTupleProcessorBuilder<uint64_t>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), - ASTNodeDataType::build<ASTNodeDataType::int_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), Z, std::make_shared<AffectationToTupleProcessorBuilder<uint64_t>>()); + + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(B), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<uint64_t>>()); + + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<uint64_t>>()); } void @@ -33,19 +40,19 @@ AffectationRegisterForN::_register_pluseq_op() { OperatorRepository& repository = OperatorRepository::instance(); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); repository.addAffectation< - language::pluseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), - std::make_shared<AffectationProcessorBuilder<language::pluseq_op, uint64_t, bool>>()); + language::pluseq_op>(N, B, std::make_shared<AffectationProcessorBuilder<language::pluseq_op, uint64_t, bool>>()); repository.addAffectation< - language::pluseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + language::pluseq_op>(N, N, std::make_shared<AffectationProcessorBuilder<language::pluseq_op, uint64_t, uint64_t>>()); repository.addAffectation< - language::pluseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::int_t>(), - std::make_shared<AffectationProcessorBuilder<language::pluseq_op, uint64_t, int64_t>>()); + language::pluseq_op>(N, Z, std::make_shared<AffectationProcessorBuilder<language::pluseq_op, uint64_t, int64_t>>()); } void @@ -53,18 +60,19 @@ AffectationRegisterForN::_register_minuseq_op() { OperatorRepository& repository = OperatorRepository::instance(); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); repository.addAffectation< - language::minuseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), - std::make_shared<AffectationProcessorBuilder<language::minuseq_op, uint64_t, bool>>()); + language::minuseq_op>(N, B, std::make_shared<AffectationProcessorBuilder<language::minuseq_op, uint64_t, bool>>()); repository.addAffectation< - language::minuseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + language::minuseq_op>(N, N, std::make_shared<AffectationProcessorBuilder<language::minuseq_op, uint64_t, uint64_t>>()); repository.addAffectation< - language::minuseq_op>(N, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + language::minuseq_op>(N, Z, std::make_shared<AffectationProcessorBuilder<language::minuseq_op, uint64_t, int64_t>>()); } @@ -73,17 +81,19 @@ AffectationRegisterForN::_register_multiplyeq_op() { OperatorRepository& repository = OperatorRepository::instance(); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); repository.addAffectation< - language::multiplyeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + language::multiplyeq_op>(N, B, std::make_shared<AffectationProcessorBuilder<language::multiplyeq_op, uint64_t, bool>>()); - repository.addAffectation<language::multiplyeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + repository.addAffectation<language::multiplyeq_op>(N, N, std::make_shared<AffectationProcessorBuilder< language::multiplyeq_op, uint64_t, uint64_t>>()); - repository.addAffectation<language::multiplyeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + repository.addAffectation<language::multiplyeq_op>(N, Z, std::make_shared<AffectationProcessorBuilder< language::multiplyeq_op, uint64_t, int64_t>>()); } @@ -94,13 +104,14 @@ AffectationRegisterForN::_register_divideeq_op() OperatorRepository& repository = OperatorRepository::instance(); auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); repository.addAffectation< - language::divideeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + language::divideeq_op>(N, N, std::make_shared<AffectationProcessorBuilder<language::divideeq_op, uint64_t, uint64_t>>()); repository.addAffectation< - language::divideeq_op>(N, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + language::divideeq_op>(N, Z, std::make_shared<AffectationProcessorBuilder<language::divideeq_op, uint64_t, int64_t>>()); } diff --git a/src/language/utils/AffectationRegisterForR.cpp b/src/language/utils/AffectationRegisterForR.cpp index 7959b35b3d2119a8b6930cc6d4beb7d61f115da8..f7c5d3efa7867f18bbdad15552317b086ba695d9 100644 --- a/src/language/utils/AffectationRegisterForR.cpp +++ b/src/language/utils/AffectationRegisterForR.cpp @@ -9,31 +9,42 @@ AffectationRegisterForR::_register_eq_op() { OperatorRepository& repository = OperatorRepository::instance(); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); + auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>(); repository - .addAffectation<language::eq_op>(R, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + .addAffectation<language::eq_op>(R, B, std::make_shared<AffectationProcessorBuilder<language::eq_op, double, bool>>()); repository.addAffectation< - language::eq_op>(R, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), - std::make_shared<AffectationProcessorBuilder<language::eq_op, double, uint64_t>>()); + language::eq_op>(R, N, std::make_shared<AffectationProcessorBuilder<language::eq_op, double, uint64_t>>()); repository - .addAffectation<language::eq_op>(R, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + .addAffectation<language::eq_op>(R, Z, std::make_shared<AffectationProcessorBuilder<language::eq_op, double, int64_t>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), - ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), B, std::make_shared<AffectationToTupleProcessorBuilder<double>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), - ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), N, std::make_shared<AffectationToTupleProcessorBuilder<double>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), - ASTNodeDataType::build<ASTNodeDataType::int_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), Z, std::make_shared<AffectationToTupleProcessorBuilder<double>>()); + + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(B), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<double>>()); + + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<double>>()); + + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<double>>()); } void diff --git a/src/language/utils/AffectationRegisterForRn.cpp b/src/language/utils/AffectationRegisterForRn.cpp index 180bd5ebce8d19dd8aa6f4b628a700632ea44ab0..5ab23dba39b1c6192c67d8fa705692fb2d0e2f87 100644 --- a/src/language/utils/AffectationRegisterForRn.cpp +++ b/src/language/utils/AffectationRegisterForRn.cpp @@ -11,14 +11,14 @@ AffectationRegisterForRn<Dimension>::_register_eq_op() OperatorRepository& repository = OperatorRepository::instance(); auto Rn = ASTNodeDataType::build<ASTNodeDataType::vector_t>(Dimension); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); repository.addAffectation< - language::eq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + language::eq_op>(Rn, Z, std::make_shared<AffectationFromZeroProcessorBuilder<language::eq_op, TinyVector<Dimension>>>()); repository - .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn), - ASTNodeDataType::build<ASTNodeDataType::int_t>(), + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn), Z, std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<Dimension>>>()); } @@ -30,43 +30,64 @@ AffectationRegisterForRn<1>::_register_eq_op() OperatorRepository& repository = OperatorRepository::instance(); - auto Rn = ASTNodeDataType::build<ASTNodeDataType::vector_t>(Dimension); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); + auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); + auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>(); + + auto R1 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(Dimension); repository.addAffectation< - language::eq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + language::eq_op>(R1, B, std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<Dimension>, bool>>()); repository.addAffectation< - language::eq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + language::eq_op>(R1, N, std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<Dimension>, uint64_t>>()); repository.addAffectation< - language::eq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + language::eq_op>(R1, Z, std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<Dimension>, int64_t>>()); repository.addAffectation< - language::eq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::double_t>(), + language::eq_op>(R1, R, std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyVector<Dimension>, double>>()); repository - .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn), - ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1), B, std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<Dimension>>>()); repository - .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn), - ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1), N, std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<Dimension>>>()); repository - .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn), - ASTNodeDataType::build<ASTNodeDataType::int_t>(), + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1), Z, std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<Dimension>>>()); repository - .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rn), - ASTNodeDataType::build<ASTNodeDataType::double_t>(), + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1), R, std::make_shared<AffectationToTupleProcessorBuilder<TinyVector<Dimension>>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(B), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<TinyVector<1>>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<TinyVector<1>>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<TinyVector<1>>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<TinyVector<1>>>()); } template <size_t Dimension> @@ -105,19 +126,24 @@ AffectationRegisterForRn<Dimension>::_register_multiplyeq_op() auto Rn = ASTNodeDataType::build<ASTNodeDataType::vector_t>(Dimension); - repository.addAffectation<language::multiplyeq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); + auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); + auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>(); + + repository.addAffectation<language::multiplyeq_op>(Rn, B, std::make_shared<AffectationProcessorBuilder< language::multiplyeq_op, TinyVector<Dimension>, bool>>()); - repository.addAffectation<language::multiplyeq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + repository.addAffectation<language::multiplyeq_op>(Rn, N, std::make_shared<AffectationProcessorBuilder< language::multiplyeq_op, TinyVector<Dimension>, uint64_t>>()); - repository.addAffectation<language::multiplyeq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + repository.addAffectation<language::multiplyeq_op>(Rn, Z, std::make_shared<AffectationProcessorBuilder< language::multiplyeq_op, TinyVector<Dimension>, int64_t>>()); - repository.addAffectation<language::multiplyeq_op>(Rn, ASTNodeDataType::build<ASTNodeDataType::double_t>(), + repository.addAffectation<language::multiplyeq_op>(Rn, R, std::make_shared<AffectationProcessorBuilder< language::multiplyeq_op, TinyVector<Dimension>, double>>()); } diff --git a/src/language/utils/AffectationRegisterForRnxn.cpp b/src/language/utils/AffectationRegisterForRnxn.cpp index 0eaf1c6af2e0caccf0fa143208c774a047d6e550..2ca3f7f6eee10147c5211164aae2d91fb36872d8 100644 --- a/src/language/utils/AffectationRegisterForRnxn.cpp +++ b/src/language/utils/AffectationRegisterForRnxn.cpp @@ -10,15 +10,16 @@ AffectationRegisterForRnxn<Dimension>::_register_eq_op() { OperatorRepository& repository = OperatorRepository::instance(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); + auto Rnxn = ASTNodeDataType::build<ASTNodeDataType::matrix_t>(Dimension, Dimension); repository.addAffectation< - language::eq_op>(Rnxn, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + language::eq_op>(Rnxn, Z, std::make_shared<AffectationFromZeroProcessorBuilder<language::eq_op, TinyMatrix<Dimension>>>()); repository - .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rnxn), - ASTNodeDataType::build<ASTNodeDataType::int_t>(), + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rnxn), Z, std::make_shared<AffectationToTupleProcessorBuilder<TinyMatrix<Dimension>>>()); } @@ -30,43 +31,64 @@ AffectationRegisterForRnxn<1>::_register_eq_op() OperatorRepository& repository = OperatorRepository::instance(); - auto Rnxn = ASTNodeDataType::build<ASTNodeDataType::matrix_t>(Dimension, Dimension); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); + auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); + auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>(); + + auto R1x1 = ASTNodeDataType::build<ASTNodeDataType::matrix_t>(Dimension, Dimension); repository.addAffectation< - language::eq_op>(Rnxn, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + language::eq_op>(R1x1, B, std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyMatrix<Dimension>, bool>>()); repository.addAffectation< - language::eq_op>(Rnxn, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + language::eq_op>(R1x1, N, std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyMatrix<Dimension>, uint64_t>>()); repository.addAffectation< - language::eq_op>(Rnxn, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + language::eq_op>(R1x1, Z, std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyMatrix<Dimension>, int64_t>>()); repository.addAffectation< - language::eq_op>(Rnxn, ASTNodeDataType::build<ASTNodeDataType::double_t>(), + language::eq_op>(R1x1, R, std::make_shared<AffectationProcessorBuilder<language::eq_op, TinyMatrix<Dimension>, double>>()); repository - .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rnxn), - ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1x1), B, std::make_shared<AffectationToTupleProcessorBuilder<TinyMatrix<Dimension>>>()); repository - .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rnxn), - ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1x1), N, std::make_shared<AffectationToTupleProcessorBuilder<TinyMatrix<Dimension>>>()); repository - .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rnxn), - ASTNodeDataType::build<ASTNodeDataType::int_t>(), + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1x1), Z, std::make_shared<AffectationToTupleProcessorBuilder<TinyMatrix<Dimension>>>()); repository - .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Rnxn), - ASTNodeDataType::build<ASTNodeDataType::double_t>(), + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1x1), R, std::make_shared<AffectationToTupleProcessorBuilder<TinyMatrix<Dimension>>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1x1), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(B), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<TinyMatrix<1>>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1x1), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<TinyMatrix<1>>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1x1), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<TinyMatrix<1>>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1x1), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<TinyMatrix<1>>>()); } template <size_t Dimension> @@ -103,21 +125,26 @@ AffectationRegisterForRnxn<Dimension>::_register_multiplyeq_op() { OperatorRepository& repository = OperatorRepository::instance(); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); + auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); + auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>(); + auto Rnxn = ASTNodeDataType::build<ASTNodeDataType::matrix_t>(Dimension, Dimension); - repository.addAffectation<language::multiplyeq_op>(Rnxn, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + repository.addAffectation<language::multiplyeq_op>(Rnxn, B, std::make_shared<AffectationProcessorBuilder< language::multiplyeq_op, TinyMatrix<Dimension>, bool>>()); - repository.addAffectation<language::multiplyeq_op>(Rnxn, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + repository.addAffectation<language::multiplyeq_op>(Rnxn, N, std::make_shared<AffectationProcessorBuilder< language::multiplyeq_op, TinyMatrix<Dimension>, uint64_t>>()); - repository.addAffectation<language::multiplyeq_op>(Rnxn, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + repository.addAffectation<language::multiplyeq_op>(Rnxn, Z, std::make_shared<AffectationProcessorBuilder< language::multiplyeq_op, TinyMatrix<Dimension>, int64_t>>()); - repository.addAffectation<language::multiplyeq_op>(Rnxn, ASTNodeDataType::build<ASTNodeDataType::double_t>(), + repository.addAffectation<language::multiplyeq_op>(Rnxn, R, std::make_shared<AffectationProcessorBuilder< language::multiplyeq_op, TinyMatrix<Dimension>, double>>()); } diff --git a/src/language/utils/AffectationRegisterForString.cpp b/src/language/utils/AffectationRegisterForString.cpp index 7946aeb45fc72e7569e5d8299e184c220baa7106..44f8a561ef3fdbec225adc59acc126908e4628ec 100644 --- a/src/language/utils/AffectationRegisterForString.cpp +++ b/src/language/utils/AffectationRegisterForString.cpp @@ -9,87 +9,136 @@ AffectationRegisterForString::_register_eq_op() { OperatorRepository& repository = OperatorRepository::instance(); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); + auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); + auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>(); + auto R1 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(1); + auto R2 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(2); + auto R3 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(3); + auto R1x1 = ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1); + auto R2x2 = ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2); + auto R3x3 = ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3); + auto string_t = ASTNodeDataType::build<ASTNodeDataType::string_t>(); repository.addAffectation< - language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), - std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, bool>>()); + language::eq_op>(string_t, B, std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, bool>>()); repository.addAffectation< - language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + language::eq_op>(string_t, N, std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, uint64_t>>()); repository.addAffectation< - language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + language::eq_op>(string_t, Z, std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, int64_t>>()); repository.addAffectation< - language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::double_t>(), + language::eq_op>(string_t, R, std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, double_t>>()); repository.addAffectation< - language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), + language::eq_op>(string_t, R1, std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, TinyVector<1>>>()); repository.addAffectation< - language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(2), + language::eq_op>(string_t, R2, std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, TinyVector<2>>>()); repository.addAffectation< - language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(3), + language::eq_op>(string_t, R3, std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, TinyVector<3>>>()); repository.addAffectation< - language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1), + language::eq_op>(string_t, R1x1, std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, TinyMatrix<1>>>()); repository.addAffectation< - language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2), + language::eq_op>(string_t, R2x2, std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, TinyMatrix<2>>>()); repository.addAffectation< - language::eq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3), + language::eq_op>(string_t, R3x3, std::make_shared<AffectationProcessorBuilder<language::eq_op, std::string, TinyMatrix<3>>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), - ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), B, std::make_shared<AffectationToTupleProcessorBuilder<std::string>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), - ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), N, std::make_shared<AffectationToTupleProcessorBuilder<std::string>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), - ASTNodeDataType::build<ASTNodeDataType::int_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), Z, std::make_shared<AffectationToTupleProcessorBuilder<std::string>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), - ASTNodeDataType::build<ASTNodeDataType::double_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), R, std::make_shared<AffectationToTupleProcessorBuilder<std::string>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), - ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), R1, std::make_shared<AffectationToTupleProcessorBuilder<std::string>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), - ASTNodeDataType::build<ASTNodeDataType::vector_t>(2), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), R2, std::make_shared<AffectationToTupleProcessorBuilder<std::string>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), - ASTNodeDataType::build<ASTNodeDataType::vector_t>(3), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), R3, std::make_shared<AffectationToTupleProcessorBuilder<std::string>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), - ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), R1x1, std::make_shared<AffectationToTupleProcessorBuilder<std::string>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), - ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), R2x2, std::make_shared<AffectationToTupleProcessorBuilder<std::string>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), - ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), R3x3, std::make_shared<AffectationToTupleProcessorBuilder<std::string>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(B), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<std::string>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<std::string>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<std::string>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<std::string>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<std::string>>()); + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R2), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<std::string>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R3), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<std::string>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R1x1), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<std::string>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R2x2), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<std::string>>()); + + repository + .addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(string_t), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(R3x3), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<std::string>>()); } void @@ -97,6 +146,17 @@ AffectationRegisterForString::_register_pluseq_op() { OperatorRepository& repository = OperatorRepository::instance(); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); + auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); + auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); + auto R = ASTNodeDataType::build<ASTNodeDataType::double_t>(); + auto R1 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(1); + auto R2 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(2); + auto R3 = ASTNodeDataType::build<ASTNodeDataType::vector_t>(3); + auto R1x1 = ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1); + auto R2x2 = ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2); + auto R3x3 = ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3); + auto string_t = ASTNodeDataType::build<ASTNodeDataType::string_t>(); repository.addAffectation<language::pluseq_op>(string_t, string_t, @@ -104,42 +164,42 @@ AffectationRegisterForString::_register_pluseq_op() language::pluseq_op, std::string, std::string>>()); repository.addAffectation< - language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + language::pluseq_op>(string_t, B, std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, bool>>()); repository.addAffectation< - language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + language::pluseq_op>(string_t, N, std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, uint64_t>>()); repository.addAffectation< - language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::int_t>(), + language::pluseq_op>(string_t, Z, std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, int64_t>>()); repository.addAffectation< - language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::double_t>(), + language::pluseq_op>(string_t, R, std::make_shared<AffectationProcessorBuilder<language::pluseq_op, std::string, double>>()); - repository.addAffectation<language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(1), + repository.addAffectation<language::pluseq_op>(string_t, R1, std::make_shared<AffectationProcessorBuilder< language::pluseq_op, std::string, TinyVector<1>>>()); - repository.addAffectation<language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(2), + repository.addAffectation<language::pluseq_op>(string_t, R2, std::make_shared<AffectationProcessorBuilder< language::pluseq_op, std::string, TinyVector<2>>>()); - repository.addAffectation<language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::vector_t>(3), + repository.addAffectation<language::pluseq_op>(string_t, R3, std::make_shared<AffectationProcessorBuilder< language::pluseq_op, std::string, TinyVector<3>>>()); - repository.addAffectation<language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(1, 1), + repository.addAffectation<language::pluseq_op>(string_t, R1x1, std::make_shared<AffectationProcessorBuilder< language::pluseq_op, std::string, TinyMatrix<1>>>()); - repository.addAffectation<language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(2, 2), + repository.addAffectation<language::pluseq_op>(string_t, R2x2, std::make_shared<AffectationProcessorBuilder< language::pluseq_op, std::string, TinyMatrix<2>>>()); - repository.addAffectation<language::pluseq_op>(string_t, ASTNodeDataType::build<ASTNodeDataType::matrix_t>(3, 3), + repository.addAffectation<language::pluseq_op>(string_t, R3x3, std::make_shared<AffectationProcessorBuilder< language::pluseq_op, std::string, TinyMatrix<3>>>()); } diff --git a/src/language/utils/AffectationRegisterForZ.cpp b/src/language/utils/AffectationRegisterForZ.cpp index 09c493e711cf96b913607da732da7dd9ef937bc5..553a0e83cb72ec1b29c733746c8d5048b117e5fb 100644 --- a/src/language/utils/AffectationRegisterForZ.cpp +++ b/src/language/utils/AffectationRegisterForZ.cpp @@ -9,23 +9,30 @@ AffectationRegisterForZ::_register_eq_op() { OperatorRepository& repository = OperatorRepository::instance(); + auto B = ASTNodeDataType::build<ASTNodeDataType::bool_t>(); + auto N = ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(); auto Z = ASTNodeDataType::build<ASTNodeDataType::int_t>(); repository - .addAffectation<language::eq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + .addAffectation<language::eq_op>(Z, B, std::make_shared<AffectationProcessorBuilder<language::eq_op, int64_t, bool>>()); repository.addAffectation< - language::eq_op>(Z, ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), - std::make_shared<AffectationProcessorBuilder<language::eq_op, int64_t, uint64_t>>()); + language::eq_op>(Z, N, std::make_shared<AffectationProcessorBuilder<language::eq_op, int64_t, uint64_t>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), - ASTNodeDataType::build<ASTNodeDataType::bool_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), B, std::make_shared<AffectationToTupleProcessorBuilder<int64_t>>()); - repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), - ASTNodeDataType::build<ASTNodeDataType::unsigned_int_t>(), + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), N, std::make_shared<AffectationToTupleProcessorBuilder<int64_t>>()); + + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(B), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<int64_t>>()); + + repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(Z), + ASTNodeDataType::build<ASTNodeDataType::tuple_t>(N), + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<int64_t>>()); } void diff --git a/src/language/utils/BasicAffectationRegistrerFor.hpp b/src/language/utils/BasicAffectationRegistrerFor.hpp index ccae4c32b596b39ce7b663da38e31e70c8dfbebc..06f905ca239750964cea9945206484d52a2da05f 100644 --- a/src/language/utils/BasicAffectationRegistrerFor.hpp +++ b/src/language/utils/BasicAffectationRegistrerFor.hpp @@ -29,7 +29,7 @@ class BasicAffectationRegisterFor repository.addAffectation<language::eq_op>(ASTNodeDataType::build<ASTNodeDataType::tuple_t>(ast_node_data_type), ASTNodeDataType::build<ASTNodeDataType::tuple_t>(ast_node_data_type), - std::make_shared<AffectationToTupleFromListProcessorBuilder<T>>()); + std::make_shared<AffectationToTupleFromTupleProcessorBuilder<T>>()); } }; diff --git a/tests/test_AffectationToTupleProcessor.cpp b/tests/test_AffectationToTupleProcessor.cpp index 1ecaf971ffa09028c6baf59093c1517326c0dc14..434162ac1bc7a2e9a2e496547b76f3b359475ea0 100644 --- a/tests/test_AffectationToTupleProcessor.cpp +++ b/tests/test_AffectationToTupleProcessor.cpp @@ -206,35 +206,279 @@ let t :(R^1x1); t = (x,2); SECTION("Affectations from tuple") { - CHECK_AFFECTATION_RESULT(R"( -let x :(R^3), x = [1,2,3]; -let s :(string); s = x; + SECTION(" -> (B)") + { + CHECK_AFFECTATION_RESULT(R"( +let a:(B), a = (true, false, true); +let b:(B), b = a; )", - "s", (std::vector<std::string>{stringify(TinyVector<3, double>{1, 2, 3})})); + "b", (std::vector<bool>{true, false, true})); + } - CHECK_AFFECTATION_RESULT(R"( -let A :(R^3x3), A = ([[1,2,3],[4,5,6],[7,8,9]]); -let s :(string); s = A; + SECTION(" -> (N)") + { + CHECK_AFFECTATION_RESULT(R"( +let a:(B), a = (true, false, true); +let b:(N), b = a; )", - "s", (std::vector<std::string>{stringify(TinyMatrix<3>{1, 2, 3, 4, 5, 6, 7, 8, 9})})); + "b", (std::vector<uint64_t>{true, false, true})); - CHECK_AFFECTATION_RESULT(R"( -let x :(R), x = (1,2,3); -let s :(string); s = x; + CHECK_AFFECTATION_RESULT(R"( +let a:(N), a = (1, 2, 3); +let b:(N), b = a; )", - "s", (std::vector<std::string>{stringify(1.), stringify(2.), stringify(3.)})); + "b", (std::vector<uint64_t>{1, 2, 3})); - CHECK_AFFECTATION_RESULT(R"( -let n :(N), n = (1,2,3); -let t :(R); t = n; + CHECK_AFFECTATION_RESULT(R"( +let a:(Z), a = (5, 6, 2); +let b:(N), b = a; +)", + "b", (std::vector<uint64_t>{5, 6, 2})); + } + + SECTION(" -> (Z)") + { + CHECK_AFFECTATION_RESULT(R"( +let a:(B), a = (true, false, true); +let b:(Z), b = a; )", - "t", (std::vector<double>{1, 2, 3})); + "b", (std::vector<int64_t>{true, false, true})); - CHECK_AFFECTATION_RESULT(R"( -let s :(N), s = (1,2,3); -let t :(N); t = s; + CHECK_AFFECTATION_RESULT(R"( +let a:(N), a = (1, 2, 3); +let b:(Z), b = a; +)", + "b", (std::vector<int64_t>{1, 2, 3})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(Z), a = (5, -6, 2); +let b:(Z), b = a; +)", + "b", (std::vector<int64_t>{5, -6, 2})); + } + + SECTION(" -> (R)") + { + CHECK_AFFECTATION_RESULT(R"( +let a:(B), a = (true, false, true); +let b:(R), b = a; +)", + "b", (std::vector<double>{true, false, true})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(N), a = (1, 2, 3); +let b:(R), b = a; )", - "t", (std::vector<uint64_t>{1, 2, 3})); + "b", (std::vector<double>{1, 2, 3})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(Z), a = (5, -6, 2); +let b:(R), b = a; +)", + "b", (std::vector<double>{5, -6, 2})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(R), a = (5.2, -6.3, 2.1); +let b:(R), b = a; +)", + "b", (std::vector<double>{5.2, -6.3, 2.1})); + } + + SECTION(" -> (R^1)") + { + using R1 = TinyVector<1>; + CHECK_AFFECTATION_RESULT(R"( +let a:(B), a = (true, false, true); +let b:(R^1), b = a; +)", + "b", (std::vector<R1>{R1{true}, R1{false}, R1{true}})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(N), a = (1, 2, 3); +let b:(R^1), b = a; +)", + "b", (std::vector<R1>{R1{1}, R1{2}, R1{3}})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(Z), a = (5, -6, 2); +let b:(R^1), b = a; +)", + "b", (std::vector<R1>{R1{5}, R1{-6}, R1{2}})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(R), a = (5.2, -6.3, 2.1); +let b:(R^1), b = a; +)", + "b", (std::vector<R1>{R1{5.2}, R1{-6.3}, R1{2.1}})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(R^1), a = (5.2, -6.3, 2.1); +let b:(R^1), b = a; +)", + "b", (std::vector<R1>{R1{5.2}, R1{-6.3}, R1{2.1}})); + } + + SECTION(" -> (R^2)") + { + using R2 = TinyVector<2>; + CHECK_AFFECTATION_RESULT(R"( +let a:(R^2), a = ([5.2, -6.3], [2.1, 0]); +let b:(R^2), b = a; +)", + "b", (std::vector<R2>{R2{5.2, -6.3}, R2{2.1, 0}})); + } + + SECTION(" -> (R^3)") + { + using R3 = TinyVector<3>; + CHECK_AFFECTATION_RESULT(R"( +let a:(R^3), a = ([5.2, -6.3, 2], [2.1, 0, -1.1]); +let b:(R^3), b = a; +)", + "b", (std::vector<R3>{R3{5.2, -6.3, 2}, R3{2.1, 0, -1.1}})); + } + + SECTION(" -> (R^1x1)") + { + using R1x1 = TinyMatrix<1>; + CHECK_AFFECTATION_RESULT(R"( +let a:(B), a = (true, false, true); +let b:(R^1x1), b = a; +)", + "b", (std::vector<R1x1>{R1x1{true}, R1x1{false}, R1x1{true}})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(N), a = (1, 2, 3); +let b:(R^1x1), b = a; +)", + "b", (std::vector<R1x1>{R1x1{1}, R1x1{2}, R1x1{3}})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(Z), a = (5, -6, 2); +let b:(R^1x1), b = a; +)", + "b", (std::vector<R1x1>{R1x1{5}, R1x1{-6}, R1x1{2}})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(R), a = (5.2, -6.3, 2.1); +let b:(R^1x1), b = a; +)", + "b", (std::vector<R1x1>{R1x1{5.2}, R1x1{-6.3}, R1x1{2.1}})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(R^1x1), a = (5.2, -6.3, 2.1); +let b:(R^1x1), b = a; +)", + "b", (std::vector<R1x1>{R1x1{5.2}, R1x1{-6.3}, R1x1{2.1}})); + } + + SECTION(" -> (R^2x2)") + { + using R2x2 = TinyMatrix<2>; + CHECK_AFFECTATION_RESULT(R"( +let a:(R^2x2), a = ([[5.2, -6.3], [2.1, 0]], 0); +let b:(R^2x2), b = a; +)", + "b", (std::vector<R2x2>{R2x2{5.2, -6.3, 2.1, 0}, R2x2{zero}})); + } + + SECTION(" -> (R^3x3)") + { + using R3x3 = TinyMatrix<3>; + CHECK_AFFECTATION_RESULT(R"( +let a:(R^3x3), a = ([[5.2, -6.3, 2], [2.1, 0, -1.1], [1,-1.2,-0.7]] , 0); +let b:(R^3x3), b = a; +)", + "b", (std::vector<R3x3>{R3x3{5.2, -6.3, 2, 2.1, 0, -1.1, 1, -1.2, -0.7}, R3x3{zero}})); + } + + SECTION(" -> (string)") + { + CHECK_AFFECTATION_RESULT(R"( +let a:(B), a = (true, false, true); +let b:(string), b = a; +)", + "b", (std::vector<std::string>{stringify(true), stringify(false), stringify(true)})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(N), a = (1, 2, 3); +let b:(string), b = a; +)", + "b", (std::vector<std::string>{stringify(1ul), stringify(2ul), stringify(3ul)})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(Z), a = (5, -6, 2); +let b:(string), b = a; +)", + "b", (std::vector<std::string>{stringify(5l), stringify(-6l), stringify(2l)})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(R), a = (5.2, -6.3, 2.1); +let b:(string), b = a; +)", + "b", + (std::vector<std::string>{stringify(double{5.2}), stringify(double{-6.3}), + stringify(double{2.1})})); + + using R1 = TinyVector<1>; + CHECK_AFFECTATION_RESULT(R"( +let a:(R^1), a = ([5.2], [-6.3], [2.1]); +let b:(string), b = a; +)", + "b", + (std::vector<std::string>{stringify(R1{5.2}), stringify(R1{-6.3}), stringify(R1{2.1})})); + + using R2 = TinyVector<2>; + CHECK_AFFECTATION_RESULT(R"( +let a:(R^2), a = ([5.2, 1.2], [-6.3, 4], [2.1, -1]); +let b:(string), b = a; +)", + "b", + (std::vector<std::string>{stringify(R2{5.2, 1.2}), stringify(R2{-6.3, 4}), + stringify(R2{2.1, -1})})); + + using R3 = TinyVector<3>; + CHECK_AFFECTATION_RESULT(R"( +let a:(R^3), a = ([5.2, 1.2, 2.1], [-6.3, 4, 0], [2.1, -1, 3]); +let b:(string), b = a; +)", + "b", + (std::vector<std::string>{stringify(R3{5.2, 1.2, 2.1}), stringify(R3{-6.3, 4, 0}), + stringify(R3{2.1, -1, 3})})); + + using R1x1 = TinyMatrix<1>; + CHECK_AFFECTATION_RESULT(R"( +let a:(R^1x1), a = ([[5.2]], [[-6.3]], [[2.1]]); +let b:(string), b = a; +)", + "b", + (std::vector<std::string>{stringify(R1x1{5.2}), stringify(R1x1{-6.3}), + stringify(R1x1{2.1})})); + + using R2x2 = TinyMatrix<2>; + CHECK_AFFECTATION_RESULT(R"( +let a:(R^2x2), a = ([[5.2, 1.2], [-6.3, 4]], [[2.1, -1],[1,3]], 0); +let b:(string), b = a; +)", + "b", + (std::vector<std::string>{stringify(R2x2{5.2, 1.2, -6.3, 4}), + stringify(R2x2{2.1, -1, 1, 3}), stringify(R2x2{zero})})); + + using R3x3 = TinyMatrix<3>; + CHECK_AFFECTATION_RESULT(R"( +let a:(R^3x3), a = ([[5.2, 1.2, 2.1], [-6.3, 4, 0], [2.1, -1, 3]], 0); +let b:(string), b = a; +)", + "b", + (std::vector<std::string>{stringify(R3x3{5.2, 1.2, 2.1, -6.3, 4, 0, 2.1, -1, 3}), + stringify(R3x3{zero})})); + + CHECK_AFFECTATION_RESULT(R"( +let a:(string), a = ("foo", "bar", "foobar"); +let b:(string), b = a; +)", + "b", (std::vector<std::string>{"foo", "bar", "foobar"})); + } } SECTION("errors")