32 for (
unsigned i = 0, e = Matches[0]->first.size();
i != e; ++
i) {
34 char Letter = Matches[0]->first[
i];
36 for (
unsigned str = 0, e = Matches.size(); str != e; ++str)
37 if (Matches[str]->first[
i] != Letter)
41 return Matches[0]->first.size();
50 EmitStringMatcherForChar(
const std::vector<const StringPair*> &Matches,
51 unsigned CharNo,
unsigned IndentCount)
const {
52 assert(!Matches.empty() &&
"Must have at least one string to match!");
53 std::string Indent(IndentCount*2+4,
' ');
57 if (CharNo == Matches[0]->first.size()) {
58 assert(Matches.size() == 1 &&
"Had duplicate keys to match on");
63 std::pair<StringRef, StringRef>
Split = Code.split(
'\n');
64 OS << Indent << Split.first <<
"\t // \"" << Matches[0]->first <<
"\"\n";
67 while (!Code.empty()) {
68 Split = Code.split(
'\n');
69 OS << Indent << Split.first <<
"\n";
76 std::map<char, std::vector<const StringPair*>> MatchesByLetter;
78 for (
unsigned i = 0, e = Matches.size();
i != e; ++
i)
79 MatchesByLetter[Matches[
i]->first[CharNo]].push_back(Matches[
i]);
84 if (MatchesByLetter.size() == 1) {
86 unsigned NumChars = FirstNonCommonLetter-CharNo;
92 OS << Indent <<
"if (" << StrVariableName <<
"[" << CharNo <<
"] != '"
93 << Matches[0]->first[CharNo] <<
"')\n";
94 OS << Indent <<
" break;\n";
98 OS << Indent <<
"if (memcmp(" << StrVariableName <<
".data()+" << CharNo
99 <<
", \"" << Matches[0]->first.
substr(CharNo, NumChars) <<
"\", "
100 << NumChars <<
") != 0)\n";
101 OS << Indent <<
" break;\n";
104 return EmitStringMatcherForChar(Matches, FirstNonCommonLetter, IndentCount);
109 OS << Indent <<
"switch (" << StrVariableName <<
"[" << CharNo <<
"]) {\n";
110 OS << Indent <<
"default: break;\n";
112 for (std::map<
char, std::vector<const StringPair*>>::iterator LI =
113 MatchesByLetter.begin(),
E = MatchesByLetter.end(); LI !=
E; ++LI) {
115 OS << Indent <<
"case '" << LI->first <<
"':\t // "
116 << LI->second.size() <<
" string";
117 if (LI->second.size() != 1) OS <<
's';
118 OS <<
" to match.\n";
119 if (EmitStringMatcherForChar(LI->second, CharNo+1, IndentCount+1))
120 OS << Indent <<
" break;\n";
123 OS << Indent <<
"}\n";
131 if (Matches.empty())
return;
134 std::map<unsigned, std::vector<const StringPair*>> MatchesByLength;
136 for (
unsigned i = 0, e = Matches.size(); i != e; ++
i)
137 MatchesByLength[Matches[i].first.size()].push_back(&Matches[i]);
141 OS.
indent(Indent*2+2) <<
"switch (" << StrVariableName <<
".size()) {\n";
142 OS.
indent(Indent*2+2) <<
"default: break;\n";
144 for (std::map<
unsigned, std::vector<const StringPair*>>::iterator LI =
145 MatchesByLength.begin(),
E = MatchesByLength.end(); LI !=
E; ++LI) {
146 OS.
indent(Indent*2+2) <<
"case " << LI->first <<
":\t // "
148 <<
" string" << (LI->second.size() == 1 ?
"" :
"s") <<
" to match.\n";
149 if (EmitStringMatcherForChar(LI->second, 0, Indent))
150 OS.
indent(Indent*2+4) <<
"break;\n";
153 OS.
indent(Indent*2+2) <<
"}\n";
std::pair< std::string, std::string > StringPair
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
static GCRegistry::Add< CoreCLRGC > E("coreclr","CoreCLR-compatible GC")
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
static unsigned FindFirstNonCommonLetter(const std::vector< const StringMatcher::StringPair * > &Matches)
FindFirstNonCommonLetter - Find the first character in the keys of the string pairs that is not share...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
StringRef - Represent a constant reference to a string, i.e.
void Emit(unsigned Indent=0) const
Emit - Top level entry point.
static void Split(std::vector< std::string > &V, StringRef S)
Split - Splits a string of comma separated items in to a vector of strings.