diff options
-rw-r--r-- | apt-pkg/contrib/string_view.h | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/apt-pkg/contrib/string_view.h b/apt-pkg/contrib/string_view.h index 5b6411a33..d4ff80028 100644 --- a/apt-pkg/contrib/string_view.h +++ b/apt-pkg/contrib/string_view.h @@ -29,6 +29,7 @@ class StringView { public: static constexpr size_t npos = static_cast<size_t>(-1); + static_assert(APT::StringView::npos == std::string::npos, "npos values are different"); /* Constructors */ constexpr StringView() : data_(""), size_(0) {} @@ -43,10 +44,15 @@ public: return StringView(data_ + pos, n > (size_ - pos) ? (size_ - pos) : n); } - size_t find(int c, size_t pos=0) const { - if (pos != 0) - return substr(pos).find(c); - + size_t find(int c, size_t pos) const { + if (pos == 0) + return find(c); + size_t const found = substr(pos).find(c); + if (found == npos) + return npos; + return pos + found; + } + size_t find(int c) const { const char *found = static_cast<const char*>(memchr(data_, c, size_)); if (found == NULL) @@ -55,10 +61,12 @@ public: return found - data_; } - size_t rfind(int c, size_t pos=npos) const { - if (pos != npos) - return substr(0, pos).rfind(c); - + size_t rfind(int c, size_t pos) const { + if (pos == npos) + return rfind(c); + return APT::StringView(data_, pos).rfind(c); + } + size_t rfind(int c) const { const char *found = static_cast<const char*>(memrchr(data_, c, size_)); if (found == NULL) |