souffle  2.0.2-371-g6315b36
Public Member Functions | Private Member Functions
souffle::ast::transform::NormaliseMultiResultFunctorsTransformer Class Reference

Uniquely names all appearances of ranges. More...

#include <NormaliseMultiResultFunctors.h>

Inheritance diagram for souffle::ast::transform::NormaliseMultiResultFunctorsTransformer:
Inheritance graph
Collaboration diagram for souffle::ast::transform::NormaliseMultiResultFunctorsTransformer:
Collaboration graph

Public Member Functions

std::string getName () const override
 
- Public Member Functions inherited from souffle::ast::transform::Transformer
bool apply (TranslationUnit &translationUnit)
 
virtual ~Transformer ()=default
 

Private Member Functions

NormaliseMultiResultFunctorsTransformerclone () const override
 
bool transform (TranslationUnit &translationUnit) override
 

Detailed Description

Uniquely names all appearances of ranges.

Definition at line 30 of file NormaliseMultiResultFunctors.h.

Member Function Documentation

◆ clone()

NormaliseMultiResultFunctorsTransformer* souffle::ast::transform::NormaliseMultiResultFunctorsTransformer::clone ( ) const
inlineoverrideprivatevirtual

◆ getName()

std::string souffle::ast::transform::NormaliseMultiResultFunctorsTransformer::getName ( ) const
inlineoverridevirtual

◆ transform()

bool souffle::ast::transform::NormaliseMultiResultFunctorsTransformer::transform ( TranslationUnit translationUnit)
overrideprivatevirtual

Implements souffle::ast::transform::Transformer.

Definition at line 34 of file NormaliseMultiResultFunctors.cpp.

34  {0};
35  mutable std::vector<std::pair<std::string, Own<IntrinsicFunctor>>> functorNames{};
36  name_functors() = default;
37 
38  std::vector<std::pair<std::string, Own<IntrinsicFunctor>>> getFunctorNames() {
39  return std::move(functorNames);
40  }
41 
42  Own<Node> operator()(Own<Node> node) const override {
43  node->apply(*this);
44  if (auto* inf = dynamic_cast<IntrinsicFunctor*>(node.get())) {
46  std::stringstream newName;
47  newName << "@multires_" << count++;
48  functorNames.push_back({newName.str(), Own<IntrinsicFunctor>(inf->clone())});
49  return mk<Variable>(newName.str());
50  }
51  }
52  return node;
53  }
54  };
55 
56  // Apply the mapper to each clause
57  for (auto* clause : program.getClauses()) {
58  name_functors update;
59  clause->apply(update);
60  for (auto& [name, func] : update.getFunctorNames()) {
61  changed = true;
62  clause->addToBody(
63  mk<BinaryConstraint>(BinaryConstraintOp::EQ, mk<Variable>(name), std::move(func)));
64  }
65  }
66  return changed;
67 }
68 
69 } // namespace souffle::ast::transform

The documentation for this class was generated from the following files:
souffle::ast::analysis::FunctorAnalysis::isMultiResult
static bool isMultiResult(const Functor &functor)
Definition: Functor.cpp:53
souffle::BinaryConstraintOp::EQ
@ EQ
souffle::test::count
int count(const C &c)
Definition: table_test.cpp:40