Index: third_party/re2/re2/regexp.h |
diff --git a/third_party/re2/re2/regexp.h b/third_party/re2/re2/regexp.h |
deleted file mode 100644 |
index 5f222b7c9f7c876088cefa5b372f3b00ff3ef306..0000000000000000000000000000000000000000 |
--- a/third_party/re2/re2/regexp.h |
+++ /dev/null |
@@ -1,635 +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. |
- |
-// --- SPONSORED LINK -------------------------------------------------- |
-// If you want to use this library for regular expression matching, |
-// you should use re2/re2.h, which provides a class RE2 that |
-// mimics the PCRE interface provided by PCRE's C++ wrappers. |
-// This header describes the low-level interface used to implement RE2 |
-// and may change in backwards-incompatible ways from time to time. |
-// In contrast, RE2's interface will not. |
-// --------------------------------------------------------------------- |
- |
-// Regular expression library: parsing, execution, and manipulation |
-// of regular expressions. |
-// |
-// Any operation that traverses the Regexp structures should be written |
-// using Regexp::Walker (see walker-inl.h), not recursively, because deeply nested |
-// regular expressions such as x++++++++++++++++++++... might cause recursive |
-// traversals to overflow the stack. |
-// |
-// It is the caller's responsibility to provide appropriate mutual exclusion |
-// around manipulation of the regexps. RE2 does this. |
-// |
-// PARSING |
-// |
-// Regexp::Parse parses regular expressions encoded in UTF-8. |
-// The default syntax is POSIX extended regular expressions, |
-// with the following changes: |
-// |
-// 1. Backreferences (optional in POSIX EREs) are not supported. |
-// (Supporting them precludes the use of DFA-based |
-// matching engines.) |
-// |
-// 2. Collating elements and collation classes are not supported. |
-// (No one has needed or wanted them.) |
-// |
-// The exact syntax accepted can be modified by passing flags to |
-// Regexp::Parse. In particular, many of the basic Perl additions |
-// are available. The flags are documented below (search for LikePerl). |
-// |
-// If parsed with the flag Regexp::Latin1, both the regular expression |
-// and the input to the matching routines are assumed to be encoded in |
-// Latin-1, not UTF-8. |
-// |
-// EXECUTION |
-// |
-// Once Regexp has parsed a regular expression, it provides methods |
-// to search text using that regular expression. These methods are |
-// implemented via calling out to other regular expression libraries. |
-// (Let's call them the sublibraries.) |
-// |
-// To call a sublibrary, Regexp does not simply prepare a |
-// string version of the regular expression and hand it to the |
-// sublibrary. Instead, Regexp prepares, from its own parsed form, the |
-// corresponding internal representation used by the sublibrary. |
-// This has the drawback of needing to know the internal representation |
-// used by the sublibrary, but it has two important benefits: |
-// |
-// 1. The syntax and meaning of regular expressions is guaranteed |
-// to be that used by Regexp's parser, not the syntax expected |
-// by the sublibrary. Regexp might accept a restricted or |
-// expanded syntax for regular expressions as compared with |
-// the sublibrary. As long as Regexp can translate from its |
-// internal form into the sublibrary's, clients need not know |
-// exactly which sublibrary they are using. |
-// |
-// 2. The sublibrary parsers are bypassed. For whatever reason, |
-// sublibrary regular expression parsers often have security |
-// problems. For example, plan9grep's regular expression parser |
-// has a buffer overflow in its handling of large character |
-// classes, and PCRE's parser has had buffer overflow problems |
-// in the past. Security-team requires sandboxing of sublibrary |
-// regular expression parsers. Avoiding the sublibrary parsers |
-// avoids the sandbox. |
-// |
-// The execution methods we use now are provided by the compiled form, |
-// Prog, described in prog.h |
-// |
-// MANIPULATION |
-// |
-// Unlike other regular expression libraries, Regexp makes its parsed |
-// form accessible to clients, so that client code can analyze the |
-// parsed regular expressions. |
- |
-#ifndef RE2_REGEXP_H__ |
-#define RE2_REGEXP_H__ |
- |
-#include "util/util.h" |
-#include "re2/stringpiece.h" |
- |
-namespace re2 { |
- |
-// Keep in sync with string list kOpcodeNames[] in testing/dump.cc |
-enum RegexpOp { |
- // Matches no strings. |
- kRegexpNoMatch = 1, |
- |
- // Matches empty string. |
- kRegexpEmptyMatch, |
- |
- // Matches rune_. |
- kRegexpLiteral, |
- |
- // Matches runes_. |
- kRegexpLiteralString, |
- |
- // Matches concatenation of sub_[0..nsub-1]. |
- kRegexpConcat, |
- // Matches union of sub_[0..nsub-1]. |
- kRegexpAlternate, |
- |
- // Matches sub_[0] zero or more times. |
- kRegexpStar, |
- // Matches sub_[0] one or more times. |
- kRegexpPlus, |
- // Matches sub_[0] zero or one times. |
- kRegexpQuest, |
- |
- // Matches sub_[0] at least min_ times, at most max_ times. |
- // max_ == -1 means no upper limit. |
- kRegexpRepeat, |
- |
- // Parenthesized (capturing) subexpression. Index is cap_. |
- // Optionally, capturing name is name_. |
- kRegexpCapture, |
- |
- // Matches any character. |
- kRegexpAnyChar, |
- |
- // Matches any byte [sic]. |
- kRegexpAnyByte, |
- |
- // Matches empty string at beginning of line. |
- kRegexpBeginLine, |
- // Matches empty string at end of line. |
- kRegexpEndLine, |
- |
- // Matches word boundary "\b". |
- kRegexpWordBoundary, |
- // Matches not-a-word boundary "\B". |
- kRegexpNoWordBoundary, |
- |
- // Matches empty string at beginning of text. |
- kRegexpBeginText, |
- // Matches empty string at end of text. |
- kRegexpEndText, |
- |
- // Matches character class given by cc_. |
- kRegexpCharClass, |
- |
- // Forces match of entire expression right now, |
- // with match ID match_id_ (used by RE2::Set). |
- kRegexpHaveMatch, |
- |
- kMaxRegexpOp = kRegexpHaveMatch, |
-}; |
- |
-// Keep in sync with string list in regexp.cc |
-enum RegexpStatusCode { |
- // No error |
- kRegexpSuccess = 0, |
- |
- // Unexpected error |
- kRegexpInternalError, |
- |
- // Parse errors |
- kRegexpBadEscape, // bad escape sequence |
- kRegexpBadCharClass, // bad character class |
- kRegexpBadCharRange, // bad character class range |
- kRegexpMissingBracket, // missing closing ] |
- kRegexpMissingParen, // missing closing ) |
- kRegexpTrailingBackslash, // at end of regexp |
- kRegexpRepeatArgument, // repeat argument missing, e.g. "*" |
- kRegexpRepeatSize, // bad repetition argument |
- kRegexpRepeatOp, // bad repetition operator |
- kRegexpBadPerlOp, // bad perl operator |
- kRegexpBadUTF8, // invalid UTF-8 in regexp |
- kRegexpBadNamedCapture, // bad named capture |
-}; |
- |
-// Error status for certain operations. |
-class RegexpStatus { |
- public: |
- RegexpStatus() : code_(kRegexpSuccess), tmp_(NULL) {} |
- ~RegexpStatus() { delete tmp_; } |
- |
- void set_code(enum RegexpStatusCode code) { code_ = code; } |
- void set_error_arg(const StringPiece& error_arg) { error_arg_ = error_arg; } |
- void set_tmp(string* tmp) { delete tmp_; tmp_ = tmp; } |
- enum RegexpStatusCode code() const { return code_; } |
- const StringPiece& error_arg() const { return error_arg_; } |
- bool ok() const { return code() == kRegexpSuccess; } |
- |
- // Copies state from status. |
- void Copy(const RegexpStatus& status); |
- |
- // Returns text equivalent of code, e.g.: |
- // "Bad character class" |
- static string CodeText(enum RegexpStatusCode code); |
- |
- // Returns text describing error, e.g.: |
- // "Bad character class: [z-a]" |
- string Text() const; |
- |
- private: |
- enum RegexpStatusCode code_; // Kind of error |
- StringPiece error_arg_; // Piece of regexp containing syntax error. |
- string* tmp_; // Temporary storage, possibly where error_arg_ is. |
- |
- DISALLOW_COPY_AND_ASSIGN(RegexpStatus); |
-}; |
- |
-// Walkers to implement Simplify. |
-class CoalesceWalker; |
-class SimplifyWalker; |
- |
-// Compiled form; see prog.h |
-class Prog; |
- |
-struct RuneRange { |
- RuneRange() : lo(0), hi(0) { } |
- RuneRange(int l, int h) : lo(l), hi(h) { } |
- Rune lo; |
- Rune hi; |
-}; |
- |
-// Less-than on RuneRanges treats a == b if they overlap at all. |
-// This lets us look in a set to find the range covering a particular Rune. |
-struct RuneRangeLess { |
- bool operator()(const RuneRange& a, const RuneRange& b) const { |
- return a.hi < b.lo; |
- } |
-}; |
- |
-class CharClassBuilder; |
- |
-class CharClass { |
- public: |
- void Delete(); |
- |
- typedef RuneRange* iterator; |
- iterator begin() { return ranges_; } |
- iterator end() { return ranges_ + nranges_; } |
- |
- int size() { return nrunes_; } |
- bool empty() { return nrunes_ == 0; } |
- bool full() { return nrunes_ == Runemax+1; } |
- bool FoldsASCII() { return folds_ascii_; } |
- |
- bool Contains(Rune r); |
- CharClass* Negate(); |
- |
- private: |
- CharClass(); // not implemented |
- ~CharClass(); // not implemented |
- static CharClass* New(int maxranges); |
- |
- friend class CharClassBuilder; |
- |
- bool folds_ascii_; |
- int nrunes_; |
- RuneRange *ranges_; |
- int nranges_; |
- DISALLOW_COPY_AND_ASSIGN(CharClass); |
-}; |
- |
-class Regexp { |
- public: |
- |
- // Flags for parsing. Can be ORed together. |
- enum ParseFlags { |
- NoParseFlags = 0, |
- FoldCase = 1<<0, // Fold case during matching (case-insensitive). |
- Literal = 1<<1, // Treat s as literal string instead of a regexp. |
- ClassNL = 1<<2, // Allow char classes like [^a-z] and \D and \s |
- // and [[:space:]] to match newline. |
- DotNL = 1<<3, // Allow . to match newline. |
- MatchNL = ClassNL | DotNL, |
- OneLine = 1<<4, // Treat ^ and $ as only matching at beginning and |
- // end of text, not around embedded newlines. |
- // (Perl's default) |
- Latin1 = 1<<5, // Regexp and text are in Latin1, not UTF-8. |
- NonGreedy = 1<<6, // Repetition operators are non-greedy by default. |
- PerlClasses = 1<<7, // Allow Perl character classes like \d. |
- PerlB = 1<<8, // Allow Perl's \b and \B. |
- PerlX = 1<<9, // Perl extensions: |
- // non-capturing parens - (?: ) |
- // non-greedy operators - *? +? ?? {}? |
- // flag edits - (?i) (?-i) (?i: ) |
- // i - FoldCase |
- // m - !OneLine |
- // s - DotNL |
- // U - NonGreedy |
- // line ends: \A \z |
- // \Q and \E to disable/enable metacharacters |
- // (?P<name>expr) for named captures |
- // \C to match any single byte |
- UnicodeGroups = 1<<10, // Allow \p{Han} for Unicode Han group |
- // and \P{Han} for its negation. |
- NeverNL = 1<<11, // Never match NL, even if the regexp mentions |
- // it explicitly. |
- NeverCapture = 1<<12, // Parse all parens as non-capturing. |
- |
- // As close to Perl as we can get. |
- LikePerl = ClassNL | OneLine | PerlClasses | PerlB | PerlX | |
- UnicodeGroups, |
- |
- // Internal use only. |
- WasDollar = 1<<15, // on kRegexpEndText: was $ in regexp text |
- }; |
- |
- // Get. No set, Regexps are logically immutable once created. |
- RegexpOp op() { return static_cast<RegexpOp>(op_); } |
- int nsub() { return nsub_; } |
- bool simple() { return simple_ != 0; } |
- enum ParseFlags parse_flags() { return static_cast<ParseFlags>(parse_flags_); } |
- int Ref(); // For testing. |
- |
- Regexp** sub() { |
- if(nsub_ <= 1) |
- return &subone_; |
- else |
- return submany_; |
- } |
- |
- int min() { DCHECK_EQ(op_, kRegexpRepeat); return min_; } |
- int max() { DCHECK_EQ(op_, kRegexpRepeat); return max_; } |
- Rune rune() { DCHECK_EQ(op_, kRegexpLiteral); return rune_; } |
- CharClass* cc() { DCHECK_EQ(op_, kRegexpCharClass); return cc_; } |
- int cap() { DCHECK_EQ(op_, kRegexpCapture); return cap_; } |
- const string* name() { DCHECK_EQ(op_, kRegexpCapture); return name_; } |
- Rune* runes() { DCHECK_EQ(op_, kRegexpLiteralString); return runes_; } |
- int nrunes() { DCHECK_EQ(op_, kRegexpLiteralString); return nrunes_; } |
- int match_id() { DCHECK_EQ(op_, kRegexpHaveMatch); return match_id_; } |
- |
- // Increments reference count, returns object as convenience. |
- Regexp* Incref(); |
- |
- // Decrements reference count and deletes this object if count reaches 0. |
- void Decref(); |
- |
- // Parses string s to produce regular expression, returned. |
- // Caller must release return value with re->Decref(). |
- // On failure, sets *status (if status != NULL) and returns NULL. |
- static Regexp* Parse(const StringPiece& s, ParseFlags flags, |
- RegexpStatus* status); |
- |
- // Returns a _new_ simplified version of the current regexp. |
- // Does not edit the current regexp. |
- // Caller must release return value with re->Decref(). |
- // Simplified means that counted repetition has been rewritten |
- // into simpler terms and all Perl/POSIX features have been |
- // removed. The result will capture exactly the same |
- // subexpressions the original did, unless formatted with ToString. |
- Regexp* Simplify(); |
- friend class CoalesceWalker; |
- friend class SimplifyWalker; |
- |
- // Parses the regexp src and then simplifies it and sets *dst to the |
- // string representation of the simplified form. Returns true on success. |
- // Returns false and sets *status (if status != NULL) on parse error. |
- static bool SimplifyRegexp(const StringPiece& src, ParseFlags flags, |
- string* dst, |
- RegexpStatus* status); |
- |
- // Returns the number of capturing groups in the regexp. |
- int NumCaptures(); |
- friend class NumCapturesWalker; |
- |
- // Returns a map from names to capturing group indices, |
- // or NULL if the regexp contains no named capture groups. |
- // The caller is responsible for deleting the map. |
- map<string, int>* NamedCaptures(); |
- |
- // Returns a map from capturing group indices to capturing group |
- // names or NULL if the regexp contains no named capture groups. The |
- // caller is responsible for deleting the map. |
- map<int, string>* CaptureNames(); |
- |
- // Returns a string representation of the current regexp, |
- // using as few parentheses as possible. |
- string ToString(); |
- |
- // Convenience functions. They consume the passed reference, |
- // so in many cases you should use, e.g., Plus(re->Incref(), flags). |
- // They do not consume allocated arrays like subs or runes. |
- static Regexp* Plus(Regexp* sub, ParseFlags flags); |
- static Regexp* Star(Regexp* sub, ParseFlags flags); |
- static Regexp* Quest(Regexp* sub, ParseFlags flags); |
- static Regexp* Concat(Regexp** subs, int nsubs, ParseFlags flags); |
- static Regexp* Alternate(Regexp** subs, int nsubs, ParseFlags flags); |
- static Regexp* Capture(Regexp* sub, ParseFlags flags, int cap); |
- static Regexp* Repeat(Regexp* sub, ParseFlags flags, int min, int max); |
- static Regexp* NewLiteral(Rune rune, ParseFlags flags); |
- static Regexp* NewCharClass(CharClass* cc, ParseFlags flags); |
- static Regexp* LiteralString(Rune* runes, int nrunes, ParseFlags flags); |
- static Regexp* HaveMatch(int match_id, ParseFlags flags); |
- |
- // Like Alternate but does not factor out common prefixes. |
- static Regexp* AlternateNoFactor(Regexp** subs, int nsubs, ParseFlags flags); |
- |
- // Debugging function. Returns string format for regexp |
- // that makes structure clear. Does NOT use regexp syntax. |
- string Dump(); |
- |
- // Helper traversal class, defined fully in walker-inl.h. |
- template<typename T> class Walker; |
- |
- // Compile to Prog. See prog.h |
- // Reverse prog expects to be run over text backward. |
- // Construction and execution of prog will |
- // stay within approximately max_mem bytes of memory. |
- // If max_mem <= 0, a reasonable default is used. |
- Prog* CompileToProg(int64 max_mem); |
- Prog* CompileToReverseProg(int64 max_mem); |
- |
- // Whether to expect this library to find exactly the same answer as PCRE |
- // when running this regexp. Most regexps do mimic PCRE exactly, but a few |
- // obscure cases behave differently. Technically this is more a property |
- // of the Prog than the Regexp, but the computation is much easier to do |
- // on the Regexp. See mimics_pcre.cc for the exact conditions. |
- bool MimicsPCRE(); |
- |
- // Benchmarking function. |
- void NullWalk(); |
- |
- // Whether every match of this regexp must be anchored and |
- // begin with a non-empty fixed string (perhaps after ASCII |
- // case-folding). If so, returns the prefix and the sub-regexp that |
- // follows it. |
- bool RequiredPrefix(string* prefix, bool *foldcase, Regexp** suffix); |
- |
- private: |
- // Constructor allocates vectors as appropriate for operator. |
- explicit Regexp(RegexpOp op, ParseFlags parse_flags); |
- |
- // Use Decref() instead of delete to release Regexps. |
- // This is private to catch deletes at compile time. |
- ~Regexp(); |
- void Destroy(); |
- bool QuickDestroy(); |
- |
- // Helpers for Parse. Listed here so they can edit Regexps. |
- class ParseState; |
- friend class ParseState; |
- friend bool ParseCharClass(StringPiece* s, Regexp** out_re, |
- RegexpStatus* status); |
- |
- // Helper for testing [sic]. |
- friend bool RegexpEqualTestingOnly(Regexp*, Regexp*); |
- |
- // Computes whether Regexp is already simple. |
- bool ComputeSimple(); |
- |
- // Constructor that generates a concatenation or alternation, |
- // enforcing the limit on the number of subexpressions for |
- // a particular Regexp. |
- static Regexp* ConcatOrAlternate(RegexpOp op, Regexp** subs, int nsubs, |
- ParseFlags flags, bool can_factor); |
- |
- // Returns the leading string that re starts with. |
- // The returned Rune* points into a piece of re, |
- // so it must not be used after the caller calls re->Decref(). |
- static Rune* LeadingString(Regexp* re, int* nrune, ParseFlags* flags); |
- |
- // Removes the first n leading runes from the beginning of re. |
- // Edits re in place. |
- static void RemoveLeadingString(Regexp* re, int n); |
- |
- // Returns the leading regexp in re's top-level concatenation. |
- // The returned Regexp* points at re or a sub-expression of re, |
- // so it must not be used after the caller calls re->Decref(). |
- static Regexp* LeadingRegexp(Regexp* re); |
- |
- // Removes LeadingRegexp(re) from re and returns the remainder. |
- // Might edit re in place. |
- static Regexp* RemoveLeadingRegexp(Regexp* re); |
- |
- // Simplifies an alternation of literal strings by factoring out |
- // common prefixes. |
- static int FactorAlternation(Regexp** sub, int nsub, ParseFlags flags); |
- static int FactorAlternationRecursive(Regexp** sub, int nsub, |
- ParseFlags flags, int maxdepth); |
- |
- // Is a == b? Only efficient on regexps that have not been through |
- // Simplify yet - the expansion of a kRegexpRepeat will make this |
- // take a long time. Do not call on such regexps, hence private. |
- static bool Equal(Regexp* a, Regexp* b); |
- |
- // Allocate space for n sub-regexps. |
- void AllocSub(int n) { |
- if (n < 0 || static_cast<uint16>(n) != n) |
- LOG(FATAL) << "Cannot AllocSub " << n; |
- if (n > 1) |
- submany_ = new Regexp*[n]; |
- nsub_ = n; |
- } |
- |
- // Add Rune to LiteralString |
- void AddRuneToString(Rune r); |
- |
- // Swaps this with that, in place. |
- void Swap(Regexp *that); |
- |
- // Operator. See description of operators above. |
- // uint8 instead of RegexpOp to control space usage. |
- uint8 op_; |
- |
- // Is this regexp structure already simple |
- // (has it been returned by Simplify)? |
- // uint8 instead of bool to control space usage. |
- uint8 simple_; |
- |
- // Flags saved from parsing and used during execution. |
- // (Only FoldCase is used.) |
- // uint16 instead of ParseFlags to control space usage. |
- uint16 parse_flags_; |
- |
- // Reference count. Exists so that SimplifyRegexp can build |
- // regexp structures that are dags rather than trees to avoid |
- // exponential blowup in space requirements. |
- // uint16 to control space usage. |
- // The standard regexp routines will never generate a |
- // ref greater than the maximum repeat count (100), |
- // but even so, Incref and Decref consult an overflow map |
- // when ref_ reaches kMaxRef. |
- uint16 ref_; |
- static const uint16 kMaxRef = 0xffff; |
- |
- // Subexpressions. |
- // uint16 to control space usage. |
- // Concat and Alternate handle larger numbers of subexpressions |
- // by building concatenation or alternation trees. |
- // Other routines should call Concat or Alternate instead of |
- // filling in sub() by hand. |
- uint16 nsub_; |
- static const uint16 kMaxNsub = 0xffff; |
- union { |
- Regexp** submany_; // if nsub_ > 1 |
- Regexp* subone_; // if nsub_ == 1 |
- }; |
- |
- // Extra space for parse and teardown stacks. |
- Regexp* down_; |
- |
- // Arguments to operator. See description of operators above. |
- union { |
- struct { // Repeat |
- int max_; |
- int min_; |
- }; |
- struct { // Capture |
- int cap_; |
- string* name_; |
- }; |
- struct { // LiteralString |
- int nrunes_; |
- Rune* runes_; |
- }; |
- struct { // CharClass |
- // These two could be in separate union members, |
- // but it wouldn't save any space (there are other two-word structs) |
- // and keeping them separate avoids confusion during parsing. |
- CharClass* cc_; |
- CharClassBuilder* ccb_; |
- }; |
- Rune rune_; // Literal |
- int match_id_; // HaveMatch |
- void *the_union_[2]; // as big as any other element, for memset |
- }; |
- |
- DISALLOW_COPY_AND_ASSIGN(Regexp); |
-}; |
- |
-// Character class set: contains non-overlapping, non-abutting RuneRanges. |
-typedef set<RuneRange, RuneRangeLess> RuneRangeSet; |
- |
-class CharClassBuilder { |
- public: |
- CharClassBuilder(); |
- |
- typedef RuneRangeSet::iterator iterator; |
- iterator begin() { return ranges_.begin(); } |
- iterator end() { return ranges_.end(); } |
- |
- int size() { return nrunes_; } |
- bool empty() { return nrunes_ == 0; } |
- bool full() { return nrunes_ == Runemax+1; } |
- |
- bool Contains(Rune r); |
- bool FoldsASCII(); |
- bool AddRange(Rune lo, Rune hi); // returns whether class changed |
- CharClassBuilder* Copy(); |
- void AddCharClass(CharClassBuilder* cc); |
- void Negate(); |
- void RemoveAbove(Rune r); |
- CharClass* GetCharClass(); |
- void AddRangeFlags(Rune lo, Rune hi, Regexp::ParseFlags parse_flags); |
- |
- private: |
- static const uint32 AlphaMask = (1<<26) - 1; |
- uint32 upper_; // bitmap of A-Z |
- uint32 lower_; // bitmap of a-z |
- int nrunes_; |
- RuneRangeSet ranges_; |
- DISALLOW_COPY_AND_ASSIGN(CharClassBuilder); |
-}; |
- |
-// Tell g++ that bitwise ops on ParseFlags produce ParseFlags. |
-inline Regexp::ParseFlags operator|(Regexp::ParseFlags a, Regexp::ParseFlags b) |
-{ |
- return static_cast<Regexp::ParseFlags>(static_cast<int>(a) | static_cast<int>(b)); |
-} |
- |
-inline Regexp::ParseFlags operator^(Regexp::ParseFlags a, Regexp::ParseFlags b) |
-{ |
- return static_cast<Regexp::ParseFlags>(static_cast<int>(a) ^ static_cast<int>(b)); |
-} |
- |
-inline Regexp::ParseFlags operator&(Regexp::ParseFlags a, Regexp::ParseFlags b) |
-{ |
- return static_cast<Regexp::ParseFlags>(static_cast<int>(a) & static_cast<int>(b)); |
-} |
- |
-inline Regexp::ParseFlags operator~(Regexp::ParseFlags a) |
-{ |
- return static_cast<Regexp::ParseFlags>(~static_cast<int>(a)); |
-} |
- |
- |
- |
-} // namespace re2 |
- |
-#endif // RE2_REGEXP_H__ |