| // Copyright 2021 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef V8_REGEXP_REGEXP_FLAGS_H_ |
| #define V8_REGEXP_REGEXP_FLAGS_H_ |
| |
| #include "src/base/flags.h" |
| #include "src/base/optional.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| // TODO(jgruber,pthier): Decouple more parts of the codebase from |
| // JSRegExp::Flags. Consider removing JSRegExp::Flags. |
| |
| // Order is important! Sorted in alphabetic order by the flag char. Note this |
| // means that flag bits are shuffled. Take care to keep them contiguous when |
| // adding/removing flags. |
| #define REGEXP_FLAG_LIST(V) \ |
| V(has_indices, HasIndices, hasIndices, 'd', 7) \ |
| V(global, Global, global, 'g', 0) \ |
| V(ignore_case, IgnoreCase, ignoreCase, 'i', 1) \ |
| V(linear, Linear, linear, 'l', 6) \ |
| V(multiline, Multiline, multiline, 'm', 2) \ |
| V(dot_all, DotAll, dotAll, 's', 5) \ |
| V(unicode, Unicode, unicode, 'u', 4) \ |
| V(sticky, Sticky, sticky, 'y', 3) |
| |
| #define V(Lower, Camel, LowerCamel, Char, Bit) k##Camel = 1 << Bit, |
| enum class RegExpFlag { REGEXP_FLAG_LIST(V) }; |
| #undef V |
| |
| #define V(...) +1 |
| constexpr int kRegExpFlagCount = REGEXP_FLAG_LIST(V); |
| #undef V |
| |
| // Assert alpha-sorted chars. |
| #define V(Lower, Camel, LowerCamel, Char, Bit) < Char) && (Char |
| static_assert((('a' - 1) REGEXP_FLAG_LIST(V) <= 'z'), "alpha-sort chars"); |
| #undef V |
| |
| // Assert contiguous indices. |
| #define V(Lower, Camel, LowerCamel, Char, Bit) | (1 << Bit) |
| static_assert(((1 << kRegExpFlagCount) - 1) == (0 REGEXP_FLAG_LIST(V)), |
| "contiguous bits"); |
| #undef V |
| |
| using RegExpFlags = base::Flags<RegExpFlag>; |
| DEFINE_OPERATORS_FOR_FLAGS(RegExpFlags) |
| |
| #define V(Lower, Camel, ...) \ |
| constexpr bool Is##Camel(RegExpFlags f) { \ |
| return (f & RegExpFlag::k##Camel) != 0; \ |
| } |
| REGEXP_FLAG_LIST(V) |
| #undef V |
| |
| // clang-format off |
| #define V(Lower, Camel, LowerCamel, Char, Bit) \ |
| c == Char ? RegExpFlag::k##Camel : |
| constexpr base::Optional<RegExpFlag> TryRegExpFlagFromChar(char c) { |
| return REGEXP_FLAG_LIST(V) base::Optional<RegExpFlag>{}; |
| } |
| #undef V |
| // clang-format on |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_REGEXP_REGEXP_FLAGS_H_ |