[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