66//
77// ===----------------------------------------------------------------------===//
88
9+ #include < array>
910#include < cmath>
1011#include < optional>
1112
1213#include " DurationRewriter.h"
1314#include " clang/Tooling/FixIt.h"
14- #include " llvm/ADT/IndexedMap.h"
1515
1616using namespace clang ::ast_matchers;
1717
1818namespace clang ::tidy::abseil {
1919
20- struct DurationScale2IndexFunctor {
21- using argument_type = DurationScale;
22- unsigned operator ()(DurationScale Scale) const {
23- return static_cast <unsigned >(Scale);
24- }
25- };
26-
2720// / Returns an integer if the fractional part of a `FloatingLiteral` is `0`.
2821static std::optional<llvm::APSInt>
2922truncateIfIntegral (const FloatingLiteral &FloatLiteral) {
@@ -39,31 +32,17 @@ truncateIfIntegral(const FloatingLiteral &FloatLiteral) {
3932
4033const std::pair<llvm::StringRef, llvm::StringRef> &
4134getDurationInverseForScale (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)];
6746}
6847
6948// / If `Node` is a call to the inverse of `Scale`, return that inverse's
@@ -103,58 +82,31 @@ rewriteInverseTimeCall(const MatchFinder::MatchResult &Result,
10382
10483// / Returns the factory function name for a given `Scale`.
10584llvm::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)];
12191}
12292
12393llvm::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)];
139100}
140101
141102// / Returns the Time factory function name for a given `Scale`.
142103llvm::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)];
158110}
159111
160112// / Returns `true` if `Node` is a value which evaluates to a literal `0`.
0 commit comments