mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-28 06:24:57 +00:00
demonstrate usage of Cases() mapping several strings to the same value; remove trailing spaces
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90230 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -18,7 +18,7 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
/// \brief A switch()-like statement whose cases are string literals.
|
/// \brief A switch()-like statement whose cases are string literals.
|
||||||
///
|
///
|
||||||
/// The StringSwitch class is a simple form of a switch() statement that
|
/// The StringSwitch class is a simple form of a switch() statement that
|
||||||
@ -35,48 +35,48 @@ namespace llvm {
|
|||||||
/// .Case("green", Green)
|
/// .Case("green", Green)
|
||||||
/// .Case("blue", Blue)
|
/// .Case("blue", Blue)
|
||||||
/// .Case("indigo", Indigo)
|
/// .Case("indigo", Indigo)
|
||||||
/// .Case("violet", Violet)
|
/// .Cases("violet", "purple", Violet)
|
||||||
/// .Default(UnknownColor);
|
/// .Default(UnknownColor);
|
||||||
/// \endcode
|
/// \endcode
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class StringSwitch {
|
class StringSwitch {
|
||||||
/// \brief The string we are matching.
|
/// \brief The string we are matching.
|
||||||
StringRef Str;
|
StringRef Str;
|
||||||
|
|
||||||
/// \brief The result of this switch statement, once known.
|
/// \brief The result of this switch statement, once known.
|
||||||
T Result;
|
T Result;
|
||||||
|
|
||||||
/// \brief Set true when the result of this switch is already known; in this
|
/// \brief Set true when the result of this switch is already known; in this
|
||||||
/// case, Result is valid.
|
/// case, Result is valid.
|
||||||
bool ResultKnown;
|
bool ResultKnown;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit StringSwitch(StringRef Str)
|
explicit StringSwitch(StringRef Str)
|
||||||
: Str(Str), ResultKnown(false) { }
|
: Str(Str), ResultKnown(false) { }
|
||||||
|
|
||||||
template<unsigned N>
|
template<unsigned N>
|
||||||
StringSwitch& Case(const char (&S)[N], const T& Value) {
|
StringSwitch& Case(const char (&S)[N], const T& Value) {
|
||||||
if (!ResultKnown && N-1 == Str.size() &&
|
if (!ResultKnown && N-1 == Str.size() &&
|
||||||
(std::memcmp(S, Str.data(), N-1) == 0)) {
|
(std::memcmp(S, Str.data(), N-1) == 0)) {
|
||||||
Result = Value;
|
Result = Value;
|
||||||
ResultKnown = true;
|
ResultKnown = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<unsigned N0, unsigned N1>
|
template<unsigned N0, unsigned N1>
|
||||||
StringSwitch& Cases(const char (&S0)[N0], const char (&S1)[N1],
|
StringSwitch& Cases(const char (&S0)[N0], const char (&S1)[N1],
|
||||||
const T& Value) {
|
const T& Value) {
|
||||||
return Case(S0, Value).Case(S1, Value);
|
return Case(S0, Value).Case(S1, Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<unsigned N0, unsigned N1, unsigned N2>
|
template<unsigned N0, unsigned N1, unsigned N2>
|
||||||
StringSwitch& Cases(const char (&S0)[N0], const char (&S1)[N1],
|
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).Case(S1, Value).Case(S2, Value);
|
return Case(S0, Value).Case(S1, Value).Case(S2, Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<unsigned N0, unsigned N1, unsigned N2, unsigned N3>
|
template<unsigned N0, unsigned N1, unsigned N2, unsigned N3>
|
||||||
StringSwitch& Cases(const char (&S0)[N0], const char (&S1)[N1],
|
StringSwitch& Cases(const char (&S0)[N0], const char (&S1)[N1],
|
||||||
const char (&S2)[N2], const char (&S3)[N3],
|
const char (&S2)[N2], const char (&S3)[N3],
|
||||||
@ -87,18 +87,18 @@ public:
|
|||||||
template<unsigned N0, unsigned N1, unsigned N2, unsigned N3, unsigned N4>
|
template<unsigned N0, unsigned N1, unsigned N2, unsigned N3, unsigned N4>
|
||||||
StringSwitch& Cases(const char (&S0)[N0], const char (&S1)[N1],
|
StringSwitch& Cases(const char (&S0)[N0], const char (&S1)[N1],
|
||||||
const char (&S2)[N2], const char (&S3)[N3],
|
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).Case(S1, Value).Case(S2, Value).Case(S3, Value)
|
return Case(S0, Value).Case(S1, Value).Case(S2, Value).Case(S3, Value)
|
||||||
.Case(S4, Value);
|
.Case(S4, Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
T Default(const T& Value) {
|
T Default(const T& Value) {
|
||||||
if (ResultKnown)
|
if (ResultKnown)
|
||||||
return Result;
|
return Result;
|
||||||
|
|
||||||
return Value;
|
return Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
operator T() {
|
operator T() {
|
||||||
assert(ResultKnown && "Fell off the end of a string-switch");
|
assert(ResultKnown && "Fell off the end of a string-switch");
|
||||||
return Result;
|
return Result;
|
||||||
|
Reference in New Issue
Block a user