Skip to content

Commit 5e1b416

Browse files
authored
[clang-tidy][NFC] Construct map at compile time (#158166)
The important part of this PR is the changes to `getDurationInverseForScale`. I changed the other `get*ForScale` functions so that they all follow the same pattern, but those aren't as important.
1 parent ac2b51e commit 5e1b416

File tree

1 file changed

+30
-78
lines changed

1 file changed

+30
-78
lines changed

clang-tools-extra/clang-tidy/abseil/DurationRewriter.cpp

Lines changed: 30 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,17 @@
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

1616
using namespace clang::ast_matchers;
1717

1818
namespace 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`.
2821
static std::optional<llvm::APSInt>
2922
truncateIfIntegral(const FloatingLiteral &FloatLiteral) {
@@ -39,31 +32,17 @@ truncateIfIntegral(const FloatingLiteral &FloatLiteral) {
3932

4033
const std::pair<llvm::StringRef, llvm::StringRef> &
4134
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)];
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`.
10584
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)];
12191
}
12292

12393
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)];
139100
}
140101

141102
/// Returns the Time factory function name for a given `Scale`.
142103
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)];
158110
}
159111

160112
/// Returns `true` if `Node` is a value which evaluates to a literal `0`.

0 commit comments

Comments
 (0)