• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef V8_REGEXP_REGEXP_FLAGS_H_
6 #define V8_REGEXP_REGEXP_FLAGS_H_
7 
8 #include "src/base/flags.h"
9 #include "src/base/optional.h"
10 
11 namespace v8 {
12 namespace internal {
13 
14 // TODO(jgruber,pthier): Decouple more parts of the codebase from
15 // JSRegExp::Flags. Consider removing JSRegExp::Flags.
16 
17 // Order is important! Sorted in alphabetic order by the flag char. Note this
18 // means that flag bits are shuffled. Take care to keep them contiguous when
19 // adding/removing flags.
20 #define REGEXP_FLAG_LIST(V)                      \
21   V(has_indices, HasIndices, hasIndices, 'd', 7) \
22   V(global, Global, global, 'g', 0)              \
23   V(ignore_case, IgnoreCase, ignoreCase, 'i', 1) \
24   V(linear, Linear, linear, 'l', 6)              \
25   V(multiline, Multiline, multiline, 'm', 2)     \
26   V(dot_all, DotAll, dotAll, 's', 5)             \
27   V(unicode, Unicode, unicode, 'u', 4)           \
28   V(sticky, Sticky, sticky, 'y', 3)
29 
30 #define V(Lower, Camel, LowerCamel, Char, Bit) k##Camel = 1 << Bit,
31 enum class RegExpFlag { REGEXP_FLAG_LIST(V) };
32 #undef V
33 
34 #define V(...) +1
35 constexpr int kRegExpFlagCount = REGEXP_FLAG_LIST(V);
36 #undef V
37 
38 // Assert alpha-sorted chars.
39 #define V(Lower, Camel, LowerCamel, Char, Bit) < Char) && (Char
40 static_assert((('a' - 1) REGEXP_FLAG_LIST(V) <= 'z'), "alpha-sort chars");
41 #undef V
42 
43 // Assert contiguous indices.
44 #define V(Lower, Camel, LowerCamel, Char, Bit) | (1 << Bit)
45 static_assert(((1 << kRegExpFlagCount) - 1) == (0 REGEXP_FLAG_LIST(V)),
46               "contiguous bits");
47 #undef V
48 
49 using RegExpFlags = base::Flags<RegExpFlag>;
50 DEFINE_OPERATORS_FOR_FLAGS(RegExpFlags)
51 
52 #define V(Lower, Camel, ...)                \
53   constexpr bool Is##Camel(RegExpFlags f) { \
54     return (f & RegExpFlag::k##Camel) != 0; \
55   }
REGEXP_FLAG_LIST(V)56 REGEXP_FLAG_LIST(V)
57 #undef V
58 
59 // clang-format off
60 #define V(Lower, Camel, LowerCamel, Char, Bit) \
61   c == Char ? RegExpFlag::k##Camel :
62 constexpr base::Optional<RegExpFlag> TryRegExpFlagFromChar(char c) {
63   return REGEXP_FLAG_LIST(V) base::Optional<RegExpFlag>{};
64 }
65 #undef V
66 // clang-format on
67 
68 }  // namespace internal
69 }  // namespace v8
70 
71 #endif  // V8_REGEXP_REGEXP_FLAGS_H_
72