From eacea4664d59e9548f9e6c60f12cd543a7db6257 Mon Sep 17 00:00:00 2001 From: Dimitrij Mijoski Date: Mon, 2 Apr 2018 00:46:51 +0200 Subject: [PATCH] implement string_view.find(string) in terms of traits.compare and find. This should be faster that it's previous implementations in terms of std::search() --- include/boost/utility/string_view.hpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/include/boost/utility/string_view.hpp b/include/boost/utility/string_view.hpp index e27cf59..44efda9 100644 --- a/include/boost/utility/string_view.hpp +++ b/include/boost/utility/string_view.hpp @@ -245,12 +245,18 @@ namespace boost { return npos; if (s.empty()) return pos; - const charT* first_char_ptr = traits::find(ptr_ + pos, len_ - pos, s[0]); - if (!first_char_ptr) - return npos; - const_iterator iter = std::search(first_char_ptr, this->cend(), - s.cbegin (), s.cend (), traits::eq); - return iter == this->cend () ? npos : std::distance(this->cbegin (), iter); + if (s.size() > size() - pos) + return npos; + const charT* cur = ptr_ + pos; + const charT* last = cend() - s.size() + 1; + for (; cur != last ; ++cur) { + cur = traits::find(cur, last - cur, s[0]); + if (!cur) + return npos; + if (traits::compare(cur, s.cbegin(), s.size()) == 0) + return cur - ptr_; + } + return npos; } BOOST_CXX14_CONSTEXPR size_type find(charT c, size_type pos = 0) const BOOST_NOEXCEPT { if (pos > size())