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