13#ifndef LLVM_ADT_STRINGSWITCH_H
14#define LLVM_ADT_STRINGSWITCH_H
20#include <initializer_list>
46template<
typename T,
typename R = T>
53 std::optional<T> Result;
57 : Str(S), Result() { }
75 if (!Result && Str.ends_with(S)) {
76 Result = std::move(
Value);
82 if (!Result && Str.starts_with(S)) {
83 Result = std::move(
Value);
90 return CasesImpl(CaseStrings,
Value);
93 [[deprecated(
"Pass cases in std::initializer_list instead")]]
95 return CasesImpl({S0,
S1},
Value);
98 [[deprecated(
"Pass cases in std::initializer_list instead")]]
101 return CasesImpl({S0,
S1, S2},
Value);
104 [[deprecated(
"Pass cases in std::initializer_list instead")]]
107 return CasesImpl({S0,
S1, S2, S3},
Value);
110 [[deprecated(
"Pass cases in std::initializer_list instead")]]
113 return CasesImpl({S0,
S1, S2, S3, S4},
Value);
116 [[deprecated(
"Pass cases in std::initializer_list instead")]]
120 return CasesImpl({S0,
S1, S2, S3, S4, S5},
Value);
123 [[deprecated(
"Pass cases in std::initializer_list instead")]]
127 return CasesImpl({S0,
S1, S2, S3, S4, S5, S6},
Value);
130 [[deprecated(
"Pass cases in std::initializer_list instead")]]
134 return CasesImpl({S0,
S1, S2, S3, S4, S5, S6, S7},
Value);
137 [[deprecated(
"Pass cases in std::initializer_list instead")]]
142 return CasesImpl({S0,
S1, S2, S3, S4, S5, S6, S7,
S8},
Value);
145 [[deprecated(
"Pass cases in std::initializer_list instead")]]
150 return CasesImpl({S0,
S1, S2, S3, S4, S5, S6, S7,
S8, S9},
Value);
155 CaseLowerImpl(S,
Value);
160 if (!Result && Str.ends_with_insensitive(S))
167 if (!Result && Str.starts_with_insensitive(S))
168 Result = std::move(
Value);
175 return CasesLowerImpl(CaseStrings,
Value);
178 [[deprecated(
"Pass cases in std::initializer_list instead")]]
180 return CasesLowerImpl({S0,
S1},
Value);
183 [[deprecated(
"Pass cases in std::initializer_list instead")]]
186 return CasesLowerImpl({S0,
S1, S2},
Value);
189 [[deprecated(
"Pass cases in std::initializer_list instead")]]
192 return CasesLowerImpl({S0,
S1, S2, S3},
Value);
195 [[deprecated(
"Pass cases in std::initializer_list instead")]]
198 return CasesLowerImpl({S0,
S1, S2, S3, S4},
Value);
203 return std::move(*Result);
209 const char *Message =
"Fell off the end of a string-switch") {
211 return std::move(*Result);
227 Result = std::move(
Value);
237 if (!Str.equals_insensitive(S))
240 Result = std::move(Value);
247 for (StringLiteral S :
Cases)
248 if (CaseImpl(S,
Value))
256 for (StringLiteral S :
Cases)
257 if (CaseLowerImpl(S,
Value))
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
StringRef - Represent a constant reference to a string, i.e.
StringSwitch & CasesLower(StringLiteral S0, StringLiteral S1, StringLiteral S2, StringLiteral S3, StringLiteral S4, T Value)
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, StringLiteral S2, StringLiteral S3, StringLiteral S4, StringLiteral S5, T Value)
StringSwitch & EndsWithLower(StringLiteral S, T Value)
StringSwitch & StartsWithLower(StringLiteral S, T Value)
StringSwitch & CaseLower(StringLiteral S, T Value)
StringSwitch & Case(StringLiteral S, T Value)
StringSwitch & CasesLower(StringLiteral S0, StringLiteral S1, T Value)
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, StringLiteral S2, StringLiteral S3, StringLiteral S4, T Value)
void operator=(StringSwitch &&)=delete
void operator=(const StringSwitch &)=delete
StringSwitch & CasesLower(StringLiteral S0, StringLiteral S1, StringLiteral S2, StringLiteral S3, T Value)
R DefaultUnreachable(const char *Message="Fell off the end of a string-switch")
Declare default as unreachable, making sure that all cases were handled.
StringSwitch & CasesLower(std::initializer_list< StringLiteral > CaseStrings, T Value)
StringSwitch & StartsWith(StringLiteral S, T Value)
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, StringLiteral S2, StringLiteral S3, StringLiteral S4, StringLiteral S5, StringLiteral S6, StringLiteral S7, StringLiteral S8, T Value)
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, T Value)
StringSwitch(const StringSwitch &)=delete
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, StringLiteral S2, StringLiteral S3, T Value)
StringSwitch & EndsWith(StringLiteral S, T Value)
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, StringLiteral S2, StringLiteral S3, StringLiteral S4, StringLiteral S5, StringLiteral S6, StringLiteral S7, T Value)
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, StringLiteral S2, StringLiteral S3, StringLiteral S4, StringLiteral S5, StringLiteral S6, T Value)
StringSwitch(StringSwitch &&)=default
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, StringLiteral S2, T Value)
StringSwitch & Cases(std::initializer_list< StringLiteral > CaseStrings, T Value)
StringSwitch(StringRef S)
StringSwitch & Cases(StringLiteral S0, StringLiteral S1, StringLiteral S2, StringLiteral S3, StringLiteral S4, StringLiteral S5, StringLiteral S6, StringLiteral S7, StringLiteral S8, StringLiteral S9, T Value)
StringSwitch & CasesLower(StringLiteral S0, StringLiteral S1, StringLiteral S2, T Value)
LLVM Value Representation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value