Skip to content
Snippets Groups Projects
Select Git revision
  • 1520b375fdf727f7ccdb19878bfc1b62d6603d48
  • develop default protected
  • feature/variational-hydro
  • origin/stage/bouguettaia
  • feature/gmsh-reader
  • feature/reconstruction
  • save_clemence
  • feature/kinetic-schemes
  • feature/local-dt-fsi
  • feature/composite-scheme-sources
  • feature/composite-scheme-other-fluxes
  • 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
  • master protected
  • 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

MeshData.hpp

Blame
  • AffectationProcessorBuilder.hpp 3.62 KiB
    #ifndef AFFECTATION_PROCESSOR_BUILDER_HPP
    #define AFFECTATION_PROCESSOR_BUILDER_HPP
    
    #include <algebra/TinyVector.hpp>
    #include <language/PEGGrammar.hpp>
    #include <language/node_processor/AffectationProcessor.hpp>
    #include <language/utils/ASTNodeNaturalConversionChecker.hpp>
    #include <language/utils/IAffectationProcessorBuilder.hpp>
    
    #include <type_traits>
    
    template <typename OperatorT, typename ValueT, typename DataT>
    class AffectationProcessorBuilder final : public IAffectationProcessorBuilder
    {
     public:
      AffectationProcessorBuilder() = default;
      std::unique_ptr<INodeProcessor>
      getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final
      {
        if constexpr ((std::is_same_v<ValueT, TinyVector<1>> or
                       std::is_same_v<ValueT, TinyMatrix<1>>)and std::is_same_v<DataT, int64_t> and
                      std::is_same_v<OperatorT, language::eq_op>) {
          // Special treatment for the case 0 -> R^1 or 0 -> R^1x1
          if ((rhs_node.is_type<language::integer>()) and (std::stoi(rhs_node.string()) == 0)) {
            return std::make_unique<AffectationFromZeroProcessor<ValueT>>(lhs_node);
          } else {
            return std::make_unique<AffectationProcessor<OperatorT, ValueT, DataT>>(lhs_node, rhs_node);
          }
        } else {
          return std::make_unique<AffectationProcessor<OperatorT, ValueT, DataT>>(lhs_node, rhs_node);
        }
      }
    };
    
    template <typename ValueT>
    class AffectationToTupleProcessorBuilder final : public IAffectationProcessorBuilder
    {
     public:
      AffectationToTupleProcessorBuilder() = default;
      std::unique_ptr<INodeProcessor>
      getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final
      {
        return std::make_unique<AffectationToTupleProcessor<ValueT>>(lhs_node, rhs_node);
      }
    };
    
    template <typename ValueT>
    class AffectationToTupleFromListProcessorBuilder final : public IAffectationProcessorBuilder
    {
     public:
      AffectationToTupleFromListProcessorBuilder() = default;
      std::unique_ptr<INodeProcessor>
      getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final
      {
        ASTNodeNaturalConversionChecker(rhs_node, lhs_node.m_data_type);
        return std::make_unique<AffectationToTupleFromListProcessor<ValueT>>(lhs_node, rhs_node);
      }
    };
    
    template <typename OperatorT, typename ValueT>
    class AffectationToTinyVectorFromListProcessorBuilder final : public IAffectationProcessorBuilder
    {
     public:
      AffectationToTinyVectorFromListProcessorBuilder() = default;
      std::unique_ptr<INodeProcessor>
      getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final
      {
        return std::make_unique<AffectationToTinyVectorFromListProcessor<OperatorT, ValueT>>(lhs_node, rhs_node);
      }
    };
    
    template <typename OperatorT, typename ValueT>
    class AffectationToTinyMatrixFromListProcessorBuilder final : public IAffectationProcessorBuilder
    {
     public:
      AffectationToTinyMatrixFromListProcessorBuilder() = default;
      std::unique_ptr<INodeProcessor>
      getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final
      {
        return std::make_unique<AffectationToTinyMatrixFromListProcessor<OperatorT, ValueT>>(lhs_node, rhs_node);
      }
    };
    
    template <typename OperatorT, typename ValueT>
    class AffectationFromZeroProcessorBuilder final : public IAffectationProcessorBuilder
    {
     public:
      AffectationFromZeroProcessorBuilder() = default;
      std::unique_ptr<INodeProcessor>
      getNodeProcessor(ASTNode& lhs_node, ASTNode& rhs_node) const final
      {
        if (std::stoi(rhs_node.string()) == 0) {
          return std::make_unique<AffectationFromZeroProcessor<ValueT>>(lhs_node);
        } else {
          throw ParseError("invalid integral value (0 is the solely valid value)", std::vector{lhs_node.begin()});
        }
      }
    };
    
    #endif   // AFFECTATION_PROCESSOR_BUILDER_HPP