mgorny created this revision. mgorny added reviewers: labath, krytarowski, emaste, lattner. Herald added a subscriber: dexonsmith. mgorny requested review of this revision. Herald added a project: LLVM.
Optimize the iterator comparison logic to compare Current.data() pointers. Use std::tie for assignments from std::pair. Remove the char Separator overload and replace the custom class with a function returning iterator_range. https://reviews.llvm.org/D110535 Files: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp llvm/include/llvm/ADT/StringExtras.h llvm/unittests/ADT/StringExtrasTest.cpp
Index: llvm/unittests/ADT/StringExtrasTest.cpp =================================================================== --- llvm/unittests/ADT/StringExtrasTest.cpp +++ llvm/unittests/ADT/StringExtrasTest.cpp @@ -275,7 +275,7 @@ EXPECT_EQ(toString(APSInt(APInt(8, 255), isUnsigned), 16), "-1"); } -TEST(StringExtrasTest, splitStringRef) { +TEST(StringExtrasTest, SplitStringRef) { auto Spl = Split("foo<=>bar<=><=>baz", "<=>"); auto It = Spl.begin(); auto End = Spl.end(); @@ -290,19 +290,3 @@ EXPECT_EQ(*It, StringRef("baz")); ASSERT_EQ(++It, End); } - -TEST(StringExtrasTest, splItChar) { - auto Spl = Split("foo,bar,,baz", ','); - auto It = Spl.begin(); - auto End = Spl.end(); - - ASSERT_NE(It, End); - EXPECT_EQ(*It, StringRef("foo")); - ASSERT_NE(++It, End); - EXPECT_EQ(*It, StringRef("bar")); - ASSERT_NE(++It, End); - EXPECT_EQ(*It, StringRef("")); - ASSERT_NE(++It, End); - EXPECT_EQ(*It, StringRef("baz")); - ASSERT_EQ(++It, End); -} Index: llvm/include/llvm/ADT/StringExtras.h =================================================================== --- llvm/include/llvm/ADT/StringExtras.h +++ llvm/include/llvm/ADT/StringExtras.h @@ -516,7 +516,8 @@ } bool operator==(const SplittingIterator &R) const { - return Current == R.Current && Next == R.Next && Separator == R.Separator; + assert(Separator == R.Separator); + return Current.data() == R.Current.data(); } const StringRef &operator*() const { return Current; } @@ -524,9 +525,7 @@ StringRef &operator*() { return Current; } SplittingIterator &operator++() { - std::pair<StringRef, StringRef> Res = Next.split(Separator); - Current = Res.first; - Next = Res.second; + std::tie(Current, Next) = Next.split(Separator); return *this; } }; @@ -536,26 +535,16 @@ /// over separated strings like so: /// /// \code -/// for (StringRef x : llvm::Split("foo,bar,baz", ',')) +/// for (StringRef x : llvm::Split("foo,bar,baz", ",")) /// ...; /// \end /// /// Note that the passed string must remain valid throuhgout lifetime /// of the iterators. -class Split { - StringRef Str; - std::string SeparatorStr; - -public: - Split(StringRef NewStr, StringRef Separator) - : Str(NewStr), SeparatorStr(Separator) {} - Split(StringRef NewStr, char Separator) - : Str(NewStr), SeparatorStr(1, Separator) {} - - SplittingIterator begin() { return SplittingIterator(Str, SeparatorStr); } - - SplittingIterator end() { return SplittingIterator("", SeparatorStr); } -}; +inline iterator_range<SplittingIterator> Split(StringRef Str, StringRef Separator) { + return {SplittingIterator(Str, Separator), + SplittingIterator(StringRef(), Separator)}; +} } // end namespace llvm Index: lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp =================================================================== --- lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp +++ lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp @@ -383,7 +383,7 @@ const llvm::StringRef &comma_separated_register_numbers, std::vector<uint32_t> ®nums, int base) { regnums.clear(); - for (llvm::StringRef x : llvm::Split(comma_separated_register_numbers, ',')) { + for (llvm::StringRef x : llvm::Split(comma_separated_register_numbers, ",")) { uint32_t reg; if (llvm::to_integer(x, reg, base)) regnums.push_back(reg); @@ -1455,7 +1455,7 @@ size_t ProcessGDBRemote::UpdateThreadPCsFromStopReplyThreadsValue( llvm::StringRef value) { m_thread_pcs.clear(); - for (llvm::StringRef x : llvm::Split(value, ',')) { + for (llvm::StringRef x : llvm::Split(value, ",")) { lldb::addr_t pc; if (llvm::to_integer(x, pc, 16)) m_thread_pcs.push_back(pc); @@ -5107,7 +5107,7 @@ std::string path; // process the response - for (auto x : llvm::Split(response.GetStringRef(), ';')) { + for (auto x : llvm::Split(response.GetStringRef(), ";")) { if (x.consume_front("core-path:")) StringExtractor(x).GetHexByteString(path); } Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp =================================================================== --- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp +++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp @@ -3656,7 +3656,7 @@ StringRef packet_str{packet.GetStringRef()}; assert(packet_str.startswith("qSaveCore")); if (packet_str.consume_front("qSaveCore;")) { - for (auto x : llvm::Split(packet_str, ';')) { + for (auto x : llvm::Split(packet_str, ";")) { if (x.consume_front("path-hint:")) StringExtractor(x).GetHexByteString(path_hint); else Index: lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp =================================================================== --- lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -355,7 +355,7 @@ // configuration of the transport before attaching/launching the process. m_qSupported_response = response.GetStringRef().str(); - for (llvm::StringRef x : llvm::Split(response.GetStringRef(), ';')) { + for (llvm::StringRef x : llvm::Split(response.GetStringRef(), ";")) { if (x == "qXfer:auxv:read+") m_supports_qXfer_auxv_read = eLazyBoolYes; else if (x == "qXfer:libraries-svr4:read+") @@ -1657,7 +1657,7 @@ error.SetErrorString(error_string.c_str()); } else if (name.equals("dirty-pages")) { std::vector<addr_t> dirty_page_list; - for (llvm::StringRef x : llvm::Split(value, ',')) { + for (llvm::StringRef x : llvm::Split(value, ",")) { addr_t page; x.consume_front("0x"); if (llvm::to_integer(x, page, 16))
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits