Index: third_party/re2/re2/walker-inl.h |
diff --git a/third_party/re2/re2/walker-inl.h b/third_party/re2/re2/walker-inl.h |
deleted file mode 100644 |
index bdcf7f57965df604c35a3f8afc1ab31e654e4077..0000000000000000000000000000000000000000 |
--- a/third_party/re2/re2/walker-inl.h |
+++ /dev/null |
@@ -1,244 +0,0 @@ |
-// Copyright 2006 The RE2 Authors. All Rights Reserved. |
-// Use of this source code is governed by a BSD-style |
-// license that can be found in the LICENSE file. |
- |
-// Helper class for traversing Regexps without recursion. |
-// Clients should declare their own subclasses that override |
-// the PreVisit and PostVisit methods, which are called before |
-// and after visiting the subexpressions. |
- |
-// Not quite the Visitor pattern, because (among other things) |
-// the Visitor pattern is recursive. |
- |
-#ifndef RE2_WALKER_INL_H__ |
-#define RE2_WALKER_INL_H__ |
- |
-#include "re2/regexp.h" |
- |
-namespace re2 { |
- |
-template<typename T> struct WalkState; |
- |
-template<typename T> class Regexp::Walker { |
- public: |
- Walker(); |
- virtual ~Walker(); |
- |
- // Virtual method called before visiting re's children. |
- // PreVisit passes ownership of its return value to its caller. |
- // The Arg* that PreVisit returns will be passed to PostVisit as pre_arg |
- // and passed to the child PreVisits and PostVisits as parent_arg. |
- // At the top-most Regexp, parent_arg is arg passed to walk. |
- // If PreVisit sets *stop to true, the walk does not recurse |
- // into the children. Instead it behaves as though the return |
- // value from PreVisit is the return value from PostVisit. |
- // The default PreVisit returns parent_arg. |
- virtual T PreVisit(Regexp* re, T parent_arg, bool* stop); |
- |
- // Virtual method called after visiting re's children. |
- // The pre_arg is the T that PreVisit returned. |
- // The child_args is a vector of the T that the child PostVisits returned. |
- // PostVisit takes ownership of pre_arg. |
- // PostVisit takes ownership of the Ts |
- // in *child_args, but not the vector itself. |
- // PostVisit passes ownership of its return value |
- // to its caller. |
- // The default PostVisit simply returns pre_arg. |
- virtual T PostVisit(Regexp* re, T parent_arg, T pre_arg, |
- T* child_args, int nchild_args); |
- |
- // Virtual method called to copy a T, |
- // when Walk notices that more than one child is the same re. |
- virtual T Copy(T arg); |
- |
- // Virtual method called to do a "quick visit" of the re, |
- // but not its children. Only called once the visit budget |
- // has been used up and we're trying to abort the walk |
- // as quickly as possible. Should return a value that |
- // makes sense for the parent PostVisits still to be run. |
- // This function is (hopefully) only called by |
- // WalkExponential, but must be implemented by all clients, |
- // just in case. |
- virtual T ShortVisit(Regexp* re, T parent_arg) = 0; |
- |
- // Walks over a regular expression. |
- // Top_arg is passed as parent_arg to PreVisit and PostVisit of re. |
- // Returns the T returned by PostVisit on re. |
- T Walk(Regexp* re, T top_arg); |
- |
- // Like Walk, but doesn't use Copy. This can lead to |
- // exponential runtimes on cross-linked Regexps like the |
- // ones generated by Simplify. To help limit this, |
- // at most max_visits nodes will be visited and then |
- // the walk will be cut off early. |
- // If the walk *is* cut off early, ShortVisit(re) |
- // will be called on regexps that cannot be fully |
- // visited rather than calling PreVisit/PostVisit. |
- T WalkExponential(Regexp* re, T top_arg, int max_visits); |
- |
- // Clears the stack. Should never be necessary, since |
- // Walk always enters and exits with an empty stack. |
- // Logs DFATAL if stack is not already clear. |
- void Reset(); |
- |
- // Returns whether walk was cut off. |
- bool stopped_early() { return stopped_early_; } |
- |
- private: |
- // Walk state for the entire traversal. |
- stack<WalkState<T> >* stack_; |
- bool stopped_early_; |
- int max_visits_; |
- |
- T WalkInternal(Regexp* re, T top_arg, bool use_copy); |
- |
- DISALLOW_COPY_AND_ASSIGN(Walker); |
-}; |
- |
-template<typename T> T Regexp::Walker<T>::PreVisit(Regexp* re, |
- T parent_arg, |
- bool* stop) { |
- return parent_arg; |
-} |
- |
-template<typename T> T Regexp::Walker<T>::PostVisit(Regexp* re, |
- T parent_arg, |
- T pre_arg, |
- T* child_args, |
- int nchild_args) { |
- return pre_arg; |
-} |
- |
-template<typename T> T Regexp::Walker<T>::Copy(T arg) { |
- return arg; |
-} |
- |
-// State about a single level in the traversal. |
-template<typename T> struct WalkState { |
- WalkState<T>(Regexp* re, T parent) |
- : re(re), |
- n(-1), |
- parent_arg(parent), |
- child_args(NULL) { } |
- |
- Regexp* re; // The regexp |
- int n; // The index of the next child to process; -1 means need to PreVisit |
- T parent_arg; // Accumulated arguments. |
- T pre_arg; |
- T child_arg; // One-element buffer for child_args. |
- T* child_args; |
-}; |
- |
-template<typename T> Regexp::Walker<T>::Walker() { |
- stack_ = new stack<WalkState<T> >; |
- stopped_early_ = false; |
-} |
- |
-template<typename T> Regexp::Walker<T>::~Walker() { |
- Reset(); |
- delete stack_; |
-} |
- |
-// Clears the stack. Should never be necessary, since |
-// Walk always enters and exits with an empty stack. |
-// Logs DFATAL if stack is not already clear. |
-template<typename T> void Regexp::Walker<T>::Reset() { |
- if (stack_ && stack_->size() > 0) { |
- LOG(DFATAL) << "Stack not empty."; |
- while (stack_->size() > 0) { |
- delete stack_->top().child_args; |
- stack_->pop(); |
- } |
- } |
-} |
- |
-template<typename T> T Regexp::Walker<T>::WalkInternal(Regexp* re, T top_arg, |
- bool use_copy) { |
- Reset(); |
- |
- if (re == NULL) { |
- LOG(DFATAL) << "Walk NULL"; |
- return top_arg; |
- } |
- |
- stack_->push(WalkState<T>(re, top_arg)); |
- |
- WalkState<T>* s; |
- for (;;) { |
- T t; |
- s = &stack_->top(); |
- Regexp* re = s->re; |
- switch (s->n) { |
- case -1: { |
- if (--max_visits_ < 0) { |
- stopped_early_ = true; |
- t = ShortVisit(re, s->parent_arg); |
- break; |
- } |
- bool stop = false; |
- s->pre_arg = PreVisit(re, s->parent_arg, &stop); |
- if (stop) { |
- t = s->pre_arg; |
- break; |
- } |
- s->n = 0; |
- s->child_args = NULL; |
- if (re->nsub_ == 1) |
- s->child_args = &s->child_arg; |
- else if (re->nsub_ > 1) |
- s->child_args = new T[re->nsub_]; |
- // Fall through. |
- } |
- default: { |
- if (re->nsub_ > 0) { |
- Regexp** sub = re->sub(); |
- if (s->n < re->nsub_) { |
- if (use_copy && s->n > 0 && sub[s->n - 1] == sub[s->n]) { |
- s->child_args[s->n] = Copy(s->child_args[s->n - 1]); |
- s->n++; |
- } else { |
- stack_->push(WalkState<T>(sub[s->n], s->pre_arg)); |
- } |
- continue; |
- } |
- } |
- |
- t = PostVisit(re, s->parent_arg, s->pre_arg, s->child_args, s->n); |
- if (re->nsub_ > 1) |
- delete[] s->child_args; |
- break; |
- } |
- } |
- |
- // We've finished stack_->top(). |
- // Update next guy down. |
- stack_->pop(); |
- if (stack_->size() == 0) |
- return t; |
- s = &stack_->top(); |
- if (s->child_args != NULL) |
- s->child_args[s->n] = t; |
- else |
- s->child_arg = t; |
- s->n++; |
- } |
-} |
- |
-template<typename T> T Regexp::Walker<T>::Walk(Regexp* re, T top_arg) { |
- // Without the exponential walking behavior, |
- // this budget should be more than enough for any |
- // regexp, and yet not enough to get us in trouble |
- // as far as CPU time. |
- max_visits_ = 1000000; |
- return WalkInternal(re, top_arg, true); |
-} |
- |
-template<typename T> T Regexp::Walker<T>::WalkExponential(Regexp* re, T top_arg, |
- int max_visits) { |
- max_visits_ = max_visits; |
- return WalkInternal(re, top_arg, false); |
-} |
- |
-} // namespace re2 |
- |
-#endif // RE2_WALKER_INL_H__ |