<div dir="ltr">Oops, you're right.  And I just finished the 30 minute rebuild triggered by changing StringRef.h :-/</div><br><div class="gmail_quote"><div dir="ltr">On Sat, Sep 24, 2016 at 9:11 PM Davide Italiano <<a href="mailto:davide@freebsd.org">davide@freebsd.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Sat, Sep 24, 2016 at 8:27 PM, Zachary Turner via llvm-commits<br class="gmail_msg">
<<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg">
> Author: zturner<br class="gmail_msg">
> Date: Sat Sep 24 22:27:29 2016<br class="gmail_msg">
> New Revision: 282346<br class="gmail_msg">
><br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=282346&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=282346&view=rev</a><br class="gmail_msg">
> Log:<br class="gmail_msg">
> Add some predicated searching functions to StringRef.<br class="gmail_msg">
><br class="gmail_msg">
> This adds 4 new functions to StringRef, which can be used to<br class="gmail_msg">
> take or drop characters while a certain condition is met, or<br class="gmail_msg">
> until a certain condition is met.  They are:<br class="gmail_msg">
><br class="gmail_msg">
> take_while - Return characters until a condition is not met.<br class="gmail_msg">
> take_until - Return characters until a condition is met.<br class="gmail_msg">
> drop_while - Remove characters until a condition is not met.<br class="gmail_msg">
> drop_until - Remove characters until a condition is met.<br class="gmail_msg">
><br class="gmail_msg">
> Internally, all of these functions delegate to two additional<br class="gmail_msg">
> helper functions which can be used to search for the position<br class="gmail_msg">
> of a character meeting or not meeting a condition, which are:<br class="gmail_msg">
><br class="gmail_msg">
> find_if - Find the first character matching a predicate.<br class="gmail_msg">
> find_if_not - Find the first character not matching a predicate.<br class="gmail_msg">
><br class="gmail_msg">
> Differential Revision: <a href="https://reviews.llvm.org/D24842" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D24842</a><br class="gmail_msg">
><br class="gmail_msg">
> Modified:<br class="gmail_msg">
>     llvm/trunk/include/llvm/ADT/StringRef.h<br class="gmail_msg">
>     llvm/trunk/unittests/ADT/StringRefTest.cpp<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/include/llvm/ADT/StringRef.h<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringRef.h?rev=282346&r1=282345&r2=282346&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringRef.h?rev=282346&r1=282345&r2=282346&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/include/llvm/ADT/StringRef.h (original)<br class="gmail_msg">
> +++ llvm/trunk/include/llvm/ADT/StringRef.h Sat Sep 24 22:27:29 2016<br class="gmail_msg">
> @@ -10,6 +10,7 @@<br class="gmail_msg">
>  #ifndef LLVM_ADT_STRINGREF_H<br class="gmail_msg">
>  #define LLVM_ADT_STRINGREF_H<br class="gmail_msg">
><br class="gmail_msg">
> +#include "llvm/ADT/STLExtras.h"<br class="gmail_msg">
>  #include "llvm/ADT/iterator_range.h"<br class="gmail_msg">
>  #include "llvm/Support/Compiler.h"<br class="gmail_msg">
>  #include <algorithm><br class="gmail_msg">
> @@ -276,6 +277,32 @@ namespace llvm {<br class="gmail_msg">
>        return npos;<br class="gmail_msg">
>      }<br class="gmail_msg">
><br class="gmail_msg">
> +    /// Search for the first character satisfying the predicate \p F<br class="gmail_msg">
> +    ///<br class="gmail_msg">
> +    /// \returns The index of the first character satisfying \p F starting from<br class="gmail_msg">
> +    /// \p From, or npos if not found.<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_UNUSED_RESULT<br class="gmail_msg">
> +    size_t find_if(function_ref<bool(char)> F, size_t From = 0) const {<br class="gmail_msg">
> +      StringRef S = drop_front(From);<br class="gmail_msg">
> +      while (!S.empty()) {<br class="gmail_msg">
> +        if (F(S.front()))<br class="gmail_msg">
> +          return size() - S.size();<br class="gmail_msg">
> +        S = S.drop_front();<br class="gmail_msg">
> +      }<br class="gmail_msg">
> +      return npos;<br class="gmail_msg">
> +    }<br class="gmail_msg">
> +<br class="gmail_msg">
> +    /// Search for the first character not satisfying the predicate \p F<br class="gmail_msg">
> +    ///<br class="gmail_msg">
> +    /// \returns The index of the first character not satisfying \p F starting<br class="gmail_msg">
> +    /// from \p From, or npos if not found.<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_UNUSED_RESULT<br class="gmail_msg">
> +    size_t find_if_not(function_ref<bool(char)> F, size_t From = 0) const {<br class="gmail_msg">
> +      return find_if([F](char c) { return !F(c); }, From);<br class="gmail_msg">
> +    }<br class="gmail_msg">
> +<br class="gmail_msg">
>      /// Search for the first string \p Str in the string.<br class="gmail_msg">
>      ///<br class="gmail_msg">
>      /// \returns The index of the first occurrence of \p Str, or npos if not<br class="gmail_msg">
> @@ -352,6 +379,9 @@ namespace llvm {<br class="gmail_msg">
>      LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
>      bool contains(StringRef Other) const { return find(Other) != npos; }<br class="gmail_msg">
><br class="gmail_msg">
> +    LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
> +    bool contains(char C) const { return find_first_of(C) != npos; }<br class="gmail_msg">
> +<br class="gmail_msg">
<br class="gmail_msg">
I think you forgot to add a comment for this one.<br class="gmail_msg">
<br class="gmail_msg">
>      /// @}<br class="gmail_msg">
>      /// @name Helpful Algorithms<br class="gmail_msg">
>      /// @{<br class="gmail_msg">
> @@ -496,6 +526,22 @@ namespace llvm {<br class="gmail_msg">
>        return drop_front(size() - N);<br class="gmail_msg">
>      }<br class="gmail_msg">
><br class="gmail_msg">
> +    /// Return the longest prefix of 'this' such that every character<br class="gmail_msg">
> +    /// in the prefix satisfies the given predicate.<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_UNUSED_RESULT<br class="gmail_msg">
> +    StringRef take_while(function_ref<bool(char)> F) const {<br class="gmail_msg">
> +      return substr(0, find_if_not(F));<br class="gmail_msg">
> +    }<br class="gmail_msg">
> +<br class="gmail_msg">
> +    /// Return the longest prefix of 'this' such that no character in<br class="gmail_msg">
> +    /// the prefix satisfies the given predicate.<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_UNUSED_RESULT<br class="gmail_msg">
> +    StringRef take_until(function_ref<bool(char)> F) const {<br class="gmail_msg">
> +      return substr(0, find_if(F));<br class="gmail_msg">
> +    }<br class="gmail_msg">
> +<br class="gmail_msg">
>      /// Return a StringRef equal to 'this' but with the first \p N elements<br class="gmail_msg">
>      /// dropped.<br class="gmail_msg">
>      LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
> @@ -514,6 +560,22 @@ namespace llvm {<br class="gmail_msg">
>        return substr(0, size()-N);<br class="gmail_msg">
>      }<br class="gmail_msg">
><br class="gmail_msg">
> +    /// Return a StringRef equal to 'this', but with all characters satisfying<br class="gmail_msg">
> +    /// the given predicate dropped from the beginning of the string.<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_UNUSED_RESULT<br class="gmail_msg">
> +    StringRef drop_while(function_ref<bool(char)> F) const {<br class="gmail_msg">
> +      return substr(find_if_not(F));<br class="gmail_msg">
> +    }<br class="gmail_msg">
> +<br class="gmail_msg">
> +    /// Return a StringRef equal to 'this', but with all characters not<br class="gmail_msg">
> +    /// satisfying the given predicate dropped from the beginning of the string.<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
> +    LLVM_ATTRIBUTE_UNUSED_RESULT<br class="gmail_msg">
> +    StringRef drop_until(function_ref<bool(char)> F) const {<br class="gmail_msg">
> +      return substr(find_if(F));<br class="gmail_msg">
> +    }<br class="gmail_msg">
> +<br class="gmail_msg">
>      /// Returns true if this StringRef has the given prefix and removes that<br class="gmail_msg">
>      /// prefix.<br class="gmail_msg">
>      LLVM_ATTRIBUTE_ALWAYS_INLINE<br class="gmail_msg">
><br class="gmail_msg">
> Modified: llvm/trunk/unittests/ADT/StringRefTest.cpp<br class="gmail_msg">
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/StringRefTest.cpp?rev=282346&r1=282345&r2=282346&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/StringRefTest.cpp?rev=282346&r1=282345&r2=282346&view=diff</a><br class="gmail_msg">
> ==============================================================================<br class="gmail_msg">
> --- llvm/trunk/unittests/ADT/StringRefTest.cpp (original)<br class="gmail_msg">
> +++ llvm/trunk/unittests/ADT/StringRefTest.cpp Sat Sep 24 22:27:29 2016<br class="gmail_msg">
> @@ -864,4 +864,60 @@ TEST(StringRefTest, Take) {<br class="gmail_msg">
>    EXPECT_TRUE(Taken.empty());<br class="gmail_msg">
>  }<br class="gmail_msg">
><br class="gmail_msg">
> +TEST(StringRefTest, FindIf) {<br class="gmail_msg">
> +  StringRef Punct("Test.String");<br class="gmail_msg">
> +  StringRef NoPunct("ABCDEFG");<br class="gmail_msg">
> +  StringRef Empty;<br class="gmail_msg">
> +<br class="gmail_msg">
> +  auto IsPunct = [](char c) { return ::ispunct(c); };<br class="gmail_msg">
> +  auto IsAlpha = [](char c) { return ::isalpha(c); };<br class="gmail_msg">
> +  EXPECT_EQ(4, Punct.find_if(IsPunct));<br class="gmail_msg">
> +  EXPECT_EQ(StringRef::npos, NoPunct.find_if(IsPunct));<br class="gmail_msg">
> +  EXPECT_EQ(StringRef::npos, Empty.find_if(IsPunct));<br class="gmail_msg">
> +<br class="gmail_msg">
> +  EXPECT_EQ(4, Punct.find_if_not(IsAlpha));<br class="gmail_msg">
> +  EXPECT_EQ(StringRef::npos, NoPunct.find_if_not(IsAlpha));<br class="gmail_msg">
> +  EXPECT_EQ(StringRef::npos, Empty.find_if_not(IsAlpha));<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +TEST(StringRefTest, TakeWhileUntil) {<br class="gmail_msg">
> +  StringRef Test("String With 1 Number");<br class="gmail_msg">
> +<br class="gmail_msg">
> +  StringRef Taken = Test.take_while([](char c) { return ::isdigit(c); });<br class="gmail_msg">
> +  EXPECT_EQ("", Taken);<br class="gmail_msg">
> +<br class="gmail_msg">
> +  Taken = Test.take_until([](char c) { return ::isdigit(c); });<br class="gmail_msg">
> +  EXPECT_EQ("String With ", Taken);<br class="gmail_msg">
> +<br class="gmail_msg">
> +  Taken = Test.take_while([](char c) { return true; });<br class="gmail_msg">
> +  EXPECT_EQ(Test, Taken);<br class="gmail_msg">
> +<br class="gmail_msg">
> +  Taken = Test.take_until([](char c) { return true; });<br class="gmail_msg">
> +  EXPECT_EQ("", Taken);<br class="gmail_msg">
> +<br class="gmail_msg">
> +  Test = "";<br class="gmail_msg">
> +  Taken = Test.take_while([](char c) { return true; });<br class="gmail_msg">
> +  EXPECT_EQ("", Taken);<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
> +TEST(StringRefTest, DropWhileUntil) {<br class="gmail_msg">
> +  StringRef Test("String With 1 Number");<br class="gmail_msg">
> +<br class="gmail_msg">
> +  StringRef Taken = Test.drop_while([](char c) { return ::isdigit(c); });<br class="gmail_msg">
> +  EXPECT_EQ(Test, Taken);<br class="gmail_msg">
> +<br class="gmail_msg">
> +  Taken = Test.drop_until([](char c) { return ::isdigit(c); });<br class="gmail_msg">
> +  EXPECT_EQ("1 Number", Taken);<br class="gmail_msg">
> +<br class="gmail_msg">
> +  Taken = Test.drop_while([](char c) { return true; });<br class="gmail_msg">
> +  EXPECT_EQ("", Taken);<br class="gmail_msg">
> +<br class="gmail_msg">
> +  Taken = Test.drop_until([](char c) { return true; });<br class="gmail_msg">
> +  EXPECT_EQ(Test, Taken);<br class="gmail_msg">
> +<br class="gmail_msg">
> +  StringRef EmptyString = "";<br class="gmail_msg">
> +  Taken = EmptyString.drop_while([](char c) { return true; });<br class="gmail_msg">
> +  EXPECT_EQ("", Taken);<br class="gmail_msg">
> +}<br class="gmail_msg">
> +<br class="gmail_msg">
>  } // end anonymous namespace<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> _______________________________________________<br class="gmail_msg">
> llvm-commits mailing list<br class="gmail_msg">
> <a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
Davide<br class="gmail_msg">
<br class="gmail_msg">
"There are no solved problems; there are only problems that are more<br class="gmail_msg">
or less solved" -- Henri Poincare<br class="gmail_msg">
</blockquote></div>