Index: include/llvm/ADT/StringSwitch.h =================================================================== --- include/llvm/ADT/StringSwitch.h +++ include/llvm/ADT/StringSwitch.h @@ -75,7 +75,6 @@ (std::memcmp(S, Str.data(), N-1) == 0)) { Result = &Value; } - return *this; } @@ -86,7 +85,6 @@ std::memcmp(S, Str.data() + Str.size() + 1 - N, N-1) == 0) { Result = &Value; } - return *this; } @@ -97,7 +95,6 @@ std::memcmp(S, Str.data(), N-1) == 0) { Result = &Value; } - return *this; } @@ -105,27 +102,14 @@ LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch& Cases(const char (&S0)[N0], const char (&S1)[N1], const T& Value) { - if (!Result && ( - (N0-1 == Str.size() && std::memcmp(S0, Str.data(), N0-1) == 0) || - (N1-1 == Str.size() && std::memcmp(S1, Str.data(), N1-1) == 0))) { - Result = &Value; - } - - return *this; + 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) { - if (!Result && ( - (N0-1 == Str.size() && std::memcmp(S0, Str.data(), N0-1) == 0) || - (N1-1 == Str.size() && std::memcmp(S1, Str.data(), N1-1) == 0) || - (N2-1 == Str.size() && std::memcmp(S2, Str.data(), N2-1) == 0))) { - Result = &Value; - } - - return *this; + return Case(S0, Value).Cases(S1, S2, Value); } template @@ -133,15 +117,7 @@ StringSwitch& Cases(const char (&S0)[N0], const char (&S1)[N1], const char (&S2)[N2], const char (&S3)[N3], const T& Value) { - if (!Result && ( - (N0-1 == Str.size() && std::memcmp(S0, Str.data(), N0-1) == 0) || - (N1-1 == Str.size() && std::memcmp(S1, Str.data(), N1-1) == 0) || - (N2-1 == Str.size() && std::memcmp(S2, Str.data(), N2-1) == 0) || - (N3-1 == Str.size() && std::memcmp(S3, Str.data(), N3-1) == 0))) { - Result = &Value; - } - - return *this; + return Case(S0, Value).Cases(S1, S2, S3, Value); } template @@ -149,23 +125,67 @@ 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) { - if (!Result && ( - (N0-1 == Str.size() && std::memcmp(S0, Str.data(), N0-1) == 0) || - (N1-1 == Str.size() && std::memcmp(S1, Str.data(), N1-1) == 0) || - (N2-1 == Str.size() && std::memcmp(S2, Str.data(), N2-1) == 0) || - (N3-1 == Str.size() && std::memcmp(S3, Str.data(), N3-1) == 0) || - (N4-1 == Str.size() && std::memcmp(S4, Str.data(), N4-1) == 0))) { - Result = &Value; - } + return Case(S0, Value).Cases(S1, S2, S3, S4, Value); + } - return *this; + template + 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 char (&S5)[N5], + const T& Value) { + return Case(S0, Value).Cases(S1, S2, S3, S4, S5, Value); + } + + template + 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 char (&S5)[N5], + const char (&S6)[N6], const T& Value) { + return Case(S0, Value).Cases(S1, S2, S3, S4, S5, S6, Value); + } + + template + 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 char (&S5)[N5], + const char (&S6)[N6], const char (&S7)[N7], + const T& Value) { + return Case(S0, Value).Cases(S1, S2, S3, S4, S5, S6, S7, Value); + } + + template + 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 char (&S5)[N5], + const char (&S6)[N6], const char (&S7)[N7], + const char (&S8)[N8], const T& Value) { + return Case(S0, Value).Cases(S1, S2, S3, S4, S5, S6, S7, S8, Value); + } + + template + 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 char (&S5)[N5], + const char (&S6)[N6], const char (&S7)[N7], + const char (&S8)[N8], const char (&S9)[N9], + const T& Value) { + return Case(S0, Value).Cases(S1, S2, S3, S4, S5, S6, S7, S8, S9, Value); } LLVM_ATTRIBUTE_ALWAYS_INLINE R Default(const T& Value) const { if (Result) return *Result; - return Value; }