]> git.saurik.com Git - apt.git/commitdiff
return correct position in APT::StringView::(r)find
authorDavid Kalnischkies <david@kalnischkies.de>
Fri, 15 Jan 2016 14:57:32 +0000 (15:57 +0100)
committerDavid Kalnischkies <david@kalnischkies.de>
Fri, 15 Jan 2016 17:19:16 +0000 (18:19 +0100)
The position returned is supposed to be the position of the character
counted from the start of the string, but if we used the substr calling
overloads the skipped over prefix wasn't considered. The pos parameter
of rfind had also the wrong semantic.

apt-pkg/contrib/string_view.h

index 5b6411a3338cf2b7cb29299e73726c510bbe571f..d4ff800286ad7e9f69b18c75db6a4a4aee214b3b 100644 (file)
@@ -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)