5 #ifndef HOBBES_LANG_PAT_PATTERN_HPP_INCLUDED 6 #define HOBBES_LANG_PAT_PATTERN_HPP_INCLUDED 15 typedef std::vector<size_t>
Idxs;
50 virtual void show(std::ostream&)
const = 0;
54 const std::string& name()
const;
55 void name(
const std::string&);
59 virtual void assignSubNames(
const std::string&) = 0;
70 template <
typename Case>
77 std::string
show(
const PatternPtr& p);
78 std::string
show(
const Patterns& ps);
90 const ExprPtr& expression()
const;
93 void show(std::ostream&)
const;
96 static const int type_case_id = 0;
101 void assignSubNames(
const std::string&);
109 const std::string& value()
const;
111 void show(std::ostream&)
const;
114 static const int type_case_id = 1;
118 void assignSubNames(
const std::string&);
126 const PatternPtr& pattern(
size_t i)
const;
127 const Idxs& indexes()
const;
131 void indexes(
const Idxs&);
133 void show(std::ostream&)
const;
136 static const int type_case_id = 2;
141 void assignSubNames(
const std::string&);
150 std::string text()
const;
155 void show(std::ostream&)
const;
157 static const int type_case_id = 3;
161 void assignSubNames(
const std::string&);
167 typedef std::pair<std::string, PatternPtr>
Field;
172 const Field& pattern(
size_t i)
const;
173 const Idxs& indexes()
const;
176 const Fields& fields()
const;
177 void fields(
const Fields&);
179 void show(std::ostream&)
const;
182 static const int type_case_id = 4;
187 void assignSubNames(
const std::string&);
189 static void show(std::ostream&,
const Field& f);
197 const std::string&
label()
const;
198 const PatternPtr& value()
const;
200 void show(std::ostream&)
const;
203 static const int type_case_id = 5;
208 void assignSubNames(
const std::string&);
211 template <
typename Case>
216 template <
typename T>
219 virtual T with(
const MatchAny*)
const = 0;
226 template <
typename T>
228 switch (p->case_id()) {
229 case MatchLiteral::type_case_id:
231 case MatchAny::type_case_id:
233 case MatchArray::type_case_id:
235 case MatchRegex::type_case_id:
237 case MatchRecord::type_case_id:
239 case MatchVariant::type_case_id:
242 throw annotated_error(*p,
"Internal error, cannot switch on unknown high-level pattern: " +
show(p));
246 template <
typename T>
249 for (Patterns::const_iterator p = ps.begin(); p != ps.end(); ++p) {
258 for (std::vector<unsigned char>::const_iterator b = bs.begin(); b != bs.end(); ++b) {
266 for (std::string::const_iterator c = cs.begin(); c != cs.end(); ++c) {
PatternRow(const Patterns &ps, const ExprPtr &r)
Definition: pattern.H:24
std::pair< std::string, PatternPtr > Field
Definition: pattern.H:167
std::vector< T > switchOf(const Patterns &ps, const switchPattern< T > &f)
Definition: pattern.H:247
Definition: pattern.H:122
Definition: pattern.H:165
int cid
Definition: pattern.H:67
std::shared_ptr< Regex > RegexPtr
Definition: regex.H:40
ExprPtr result
Definition: pattern.H:29
std::shared_ptr< std::vector< std::pair< size_t, PatternRow > > > UnreachableMatchRowsPtr
Definition: pattern.H:32
std::string show(const PatternRow &pr)
Definition: pattern.C:309
Definition: pattern.H:281
bool operator==(const PatternRow &, const PatternRow &)
Definition: pattern.C:270
std::vector< ExprPtr > Exprs
Definition: expr.H:59
std::string lbl
Definition: pattern.H:205
std::string pname
Definition: pattern.H:57
Patterns patterns
Definition: pattern.H:27
size_t hash(const PatternRow &)
Definition: pattern.C:283
Patterns ps
Definition: pattern.H:138
ExprPtr guard
Definition: pattern.H:28
std::shared_ptr< Primitive > PrimitivePtr
Definition: expr.H:86
Definition: pattern.H:105
ExprPtr compileMatchTest(cc *, const ExprPtr &, const PatternPtr &, const LexicalAnnotation &)
Definition: pattern.C:631
Definition: pattern.H:145
MatchArray * mkpatarray(const std::string &cs, const LexicalAnnotation &la)
Definition: pattern.H:264
virtual T with(const MatchLiteral *) const =0
PatternCase< Case > Base
Definition: pattern.H:73
bool refutable(const PatternPtr &)
Definition: pattern.C:658
std::string show(const Expr &e)
Definition: expr.C:19
ExprPtr compileMatch(cc *, const Exprs &, const PatternRows &, const LexicalAnnotation &)
Definition: pattern.C:617
RegexPtr regex
Definition: pattern.H:159
std::shared_ptr< Expr > ExprPtr
Definition: expr.H:58
PatternRow(const Patterns &ps, const ExprPtr &g, const ExprPtr &r)
Definition: pattern.H:25
Definition: lannotation.H:36
size_t r(const reader::MetaData &md, size_t o, T *t)
Definition: storage.H:1730
PrimitivePtr p
Definition: pattern.H:98
size_t operator()(const hobbes::PatternRow &x) const
Definition: pattern.H:284
Definition: lannotation.H:60
Definition: lannotation.H:22
std::string vn
Definition: pattern.H:116
PatternRow()
Definition: pattern.H:23
ExprPtr e
Definition: pattern.H:99
uint32_t result
Definition: regex.C:376
std::vector< PatternPtr > Patterns
Definition: pattern.H:20
Idxs is
Definition: pattern.H:185
std::vector< Field > Fields
Definition: pattern.H:168
std::vector< size_t > Idxs
Definition: pattern.H:15
Fields fs
Definition: pattern.H:184
PatternPtr p
Definition: pattern.H:206
Idxs idxs
Definition: pattern.H:139
bool isUnitPat(const PatternPtr &)
Definition: pattern.C:662
std::vector< PatternRow > PatternRows
Definition: pattern.H:31
Definition: pattern.H:217
std::shared_ptr< Pattern > PatternPtr
Definition: pattern.H:18
PatternCase(const LexicalAnnotation &)
Definition: pattern.H:212
Definition: pattern.H:193