Hi all,
attached patch simplifies StringSwitch and gets rid of the
Copy{Constructible|Assignable} constraint on the type parameter.
It should also be a bit more efficient, in runtime and space.
I know that several PRs are open against LLVM optimizations
that focus on this construct, so I did not commit this directly.
Ok to commit (someday) ?
Cheers,
Gabor
Index: /home/ggreif/llvm/include/llvm/ADT/StringSwitch.h
===================================================================
--- /home/ggreif/llvm/include/llvm/ADT/StringSwitch.h (revision 90445)
+++ /home/ggreif/llvm/include/llvm/ADT/StringSwitch.h (working copy)
@@ -43,23 +43,19 @@
/// \brief The string we are matching.
StringRef Str;
- /// \brief The result of this switch statement, once known.
- T Result;
+ /// \brief The pointer to the result of this switch statement, once known,
+ /// null before that.
+ const T *Result;
- /// \brief Set true when the result of this switch is already known; in this
- /// case, Result is valid.
- bool ResultKnown;
-
public:
explicit StringSwitch(StringRef Str)
- : Str(Str), ResultKnown(false) { }
+ : Str(Str), Result(0) { }
template<unsigned N>
StringSwitch& Case(const char (&S)[N], const T& Value) {
- if (!ResultKnown && N-1 == Str.size() &&
+ if (!Result && N-1 == Str.size() &&
(std::memcmp(S, Str.data(), N-1) == 0)) {
- Result = Value;
- ResultKnown = true;
+ Result = &Value;
}
return *this;
@@ -92,16 +88,16 @@
.Case(S4, Value);
}
- T Default(const T& Value) {
- if (ResultKnown)
- return Result;
+ const T& Default(const T& Value) {
+ if (Result)
+ return *Result;
return Value;
}
operator T() {
- assert(ResultKnown && "Fell off the end of a string-switch");
- return Result;
+ assert(Result && "Fell off the end of a string-switch");
+ return *Result;
}
};
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits