From 17a2bc52127d1f36cd69dc9d5f488c1a6e15fecf Mon Sep 17 00:00:00 2001 From: Robert Widmann Date: Tue, 8 Dec 2020 18:20:06 -0800 Subject: [PATCH] [NFC] Use std::mismatch Now That We Live In The Future --- lib/Basic/StringExtras.cpp | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/lib/Basic/StringExtras.cpp b/lib/Basic/StringExtras.cpp index c678249b458..53825cd29c1 100644 --- a/lib/Basic/StringExtras.cpp +++ b/lib/Basic/StringExtras.cpp @@ -427,42 +427,34 @@ StringRef swift::matchLeadingTypeName(StringRef name, // ending of the type name. auto nameWords = camel_case::getWords(name); auto typeWords = camel_case::getWords(typeName.Name); - auto nameWordIter = nameWords.begin(), - nameWordIterEnd = nameWords.end(); - auto typeWordRevIter = typeWords.rbegin(), - typeWordRevIterEnd = typeWords.rend(); + auto nameWordIter = nameWords.begin(); + auto typeWordRevIter = typeWords.rbegin(); // Find the last instance of the first word in the name within // the words in the type name. - typeWordRevIter = std::find_if(typeWordRevIter, typeWordRevIterEnd, - [nameWordIter](StringRef word) { - return matchNameWordToTypeWord(*nameWordIter, word); - }); + typeWordRevIter = std::find_if( + typeWordRevIter, typeWords.rend(), [nameWordIter](StringRef word) { + return matchNameWordToTypeWord(*nameWordIter, word); + }); // If we didn't find the first word in the name at all, we're // done. - if (typeWordRevIter == typeWordRevIterEnd) + if (typeWordRevIter == typeWords.rend()) return name; // Now, match from the first word up until the end of the type name. - auto typeWordIter = typeWordRevIter.base(), - typeWordIterEnd = typeWords.end(); - ++nameWordIter; - - // FIXME: Use std::mismatch once we update to C++14. - while (typeWordIter != typeWordIterEnd && - nameWordIter != nameWordIterEnd && - matchNameWordToTypeWord(*nameWordIter, *typeWordIter)) { - ++typeWordIter; - ++nameWordIter; - } + std::advance(nameWordIter, 1); + WordIterator typeMismatch = typeWords.end(), nameMismatch = nameWords.end(); + std::tie(typeMismatch, nameMismatch) = + std::mismatch(typeWordRevIter.base(), typeWords.end(), nameWordIter, + nameWords.end(), matchNameWordToTypeWord); // If we didn't reach the end of the type name, don't match. - if (typeWordIter != typeWordIterEnd) + if (typeMismatch != typeWords.end()) return name; // Chop of the beginning of the name. - return nameWordIter.getRestOfStr(); + return nameMismatch.getRestOfStr(); } StringRef StringScratchSpace::copyString(StringRef string) {