forked from boostorg/utility
Merge pull request #42 from dimztimz/develop
Faster find functions in string_view by using traits::find()
This commit is contained in:
@@ -245,12 +245,27 @@ namespace boost {
|
|||||||
return npos;
|
return npos;
|
||||||
if (s.empty())
|
if (s.empty())
|
||||||
return pos;
|
return pos;
|
||||||
const_iterator iter = std::search(this->cbegin() + pos, this->cend(),
|
if (s.size() > size() - pos)
|
||||||
s.cbegin (), s.cend (), traits::eq);
|
return npos;
|
||||||
return iter == this->cend () ? npos : std::distance(this->cbegin (), iter);
|
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())
|
||||||
|
return npos;
|
||||||
|
const charT* ret_ptr = traits::find(ptr_ + pos, len_ - pos, c);
|
||||||
|
if (ret_ptr)
|
||||||
|
return ret_ptr - ptr_;
|
||||||
|
return npos;
|
||||||
}
|
}
|
||||||
BOOST_CXX14_CONSTEXPR size_type find(charT c, size_type pos = 0) const BOOST_NOEXCEPT
|
|
||||||
{ return find(basic_string_view(&c, 1), pos); }
|
|
||||||
BOOST_CXX14_CONSTEXPR size_type find(const charT* s, size_type pos, size_type n) const BOOST_NOEXCEPT
|
BOOST_CXX14_CONSTEXPR size_type find(const charT* s, size_type pos, size_type n) const BOOST_NOEXCEPT
|
||||||
{ return find(basic_string_view(s, n), pos); }
|
{ return find(basic_string_view(s, n), pos); }
|
||||||
BOOST_CXX14_CONSTEXPR size_type find(const charT* s, size_type pos = 0) const BOOST_NOEXCEPT
|
BOOST_CXX14_CONSTEXPR size_type find(const charT* s, size_type pos = 0) const BOOST_NOEXCEPT
|
||||||
@@ -287,7 +302,7 @@ namespace boost {
|
|||||||
return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
|
return iter == this->cend () ? npos : std::distance ( this->cbegin (), iter );
|
||||||
}
|
}
|
||||||
BOOST_CXX14_CONSTEXPR size_type find_first_of(charT c, size_type pos = 0) const BOOST_NOEXCEPT
|
BOOST_CXX14_CONSTEXPR size_type find_first_of(charT c, size_type pos = 0) const BOOST_NOEXCEPT
|
||||||
{ return find_first_of(basic_string_view(&c, 1), pos); }
|
{ return find(c, pos); }
|
||||||
BOOST_CXX14_CONSTEXPR size_type find_first_of(const charT* s, size_type pos, size_type n) const BOOST_NOEXCEPT
|
BOOST_CXX14_CONSTEXPR size_type find_first_of(const charT* s, size_type pos, size_type n) const BOOST_NOEXCEPT
|
||||||
{ return find_first_of(basic_string_view(s, n), pos); }
|
{ return find_first_of(basic_string_view(s, n), pos); }
|
||||||
BOOST_CXX14_CONSTEXPR size_type find_first_of(const charT* s, size_type pos = 0) const BOOST_NOEXCEPT
|
BOOST_CXX14_CONSTEXPR size_type find_first_of(const charT* s, size_type pos = 0) const BOOST_NOEXCEPT
|
||||||
|
Reference in New Issue
Block a user