Skip to content
Snippets Groups Projects
Select Git revision
  • f25b9639bbe06abde2e9b00fb5ebd40786eb26bf
  • develop default protected
  • feature/advection
  • feature/composite-scheme-other-fluxes
  • origin/stage/bouguettaia
  • save_clemence
  • feature/local-dt-fsi
  • feature/variational-hydro
  • feature/gmsh-reader
  • feature/reconstruction
  • feature/kinetic-schemes
  • feature/composite-scheme-sources
  • feature/serraille
  • feature/composite-scheme
  • hyperplastic
  • feature/polynomials
  • feature/gks
  • feature/implicit-solver-o2
  • feature/coupling_module
  • feature/implicit-solver
  • feature/merge-local-dt-fsi
  • v0.5.0 protected
  • v0.4.1 protected
  • v0.4.0 protected
  • v0.3.0 protected
  • v0.2.0 protected
  • v0.1.0 protected
  • Kidder
  • v0.0.4 protected
  • v0.0.3 protected
  • v0.0.2 protected
  • v0 protected
  • v0.0.1 protected
33 results

NumberedZoneDescriptor.hpp

Blame
  • ASTNodeAffectationExpressionBuilder.cpp 2.40 KiB
    #include <language/ast/ASTNodeAffectationExpressionBuilder.hpp>
    
    #include <algebra/TinyVector.hpp>
    #include <language/PEGGrammar.hpp>
    #include <language/node_processor/INodeProcessor.hpp>
    #include <language/utils/ASTNodeNaturalConversionChecker.hpp>
    #include <language/utils/AffectationMangler.hpp>
    #include <language/utils/OperatorRepository.hpp>
    #include <language/utils/ParseError.hpp>
    #include <utils/Exceptions.hpp>
    
    ASTNodeAffectationExpressionBuilder::ASTNodeAffectationExpressionBuilder(ASTNode& node)
    {
      const ASTNodeDataType& target_data_type = node.children[0]->m_data_type;
      const ASTNodeDataType& source_data_type = node.children[1]->m_data_type;
    
      const std::string affectation_name = [&] {
        if (node.is_type<language::eq_op>()) {
          return affectationMangler<language::eq_op>(target_data_type, source_data_type);
        } else if (node.is_type<language::multiplyeq_op>()) {
          return affectationMangler<language::multiplyeq_op>(target_data_type, source_data_type);
        } else if (node.is_type<language::divideeq_op>()) {
          return affectationMangler<language::divideeq_op>(target_data_type, source_data_type);
        } else if (node.is_type<language::pluseq_op>()) {
          return affectationMangler<language::pluseq_op>(target_data_type, source_data_type);
        } else if (node.is_type<language::minuseq_op>()) {
          return affectationMangler<language::minuseq_op>(target_data_type, source_data_type);
        } else {
          throw ParseError("unexpected error: undefined affectation operator", std::vector{node.begin()});
        }
      }();
    
      const auto& optional_processor_builder =
        OperatorRepository::instance().getAffectationProcessorBuilder(affectation_name);
    
      if (optional_processor_builder.has_value()) {
        ASTNode& lhs_node = *node.children[0];
        ASTNode& rhs_node = *node.children[1];
    
        if (rhs_node.m_data_type == ASTNodeDataType::list_t) {
          if ((lhs_node.m_data_type == ASTNodeDataType::vector_t) or (lhs_node.m_data_type == ASTNodeDataType::matrix_t)) {
            ASTNodeNaturalConversionChecker(rhs_node, lhs_node.m_data_type);
          }
        }
    
        node.m_node_processor = optional_processor_builder.value()->getNodeProcessor(lhs_node, rhs_node);
      } else {
        std::ostringstream error_message;
        error_message << "undefined affectation type: ";
        error_message << rang::fgB::red << affectation_name << rang::fg::reset;
    
        throw ParseError(error_message.str(), std::vector{node.children[0]->begin()});
      }
    }