6
6
//
7
7
// ===----------------------------------------------------------------------===//
8
8
9
+ #include < array>
9
10
#include < cmath>
10
11
#include < optional>
11
12
12
13
#include " DurationRewriter.h"
13
14
#include " clang/Tooling/FixIt.h"
14
- #include " llvm/ADT/IndexedMap.h"
15
15
16
16
using namespace clang ::ast_matchers;
17
17
18
18
namespace clang ::tidy::abseil {
19
19
20
- struct DurationScale2IndexFunctor {
21
- using argument_type = DurationScale;
22
- unsigned operator ()(DurationScale Scale) const {
23
- return static_cast <unsigned >(Scale);
24
- }
25
- };
26
-
27
20
// / Returns an integer if the fractional part of a `FloatingLiteral` is `0`.
28
21
static std::optional<llvm::APSInt>
29
22
truncateIfIntegral (const FloatingLiteral &FloatLiteral) {
@@ -39,31 +32,17 @@ truncateIfIntegral(const FloatingLiteral &FloatLiteral) {
39
32
40
33
const std::pair<llvm::StringRef, llvm::StringRef> &
41
34
getDurationInverseForScale (DurationScale Scale) {
42
- static const llvm::IndexedMap<std::pair<llvm::StringRef, llvm::StringRef>,
43
- DurationScale2IndexFunctor>
44
- InverseMap = []() {
45
- // TODO: Revisit the immediately invoked lambda technique when
46
- // IndexedMap gets an initializer list constructor.
47
- llvm::IndexedMap<std::pair<llvm::StringRef, llvm::StringRef>,
48
- DurationScale2IndexFunctor>
49
- InverseMap;
50
- InverseMap.resize (6 );
51
- InverseMap[DurationScale::Hours] =
52
- std::make_pair (" ::absl::ToDoubleHours" , " ::absl::ToInt64Hours" );
53
- InverseMap[DurationScale::Minutes] =
54
- std::make_pair (" ::absl::ToDoubleMinutes" , " ::absl::ToInt64Minutes" );
55
- InverseMap[DurationScale::Seconds] =
56
- std::make_pair (" ::absl::ToDoubleSeconds" , " ::absl::ToInt64Seconds" );
57
- InverseMap[DurationScale::Milliseconds] = std::make_pair (
58
- " ::absl::ToDoubleMilliseconds" , " ::absl::ToInt64Milliseconds" );
59
- InverseMap[DurationScale::Microseconds] = std::make_pair (
60
- " ::absl::ToDoubleMicroseconds" , " ::absl::ToInt64Microseconds" );
61
- InverseMap[DurationScale::Nanoseconds] = std::make_pair (
62
- " ::absl::ToDoubleNanoseconds" , " ::absl::ToInt64Nanoseconds" );
63
- return InverseMap;
64
- }();
65
-
66
- return InverseMap[Scale];
35
+ static constexpr std::array<std::pair<llvm::StringRef, llvm::StringRef>, 6 >
36
+ InverseMap = {{
37
+ {" ::absl::ToDoubleHours" , " ::absl::ToInt64Hours" },
38
+ {" ::absl::ToDoubleMinutes" , " ::absl::ToInt64Minutes" },
39
+ {" ::absl::ToDoubleSeconds" , " ::absl::ToInt64Seconds" },
40
+ {" ::absl::ToDoubleMilliseconds" , " ::absl::ToInt64Milliseconds" },
41
+ {" ::absl::ToDoubleMicroseconds" , " ::absl::ToInt64Microseconds" },
42
+ {" ::absl::ToDoubleNanoseconds" , " ::absl::ToInt64Nanoseconds" },
43
+ }};
44
+
45
+ return InverseMap[llvm::to_underlying (Scale)];
67
46
}
68
47
69
48
// / If `Node` is a call to the inverse of `Scale`, return that inverse's
@@ -103,58 +82,31 @@ rewriteInverseTimeCall(const MatchFinder::MatchResult &Result,
103
82
104
83
// / Returns the factory function name for a given `Scale`.
105
84
llvm::StringRef getDurationFactoryForScale (DurationScale Scale) {
106
- switch (Scale) {
107
- case DurationScale::Hours:
108
- return " absl::Hours" ;
109
- case DurationScale::Minutes:
110
- return " absl::Minutes" ;
111
- case DurationScale::Seconds:
112
- return " absl::Seconds" ;
113
- case DurationScale::Milliseconds:
114
- return " absl::Milliseconds" ;
115
- case DurationScale::Microseconds:
116
- return " absl::Microseconds" ;
117
- case DurationScale::Nanoseconds:
118
- return " absl::Nanoseconds" ;
119
- }
120
- llvm_unreachable (" unknown scaling factor" );
85
+ static constexpr std::array<llvm::StringRef, 6 > FactoryMap = {
86
+ " absl::Hours" , " absl::Minutes" , " absl::Seconds" ,
87
+ " absl::Milliseconds" , " absl::Microseconds" , " absl::Nanoseconds" ,
88
+ };
89
+
90
+ return FactoryMap[llvm::to_underlying (Scale)];
121
91
}
122
92
123
93
llvm::StringRef getTimeFactoryForScale (DurationScale Scale) {
124
- switch (Scale) {
125
- case DurationScale::Hours:
126
- return " absl::FromUnixHours" ;
127
- case DurationScale::Minutes:
128
- return " absl::FromUnixMinutes" ;
129
- case DurationScale::Seconds:
130
- return " absl::FromUnixSeconds" ;
131
- case DurationScale::Milliseconds:
132
- return " absl::FromUnixMillis" ;
133
- case DurationScale::Microseconds:
134
- return " absl::FromUnixMicros" ;
135
- case DurationScale::Nanoseconds:
136
- return " absl::FromUnixNanos" ;
137
- }
138
- llvm_unreachable (" unknown scaling factor" );
94
+ static constexpr std::array<llvm::StringRef, 6 > FactoryMap = {
95
+ " absl::FromUnixHours" , " absl::FromUnixMinutes" , " absl::FromUnixSeconds" ,
96
+ " absl::FromUnixMillis" , " absl::FromUnixMicros" , " absl::FromUnixNanos" ,
97
+ };
98
+
99
+ return FactoryMap[llvm::to_underlying (Scale)];
139
100
}
140
101
141
102
// / Returns the Time factory function name for a given `Scale`.
142
103
llvm::StringRef getTimeInverseForScale (DurationScale Scale) {
143
- switch (Scale) {
144
- case DurationScale::Hours:
145
- return " absl::ToUnixHours" ;
146
- case DurationScale::Minutes:
147
- return " absl::ToUnixMinutes" ;
148
- case DurationScale::Seconds:
149
- return " absl::ToUnixSeconds" ;
150
- case DurationScale::Milliseconds:
151
- return " absl::ToUnixMillis" ;
152
- case DurationScale::Microseconds:
153
- return " absl::ToUnixMicros" ;
154
- case DurationScale::Nanoseconds:
155
- return " absl::ToUnixNanos" ;
156
- }
157
- llvm_unreachable (" unknown scaling factor" );
104
+ static constexpr std::array<llvm::StringRef, 6 > InverseMap = {
105
+ " absl::ToUnixHours" , " absl::ToUnixMinutes" , " absl::ToUnixSeconds" ,
106
+ " absl::ToUnixMillis" , " absl::ToUnixMicros" , " absl::ToUnixNanos" ,
107
+ };
108
+
109
+ return InverseMap[llvm::to_underlying (Scale)];
158
110
}
159
111
160
112
// / Returns `true` if `Node` is a value which evaluates to a literal `0`.
0 commit comments