Go to the documentation of this file.
5 #ifndef RE2_WALKER_INL_H_
6 #define RE2_WALKER_INL_H_
18 #include "util/logging.h"
19 #include "re2/regexp.h"
23 template<
typename T>
struct WalkState;
25 template<
typename T>
class Regexp::Walker {
51 T* child_args,
int nchild_args);
121 template<
typename T>
struct WalkState {
137 stopped_early_ =
false;
149 LOG(DFATAL) <<
"Stack not empty.";
151 delete[]
stack_.top().child_args;
162 LOG(DFATAL) <<
"Walk NULL";
166 stack_.push(WalkState<T>(re, top_arg));
175 if (--max_visits_ < 0) {
176 stopped_early_ =
true;
177 t = ShortVisit(re,
s->parent_arg);
181 s->pre_arg = PreVisit(re,
s->parent_arg, &
stop);
187 s->child_args = NULL;
189 s->child_args = &
s->child_arg;
190 else if (re->nsub_ > 1)
191 s->child_args =
new T[re->nsub_];
196 Regexp** sub = re->sub();
197 if (
s->n < re->nsub_) {
198 if (use_copy &&
s->n > 0 && sub[
s->n - 1] == sub[
s->n]) {
199 s->child_args[
s->n] =
Copy(
s->child_args[
s->n - 1]);
202 stack_.push(WalkState<T>(sub[
s->n],
s->pre_arg));
208 t = PostVisit(re,
s->parent_arg,
s->pre_arg,
s->child_args,
s->n);
210 delete[]
s->child_args;
221 if (
s->child_args != NULL)
222 s->child_args[
s->n] =
t;
234 max_visits_ = 1000000;
235 return WalkInternal(re, top_arg,
true);
240 max_visits_ = max_visits;
241 return WalkInternal(re, top_arg,
false);
246 #endif // RE2_WALKER_INL_H_
WalkState(Regexp *re, T parent)
T WalkExponential(Regexp *re, T top_arg, int max_visits)
T WalkInternal(Regexp *re, T top_arg, bool use_copy)
Walker & operator=(const Walker &)=delete
#define T(upbtypeconst, upbtype, ctype, default_value)
#define FALLTHROUGH_INTENDED
std::vector< Json * > stack_
std::stack< WalkState< T > > stack_
T Walk(Regexp *re, T top_arg)
virtual T PreVisit(Regexp *re, T parent_arg, bool *stop)
virtual T PostVisit(Regexp *re, T parent_arg, T pre_arg, T *child_args, int nchild_args)
virtual T ShortVisit(Regexp *re, T parent_arg)=0
Regexp(RegexpOp op, ParseFlags parse_flags)
grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:52