2
* Copyright Peter G. Jensen, all rights reserved.
6
* File: ContainsVisitor.h
7
* Author: Peter G. Jensen <root@petergjoel.dk>
9
* Created on April 21, 2020, 10:44 PM
12
#ifndef CONTAINSVISITOR_H
13
#define CONTAINSVISITOR_H
15
#include "PetriEngine/TAR/range.h"
16
#include "PetriEngine/PetriNet.h"
17
#include "PetriEngine/PQL/Expressions.h"
18
#include "PetriEngine/PQL/Visitor.h"
20
#include <type_traits>
24
using namespace Reachability;
28
class ContainsVisitor : public Visitor {
31
bool does_contain() const { return _value; }
37
bool found_type(K element)
39
if(std::is_same<const T*,K>::value)
44
virtual void _accept(const NotCondition* element) override
46
if(found_type(element)) return;
47
(*element)[0]->visit(*this);
49
virtual void _accept(const PetriEngine::PQL::AndCondition* element) override
51
if(found_type(element)) return;
52
for(auto& e : *element)
59
virtual void _accept(const OrCondition* element) override
61
if(found_type(element)) return;
62
for(auto& e : *element)
70
void handleCompare(const CompareCondition* element)
72
if(found_type(element)) return;
73
(*element)[0]->visit(*this);
75
(*element)[1]->visit(*this);
78
virtual void _accept(const LessThanCondition* element) override
80
handleCompare<decltype(element)>(element);
83
virtual void _accept(const LessThanOrEqualCondition* element) override
85
handleCompare<decltype(element)>(element);
88
virtual void _accept(const GreaterThanCondition* element) override
90
handleCompare<decltype(element)>(element);
93
virtual void _accept(const GreaterThanOrEqualCondition* element) override
95
handleCompare<decltype(element)>(element);
98
virtual void _accept(const NotEqualCondition* element) override
100
handleCompare<decltype(element)>(element);
103
virtual void _accept(const EqualCondition* element) override
105
handleCompare<decltype(element)>(element);
108
virtual void _accept(const IdentifierExpr* element) override
110
if(found_type(element)) return;
113
virtual void _accept(const LiteralExpr* element) override
115
if(found_type(element)) return;
118
virtual void _accept(const UnfoldedIdentifierExpr* element) override
120
if(found_type(element)) return;
124
void handleNaryExpr(K element)
126
if(found_type(element)) return;
127
for(auto& e : element->expressions())
134
virtual void _accept(const PlusExpr* element) override
136
handleNaryExpr<decltype(element)>(element);
139
virtual void _accept(const MultiplyExpr* element) override
141
handleNaryExpr<decltype(element)>(element);
144
virtual void _accept(const MinusExpr* element) override
146
if(found_type(element)) return;
147
(*element)[0]->visit(*this);
150
virtual void _accept(const SubtractExpr* element) override
152
handleNaryExpr<decltype(element)>(element);
155
virtual void _accept(const DeadlockCondition* element) override
157
if(found_type(element)) return;
160
virtual void _accept(const CompareConjunction* element) override
162
if(found_type(element)) return;
165
virtual void _accept(const UnfoldedUpperBoundsCondition* element) override
167
if(found_type(element)) return;
171
void handleSimpleQuantifierCondition(K element)
173
if(found_type(element)) return;
174
(*element)[0]->visit(*this);
177
virtual void _accept(const EFCondition* el)
178
{ handleSimpleQuantifierCondition(el); }
179
virtual void _accept(const EGCondition* el)
180
{ handleSimpleQuantifierCondition(el); }
181
virtual void _accept(const AGCondition* el)
182
{ handleSimpleQuantifierCondition(el); }
183
virtual void _accept(const AFCondition* el)
184
{ handleSimpleQuantifierCondition(el); }
185
virtual void _accept(const EXCondition* el)
186
{ handleSimpleQuantifierCondition(el); }
187
virtual void _accept(const AXCondition* el)
188
{ handleSimpleQuantifierCondition(el); }
190
virtual void _accept(const EUCondition* el)
192
if(found_type(el)) return;
193
(*el)[0]->visit(*this);
195
(*el)[1]->visit(*this);
198
virtual void _accept(const AUCondition* el)
200
if(found_type(el)) return;
201
(*el)[0]->visit(*this);
203
(*el)[1]->visit(*this);
206
// shallow elements, neither of these should exist in a compiled expression
207
virtual void _accept(const UnfoldedFireableCondition* element)
208
{ found_type(element); };
209
virtual void _accept(const FireableCondition* element)
210
{ found_type(element); };
211
virtual void _accept(const UpperBoundsCondition* element)
212
{ found_type(element); };
213
virtual void _accept(const LivenessCondition* element)
214
{ found_type(element); };
215
virtual void _accept(const KSafeCondition* element)
216
{ found_type(element); };
217
virtual void _accept(const QuasiLivenessCondition* element)
218
{ found_type(element); };
219
virtual void _accept(const StableMarkingCondition* element)
220
{ found_type(element); };
221
virtual void _accept(const BooleanCondition* element)
222
{ found_type(element); };
229
#endif /* CONTAINSVISITOR_H */