diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/TableGen/StringMatcher.h | 12 | ||||
-rw-r--r-- | llvm/lib/TableGen/StringMatcher.cpp | 33 |
2 files changed, 21 insertions, 24 deletions
diff --git a/llvm/include/llvm/TableGen/StringMatcher.h b/llvm/include/llvm/TableGen/StringMatcher.h index 795b7a6..4976988 100644 --- a/llvm/include/llvm/TableGen/StringMatcher.h +++ b/llvm/include/llvm/TableGen/StringMatcher.h @@ -13,10 +13,10 @@ #ifndef LLVM_TABLEGEN_STRINGMATCHER_H #define LLVM_TABLEGEN_STRINGMATCHER_H +#include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include <string> #include <utility> -#include <vector> namespace llvm { @@ -33,18 +33,18 @@ public: private: StringRef StrVariableName; - const std::vector<StringPair> &Matches; + ArrayRef<StringPair> Matches; raw_ostream &OS; public: - StringMatcher(StringRef strVariableName, - const std::vector<StringPair> &matches, raw_ostream &os) - : StrVariableName(strVariableName), Matches(matches), OS(os) {} + StringMatcher(StringRef StrVariableName, ArrayRef<StringPair> Matches, + raw_ostream &OS) + : StrVariableName(StrVariableName), Matches(Matches), OS(OS) {} void Emit(unsigned Indent = 0, bool IgnoreDuplicates = false) const; private: - bool EmitStringMatcherForChar(const std::vector<const StringPair *> &Matches, + bool EmitStringMatcherForChar(ArrayRef<const StringPair *> Matches, unsigned CharNo, unsigned IndentCount, bool IgnoreDuplicates) const; }; diff --git a/llvm/lib/TableGen/StringMatcher.cpp b/llvm/lib/TableGen/StringMatcher.cpp index c169b4e..b85849e 100644 --- a/llvm/lib/TableGen/StringMatcher.cpp +++ b/llvm/lib/TableGen/StringMatcher.cpp @@ -26,16 +26,13 @@ using namespace llvm; /// string pairs that is not shared across the whole set of strings. All /// strings are assumed to have the same length. static unsigned -FindFirstNonCommonLetter(const std::vector<const - StringMatcher::StringPair*> &Matches) { +FindFirstNonCommonLetter(ArrayRef<const StringMatcher::StringPair *> Matches) { assert(!Matches.empty()); - for (unsigned i = 0, e = Matches[0]->first.size(); i != e; ++i) { - // Check to see if letter i is the same across the set. - char Letter = Matches[0]->first[i]; - + for (auto [Idx, Letter] : enumerate(Matches[0]->first)) { + // Check to see if `Letter` is the same across the set. for (const StringMatcher::StringPair *Match : Matches) - if (Match->first[i] != Letter) - return i; + if (Match->first[Idx] != Letter) + return Idx; } return Matches[0]->first.size(); @@ -47,8 +44,8 @@ FindFirstNonCommonLetter(const std::vector<const /// /// \return - True if control can leave the emitted code fragment. bool StringMatcher::EmitStringMatcherForChar( - const std::vector<const StringPair *> &Matches, unsigned CharNo, - unsigned IndentCount, bool IgnoreDuplicates) const { + ArrayRef<const StringPair *> Matches, unsigned CharNo, unsigned IndentCount, + bool IgnoreDuplicates) const { assert(!Matches.empty() && "Must have at least one string to match!"); std::string Indent(IndentCount * 2 + 4, ' '); @@ -110,14 +107,14 @@ bool StringMatcher::EmitStringMatcherForChar( OS << Indent << "switch (" << StrVariableName << "[" << CharNo << "]) {\n"; OS << Indent << "default: break;\n"; - for (const auto &LI : MatchesByLetter) { + for (const auto &[Letter, Matches] : MatchesByLetter) { // TODO: escape hard stuff (like \n) if we ever care about it. - OS << Indent << "case '" << LI.first << "':\t // " << LI.second.size() + OS << Indent << "case '" << Letter << "':\t // " << Matches.size() << " string"; - if (LI.second.size() != 1) + if (Matches.size() != 1) OS << 's'; OS << " to match.\n"; - if (EmitStringMatcherForChar(LI.second, CharNo + 1, IndentCount + 1, + if (EmitStringMatcherForChar(Matches, CharNo + 1, IndentCount + 1, IgnoreDuplicates)) OS << Indent << " break;\n"; } @@ -143,11 +140,11 @@ void StringMatcher::Emit(unsigned Indent, bool IgnoreDuplicates) const { OS.indent(Indent*2+2) << "switch (" << StrVariableName << ".size()) {\n"; OS.indent(Indent*2+2) << "default: break;\n"; - for (const auto &LI : MatchesByLength) { + for (const auto &[Length, Matches] : MatchesByLength) { OS.indent(Indent * 2 + 2) - << "case " << LI.first << ":\t // " << LI.second.size() << " string" - << (LI.second.size() == 1 ? "" : "s") << " to match.\n"; - if (EmitStringMatcherForChar(LI.second, 0, Indent, IgnoreDuplicates)) + << "case " << Length << ":\t // " << Matches.size() << " string" + << (Matches.size() == 1 ? "" : "s") << " to match.\n"; + if (EmitStringMatcherForChar(Matches, 0, Indent, IgnoreDuplicates)) OS.indent(Indent*2+4) << "break;\n"; } |