[cfe-commits] [PATCH] Simplify StringSwitch
Daniel Dunbar
daniel at zuster.org
Fri Dec 4 18:54:17 PST 2009
Speaking personally, I can't convince myself this is an improvement.
- Daniel
On Thu, Dec 3, 2009 at 3:53 AM, Gabor Greif <gabor at mac.com> wrote:
> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
More information about the cfe-commits
mailing list