Clingo
Loading...
Searching...
No Matches
visit_variables.hh
1#pragma once
2
3#include <clingo/input/statement.hh>
4
5#include <functional>
6
7namespace CppClingo::Input {
8
11
15enum class VariableContext : uint8_t {
16 global,
17 all,
18};
19
21using VarVisitFun = std::function<void(Location const &loc, String var)>;
22
24void visit_variables(Term const &term, VarVisitFun fun);
26void visit_variables(TheoryTerm const &term, VarVisitFun fun);
30void visit_variables(Lit const &lit, VarVisitFun fun);
32void visit_variables(CondLit const &lit, VarVisitFun fun);
47
49template <class T> [[nodiscard]] inline auto select_variables(T const &x, size_t size_hint = 0) -> VariableSet {
50 VariableSet vars;
51 if (size_hint > 0) {
52 vars.reserve(size_hint);
53 }
54 visit_variables(x, [&]([[maybe_unused]] Location const &loc, String const &var) { vars.emplace(var); });
55 return vars;
56}
57
59template <class T>
60[[nodiscard]] inline auto select_variables(T const &x, VariableContext context, size_t size_hint = 0) -> VariableSet {
61 VariableSet vars;
62 if (size_hint > 0) {
63 vars.reserve(size_hint);
64 }
65 visit_variables(x, [&]([[maybe_unused]] Location const &loc, String const &var) { vars.emplace(var); }, context);
66 return vars;
67}
68
70
71} // namespace CppClingo::Input
A body aggregate element.
Definition body_literal.hh:49
A conditional literal.
Definition literal.hh:135
An element of a head aggregate.
Definition head_literal.hh:58
An optimize element.
Definition statement.hh:254
An element of a set aggregate.
Definition aggregate.hh:46
An element of the theory atom.
Definition theory.hh:208
The Location of an expression in an input source.
Definition location.hh:44
Reference to a string stored in a symbol store.
Definition symbol.hh:18
std::variant< BdLitSimple, BdLitConjunction, BdLitAggregate, BdLitSetAggregate, BdLitTheoryAtom > BdLit
A body literal.
Definition body_literal.hh:116
std::variant< HdLitSimple, HdLitDisjunction, HdLitAggregate, HdLitSetAggregate, HdLitTheoryAtom > HdLit
A head literal.
Definition head_literal.hh:130
std::variant< LitBool, LitComparison, LitSymbolic > Lit
Variant holding the different literal types.
Definition literal.hh:129
std::variant< StmRule, StmTheory, StmOptimize, StmWeakConstraint, StmShow, StmShowNothing, StmShowSig, StmProject, StmProjectSig, StmDefined, StmExternal, StmEdge, StmHeuristic, StmScript, StmInclude, StmProgram, StmConst, StmParts, StmComment > Stm
Variant of available statements.
Definition statement.hh:828
std::variant< TermVariable, TermSymbol, TermTuple, TermFunction, TermAbs, TermUnary, TermBinary > Term
Variant holding the different term types.
Definition term.hh:45
StringSet VariableSet
A set of variable names.
Definition term.hh:23
std::variant< TheoryTermSymbol, TheoryTermVariable, TheoryTermTuple, TheoryTermFunction, TheoryTermUnparsed > TheoryTerm
A variant for the different theory terms.
Definition theory.hh:22
auto select_variables(T const &x, size_t size_hint=0) -> VariableSet
Get all variables in an expression.
Definition visit_variables.hh:49
VariableContext
Variable selection scopes.
Definition visit_variables.hh:15
std::function< void(Location const &loc, String var)> VarVisitFun
A function to visit variable occurrences.
Definition visit_variables.hh:21
void visit_variables(Term const &term, VarVisitFun fun)
Visit variables with the given function.
@ global
Visit variables occurring in global scope.
@ all
Visit all variable occurrences.