Index: include/llvm/ADT/StringSwitch.h =================================================================== --- include/llvm/ADT/StringSwitch.h +++ include/llvm/ADT/StringSwitch.h @@ -14,6 +14,7 @@ #define LLVM_ADT_STRINGSWITCH_H #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/Optional.h" #include "llvm/Support/Compiler.h" #include #include @@ -44,14 +45,13 @@ /// \brief The string we are matching. StringRef Str; - /// \brief The pointer to the result of this switch statement, once known, - /// null before that. - const T *Result; + /// \brief The result of this switch statement. + Optional Result; public: LLVM_ATTRIBUTE_ALWAYS_INLINE explicit StringSwitch(StringRef S) - : Str(S), Result(nullptr) { } + : Str(S), Result() { } // StringSwitch is not copyable. StringSwitch(const StringSwitch &) = delete; @@ -71,33 +71,33 @@ // Case-sensitive case matchers template LLVM_ATTRIBUTE_ALWAYS_INLINE - StringSwitch& Case(const char (&S)[N], const T& Value) { + StringSwitch& Case(const char (&S)[N], const T Value) { assert(N); if (!Result && N-1 == Str.size() && (N == 1 || std::memcmp(S, Str.data(), N-1) == 0)) { - Result = &Value; + Result = Value; } return *this; } template LLVM_ATTRIBUTE_ALWAYS_INLINE - StringSwitch& EndsWith(const char (&S)[N], const T &Value) { + StringSwitch& EndsWith(const char (&S)[N], const T Value) { assert(N); if (!Result && Str.size() >= N-1 && (N == 1 || std::memcmp(S, Str.data() + Str.size() + 1 - N, N-1) == 0)) { - Result = &Value; + Result = Value; } return *this; } template LLVM_ATTRIBUTE_ALWAYS_INLINE - StringSwitch& StartsWith(const char (&S)[N], const T &Value) { + StringSwitch& StartsWith(const char (&S)[N], const T Value) { assert(N); if (!Result && Str.size() >= N-1 && (N == 1 || std::memcmp(S, Str.data(), N-1) == 0)) { - Result = &Value; + Result = Value; } return *this; } @@ -105,14 +105,14 @@ template LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch &Cases(const char (&S0)[N0], const char (&S1)[N1], - const T& Value) { + const T Value) { return Case(S0, Value).Case(S1, Value); } template LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch &Cases(const char (&S0)[N0], const char (&S1)[N1], - const char (&S2)[N2], const T& Value) { + const char (&S2)[N2], const T Value) { return Case(S0, Value).Cases(S1, S2, Value); } @@ -120,7 +120,7 @@ LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch &Cases(const char (&S0)[N0], const char (&S1)[N1], const char (&S2)[N2], const char (&S3)[N3], - const T& Value) { + const T Value) { return Case(S0, Value).Cases(S1, S2, S3, Value); } @@ -128,7 +128,7 @@ LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch &Cases(const char (&S0)[N0], const char (&S1)[N1], const char (&S2)[N2], const char (&S3)[N3], - const char (&S4)[N4], const T& Value) { + const char (&S4)[N4], const T Value) { return Case(S0, Value).Cases(S1, S2, S3, S4, Value); } @@ -138,7 +138,7 @@ StringSwitch &Cases(const char (&S0)[N0], const char (&S1)[N1], const char (&S2)[N2], const char (&S3)[N3], const char (&S4)[N4], const char (&S5)[N5], - const T &Value) { + const T Value) { return Case(S0, Value).Cases(S1, S2, S3, S4, S5, Value); } @@ -148,7 +148,7 @@ StringSwitch &Cases(const char (&S0)[N0], const char (&S1)[N1], const char (&S2)[N2], const char (&S3)[N3], const char (&S4)[N4], const char (&S5)[N5], - const char (&S6)[N6], const T &Value) { + const char (&S6)[N6], const T Value) { return Case(S0, Value).Cases(S1, S2, S3, S4, S5, S6, Value); } @@ -159,7 +159,7 @@ const char (&S2)[N2], const char (&S3)[N3], const char (&S4)[N4], const char (&S5)[N5], const char (&S6)[N6], const char (&S7)[N7], - const T &Value) { + const T Value) { return Case(S0, Value).Cases(S1, S2, S3, S4, S5, S6, S7, Value); } @@ -170,7 +170,7 @@ const char (&S2)[N2], const char (&S3)[N3], const char (&S4)[N4], const char (&S5)[N5], const char (&S6)[N6], const char (&S7)[N7], - const char (&S8)[N8], const T &Value) { + const char (&S8)[N8], const T Value) { return Case(S0, Value).Cases(S1, S2, S3, S4, S5, S6, S7, S8, Value); } @@ -182,66 +182,66 @@ const char (&S4)[N4], const char (&S5)[N5], const char (&S6)[N6], const char (&S7)[N7], const char (&S8)[N8], const char (&S9)[N9], - const T &Value) { + const T Value) { return Case(S0, Value).Cases(S1, S2, S3, S4, S5, S6, S7, S8, S9, Value); } // Case-insensitive case matchers. template LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch &CaseLower(const char (&S)[N], - const T &Value) { + const T Value) { if (!Result && Str.equals_lower(StringRef(S, N - 1))) - Result = &Value; + Result = Value; return *this; } template LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch &EndsWithLower(const char (&S)[N], - const T &Value) { + const T Value) { if (!Result && Str.endswith_lower(StringRef(S, N - 1))) - Result = &Value; + Result = Value; return *this; } template LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch &StartsWithLower(const char (&S)[N], - const T &Value) { + const T Value) { if (!Result && Str.startswith_lower(StringRef(S, N - 1))) - Result = &Value; + Result = Value; return *this; } template LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch & - CasesLower(const char (&S0)[N0], const char (&S1)[N1], const T &Value) { + CasesLower(const char (&S0)[N0], const char (&S1)[N1], const T Value) { return CaseLower(S0, Value).CaseLower(S1, Value); } template LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch & CasesLower(const char (&S0)[N0], const char (&S1)[N1], const char (&S2)[N2], - const T &Value) { + const T Value) { return CaseLower(S0, Value).CasesLower(S1, S2, Value); } template LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch & CasesLower(const char (&S0)[N0], const char (&S1)[N1], const char (&S2)[N2], - const char (&S3)[N3], const T &Value) { + const char (&S3)[N3], const T Value) { return CaseLower(S0, Value).CasesLower(S1, S2, S3, Value); } template LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch & CasesLower(const char (&S0)[N0], const char (&S1)[N1], const char (&S2)[N2], - const char (&S3)[N3], const char (&S4)[N4], const T &Value) { + const char (&S3)[N3], const char (&S4)[N4], const T Value) { return CaseLower(S0, Value).CasesLower(S1, S2, S3, S4, Value); } LLVM_ATTRIBUTE_ALWAYS_INLINE - R Default(const T &Value) const { + R Default(const T Value) const { if (Result) return *Result; return Value;