clover/util: Define equality operators for a couple of compat classes.
authorFrancisco Jerez <currojerez@riseup.net>
Wed, 8 Oct 2014 22:06:21 +0000 (01:06 +0300)
committerFrancisco Jerez <currojerez@riseup.net>
Mon, 20 Oct 2014 07:33:01 +0000 (10:33 +0300)
src/gallium/state_trackers/clover/util/compat.hpp

index ca5b8921a408d6816dbcc5cefaa4d22eec5da0d2..eaae8c02940b0ab9f4c5d6843f7a6f0be62ab5e7 100644 (file)
@@ -36,6 +36,21 @@ namespace clover {
       //       source.  Get rid of this as soon as everything can be
       //       compiled as C++11.
 
+      namespace detail {
+         template<typename R, typename S>
+         bool
+         ranges_equal(const R &a, const S &b) {
+            if (a.size() != b.size())
+               return false;
+
+            for (size_t i = 0; i < a.size(); ++i)
+               if (a[i] != b[i])
+                  return false;
+
+            return true;
+         }
+      }
+
       template<typename T>
       class vector {
       protected:
@@ -101,6 +116,11 @@ namespace clover {
             return *this;
          }
 
+         bool
+         operator==(const vector &v) const {
+            return detail::ranges_equal(*this, v);
+         }
+
          void
          reserve(size_type n) {
             if (_capacity < n) {
@@ -199,6 +219,11 @@ namespace clover {
          vector_ref(C &v) : p(&*v.begin()), n(v.size()) {
          }
 
+         bool
+         operator==(const vector_ref &v) const {
+            return detail::ranges_equal(*this, v);
+         }
+
          size_type
          size() const {
             return n;
@@ -306,6 +331,11 @@ namespace clover {
             return std::string(v.begin(), v.end());
          }
 
+         bool
+         operator==(const string &s) const {
+            return this->v == s.v;
+         }
+
          void
          reserve(size_type n) {
             v.reserve(n);
@@ -382,19 +412,6 @@ namespace clover {
          mutable vector<char> v;
       };
 
-      template<typename T>
-      bool
-      operator==(const vector_ref<T> &a, const vector_ref<T> &b) {
-         if (a.size() != b.size())
-            return false;
-
-         for (size_t i = 0; i < a.size(); ++i)
-            if (a[i] != b[i])
-               return false;
-
-         return true;
-      }
-
       class exception {
       public:
          exception() {}