FreeTensor
Loading...
Searching...
No Matches
selector.h
Go to the documentation of this file.
1#ifndef FREE_TENSOR_SELECTOR_H
2#define FREE_TENSOR_SELECTOR_H
3
4#include <string>
5#include <unordered_map>
6
7#include <ast.h>
8#include <stmt.h>
9
10namespace freetensor {
11
12class Selector {
13 std::unordered_map<Stmt, bool> cache_;
14
15 protected:
16 virtual bool matchImpl(const Stmt &stmt) = 0;
17
18 public:
19 virtual ~Selector() {}
20
21 bool match(const Stmt &stmt) {
22 if (auto it = cache_.find(stmt); it != cache_.end()) {
23 return it->second;
24 }
25 return cache_[stmt] = matchImpl(stmt);
26 }
27};
28
29class NotSelector : public Selector {
30 Ref<Selector> sub_;
31
32 protected:
33 bool matchImpl(const Stmt &stmt) override;
34
35 public:
36 NotSelector(const Ref<Selector> &sub) : sub_(sub) {}
37};
38
39class BothSelector : public Selector {
40 Ref<Selector> lhs_, rhs_;
41
42 protected:
43 bool matchImpl(const Stmt &stmt) override;
44
45 public:
47 : lhs_(lhs), rhs_(rhs) {}
48};
49
50class EitherSelector : public Selector {
51 Ref<Selector> lhs_, rhs_;
52
53 protected:
54 bool matchImpl(const Stmt &stmt) override;
55
56 public:
58 : lhs_(lhs), rhs_(rhs) {}
59};
60
61class NodeTypeSelector : public Selector {
62 ASTNodeType nodeType_;
63
64 protected:
65 bool matchImpl(const Stmt &stmt) override;
66
67 public:
68 NodeTypeSelector(const ASTNodeType &nodeType) : nodeType_(nodeType) {}
69};
70
71class ChildSelector : public Selector {
72 Ref<Selector> parent_;
73
74 protected:
75 bool matchImpl(const Stmt &stmt) override;
76
77 public:
78 ChildSelector(const Ref<Selector> &parent) : parent_(parent) {}
79};
80
82 Ref<Selector> ancestor_, middle_;
83
84 protected:
85 bool matchImpl(const Stmt &stmt) override;
86
87 public:
89 const Ref<Selector> &middle = nullptr)
90 : ancestor_(ancestor), middle_(middle) {}
91};
92
93class ParentSelector : public Selector {
94 Ref<Selector> child_;
95
96 protected:
97 bool matchImpl(const Stmt &stmt) override;
98
99 public:
100 ParentSelector(const Ref<Selector> &child) : child_(child) {}
101};
102
104 Ref<Selector> descendant_, middle_;
105
106 protected:
107 bool matchImpl(const Stmt &stmt) override;
108
109 public:
111 const Ref<Selector> &middle = nullptr)
112 : descendant_(descendant), middle_(middle) {}
113};
114
116 Ref<Selector> following_;
117
118 protected:
119 bool matchImpl(const Stmt &stmt) override;
120
121 public:
123 : following_(following) {}
124};
125
126class BeforeSelector : public Selector {
127 Ref<Selector> following_, middle_;
128
129 protected:
130 bool matchImpl(const Stmt &stmt) override;
131
132 public:
134 const Ref<Selector> &middle = nullptr)
135 : following_(following), middle_(middle) {}
136};
137
139 Ref<Selector> leading_;
140
141 protected:
142 bool matchImpl(const Stmt &stmt) override;
143
144 public:
145 DirectAfterSelector(const Ref<Selector> &leading) : leading_(leading) {}
146};
147
148class AfterSelector : public Selector {
149 Ref<Selector> leading_, middle_;
150
151 protected:
152 bool matchImpl(const Stmt &stmt) override;
153
154 public:
156 const Ref<Selector> &middle = nullptr)
157 : leading_(leading), middle_(middle) {}
158};
159
161 protected:
162 bool matchImpl(const Stmt &stmt) override;
163};
164
166 protected:
167 bool matchImpl(const Stmt &stmt) override;
168};
169
171 protected:
172 virtual bool matchImpl(const Metadata &md) = 0;
173 virtual bool matchImpl(const Stmt &stmt) override {
174 return stmt->metadata().isValid() && match(stmt->metadata());
175 }
176
177 public:
178 bool match(const Metadata &md) {
179 // TODO: Memoize the result
180 return matchImpl(md);
181 }
182};
183
186
187 protected:
188 bool matchImpl(const Metadata &md) override;
189
190 public:
192};
193
195 Ref<MetadataSelector> lhs_, rhs_;
196
197 protected:
198 bool matchImpl(const Metadata &md) override;
199
200 public:
203 : lhs_(lhs), rhs_(rhs) {}
204};
205
207 Ref<MetadataSelector> lhs_, rhs_;
208
209 protected:
210 bool matchImpl(const Metadata &md) override;
211
212 public:
215 : lhs_(lhs), rhs_(rhs) {}
216};
217
219 ID id_;
220
221 protected:
222 bool matchImpl(const Metadata &md) override;
223 bool matchImpl(const Stmt &stmt) override;
224
225 public:
226 IDSelector(const ID &id) : id_(id) {}
227};
228
230 std::string label_;
231
232 protected:
233 bool matchImpl(const Metadata &md) override;
234
235 public:
236 LabelSelector(const std::string &label) : label_(label) {}
237};
238
240 std::string op_;
241 std::vector<Ref<MetadataSelector>> sources_;
242
243 protected:
244 bool matchImpl(const Metadata &md) override;
245
246 public:
247 TransformedSelector(const std::string &op,
248 const std::vector<Ref<MetadataSelector>> sources)
249 : op_(op), sources_(sources) {}
250};
251
253 Ref<MetadataSelector> caller_;
254
255 protected:
256 bool matchImpl(const Metadata &md) override;
257
258 public:
260 : caller_(caller) {}
261};
262
264 Ref<MetadataSelector> caller_, middle_;
265
266 protected:
267 bool matchImpl(const Metadata &md) override;
268
269 public:
271 const Ref<MetadataSelector> &middle = nullptr)
272 : caller_(caller), middle_(middle) {}
273};
274
276 protected:
277 bool matchImpl(const Metadata &md) override;
278};
279
280Ref<Selector> parseSelector(const std::string &str);
281
282} // namespace freetensor
283
284#endif // FREE_TENSOR_SELECTOR_H
Definition: selector.h:148
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:111
AfterSelector(const Ref< Selector > &leading, const Ref< Selector > &middle=nullptr)
Definition: selector.h:155
Definition: selector.h:103
AncestorSelector(const Ref< Selector > &descendant, const Ref< Selector > &middle=nullptr)
Definition: selector.h:110
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:50
Definition: selector.h:126
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:85
BeforeSelector(const Ref< Selector > &following, const Ref< Selector > &middle=nullptr)
Definition: selector.h:133
Definition: selector.h:194
bool matchImpl(const Metadata &md) override
Definition: selector.cc:137
BothMetadataSelector(const Ref< MetadataSelector > &lhs, const Ref< MetadataSelector > &rhs)
Definition: selector.h:201
Definition: selector.h:39
BothSelector(const Ref< Selector > &lhs, const Ref< Selector > &rhs)
Definition: selector.h:46
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:12
Definition: selector.h:263
CallerSelector(const Ref< MetadataSelector > &caller, const Ref< MetadataSelector > &middle=nullptr)
Definition: selector.h:270
bool matchImpl(const Metadata &md) override
Definition: selector.cc:178
Definition: selector.h:71
ChildSelector(const Ref< Selector > &parent)
Definition: selector.h:78
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:24
Definition: selector.h:81
DescendantSelector(const Ref< Selector > &ancestor, const Ref< Selector > &middle=nullptr)
Definition: selector.h:88
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:29
Definition: selector.h:138
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:99
DirectAfterSelector(const Ref< Selector > &leading)
Definition: selector.h:145
Definition: selector.h:115
DirectBeforeSelector(const Ref< Selector > &following)
Definition: selector.h:122
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:73
Definition: selector.h:252
bool matchImpl(const Metadata &md) override
Definition: selector.cc:169
DirectCallerSelector(const Ref< MetadataSelector > &caller)
Definition: selector.h:259
Definition: selector.h:206
EitherMetadataSelector(const Ref< MetadataSelector > &lhs, const Ref< MetadataSelector > &rhs)
Definition: selector.h:213
bool matchImpl(const Metadata &md) override
Definition: selector.cc:141
Definition: selector.h:50
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:16
EitherSelector(const Ref< Selector > &lhs, const Ref< Selector > &rhs)
Definition: selector.h:57
Definition: selector.h:218
IDSelector(const ID &id)
Definition: selector.h:226
bool matchImpl(const Metadata &md) override
Definition: selector.cc:146
Definition: id.h:18
Definition: selector.h:229
LabelSelector(const std::string &label)
Definition: selector.h:236
bool matchImpl(const Metadata &md) override
Definition: selector.cc:151
Definition: selector.h:165
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:129
Definition: selector.h:170
bool match(const Metadata &md)
Definition: selector.h:178
virtual bool matchImpl(const Metadata &md)=0
virtual bool matchImpl(const Stmt &stmt) override
Definition: selector.h:173
Definition: selector.h:61
NodeTypeSelector(const ASTNodeType &nodeType)
Definition: selector.h:68
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:20
Definition: selector.h:184
bool matchImpl(const Metadata &md) override
Definition: selector.cc:133
NotMetadataSelector(const Ref< MetadataSelector > &sub)
Definition: selector.h:191
Definition: selector.h:29
NotSelector(const Ref< Selector > &sub)
Definition: selector.h:36
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:10
Definition: selector.h:93
ParentSelector(const Ref< Selector > &child)
Definition: selector.h:100
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:41
bool isValid() const
Definition: ref.h:89
Definition: selector.h:275
bool matchImpl(const Metadata &md) override
Definition: selector.cc:195
Definition: selector.h:160
bool matchImpl(const Stmt &stmt) override
Definition: selector.cc:125
Definition: selector.h:12
virtual bool matchImpl(const Stmt &stmt)=0
virtual ~Selector()
Definition: selector.h:19
bool match(const Stmt &stmt)
Definition: selector.h:21
const Metadata & metadata() const
Definition: ast.h:233
Definition: selector.h:239
TransformedSelector(const std::string &op, const std::vector< Ref< MetadataSelector > > sources)
Definition: selector.h:247
bool matchImpl(const Metadata &md) override
Definition: selector.cc:157
Definition: allocator.h:9
auto && lhs
Definition: const_fold.cc:70
Ref< Selector > parseSelector(const std::string &str)
Definition: selector.cc:201
UpperBound sub(const UpperBound &b1, const LowerBound &b2)
Definition: bounds.cc:200
auto auto && rhs
Definition: const_fold.cc:70
ASTNodeType
Definition: ast.h:20