Item: Add stream and equality operators 77/69477/4
authorDave Rigby <daver@couchbase.com>
Fri, 4 Nov 2016 09:23:06 +0000 (09:23 +0000)
committerDave Rigby <daver@couchbase.com>
Fri, 11 Nov 2016 03:09:32 +0000 (03:09 +0000)
Add operator<< and == to Item and the classes Item is built from
(Blob, ItemMetaData).

Change-Id: I40d5edafae777a65a2a80c7286bb77c91fc486cc
Reviewed-on: http://review.couchbase.org/69477
Reviewed-by: Daniel Owen <owend@couchbase.com>
Tested-by: buildbot <build@couchbase.com>
Reviewed-by: Dave Rigby <daver@couchbase.com>
src/item.cc
src/item.h

index ef2b939..c3df0df 100644 (file)
@@ -20,6 +20,9 @@
 #include "item.h"
 #include "cJSON.h"
 
+#include  <iomanip>
+
+
 AtomicValue<uint64_t> Item::casCounter(1);
 const uint32_t Item::metaDataSize(2*sizeof(uint32_t) + 2*sizeof(uint64_t) + 2);
 
@@ -452,3 +455,75 @@ ENGINE_ERROR_CODE Item::prepend(const Item &i, size_t maxItemSize) {
             value->getDataType(), i.getDataType());
     return ENGINE_FAILED;
 }
+
+bool operator==(const Item& lhs, const Item& rhs) {
+    return (lhs.metaData == rhs.metaData) &&
+           (*lhs.value == *rhs.value) &&
+           (lhs.key == rhs.key) &&
+           (lhs.bySeqno == rhs.bySeqno) &&
+           // Note: queuedTime is *not* compared. The rationale is it is
+           // simply used for stats (measureing queue duration) and hence can
+           // be ignored from an "equivilence" pov.
+           // (lhs.queuedTime == rhs.queuedTime) &&
+           (lhs.vbucketId == rhs.vbucketId) &&
+           (lhs.op == rhs.op) &&
+           (lhs.nru == rhs.nru);
+}
+
+std::ostream& operator<<(std::ostream& os, const Item& i) {
+    os << "Item[" << &i << "] with"
+       << " key:" << i.key << "\n"
+       << "\tvalue:" << *i.value << "\n"
+       << "\tmetadata:" << i.metaData << "\n"
+       << "\tbySeqno:" << i.bySeqno
+       << " queuedTime:" << i.queuedTime
+       << " vbucketId:" << i.vbucketId
+       << " op:" << to_string(i.op)
+       << " nru:" << int(i.nru);
+    return os;
+}
+
+bool operator==(const ItemMetaData& lhs, const ItemMetaData& rhs) {
+    return (lhs.cas == rhs.cas) &&
+           (lhs.revSeqno == rhs.revSeqno) &&
+           (lhs.flags == rhs.flags) &&
+           (lhs.exptime == rhs.exptime);
+}
+
+std::ostream& operator<<(std::ostream& os, const ItemMetaData& md) {
+    os << "ItemMetaData[" << &md << "] with"
+       << " cas:" << md.cas
+       << " revSeqno:" << md.revSeqno
+       << " flags:" << md.flags
+       << " exptime:" << md.exptime;
+    return os;
+}
+
+bool operator==(const Blob& lhs, const Blob& rhs) {
+    return (lhs.size == rhs.size) &&
+           (lhs.extMetaLen == lhs.extMetaLen) &&
+           (lhs.age == rhs.age) &&
+           (memcmp(lhs.data, rhs.data, lhs.size) == 0);
+}
+
+std::ostream& operator<<(std::ostream& os, const Blob& b) {
+    os << "Blob[" << &b << "] with"
+       << " size:" << b.size
+       << " extMetaLen:" << int(b.extMetaLen)
+       << " age:" << int(b.age)
+       << " data: <" << std::hex;
+    // Print at most 40 bytes of the body.
+    auto bytes_to_print = std::min(uint32_t(40), b.size);
+    for (size_t ii = 0; ii < bytes_to_print; ii++) {
+        if (ii != 0) {
+            os << ' ';
+        }
+        if (isprint(b.data[ii])) {
+            os << b.data[ii];
+        } else {
+            os << std::setfill('0') << std::setw(2) << int(uint8_t(b.data[ii]));
+        }
+    }
+    os << std::dec << '>';
+    return os;
+}
index 8baf6dd..964b875 100644 (file)
@@ -318,8 +318,14 @@ private:
     char data[1];
 
     DISALLOW_ASSIGN(Blob);
+
+    friend bool operator==(const Blob& lhs, const Blob& rhs);
+    friend std::ostream& operator<<(std::ostream& os, const Blob& b);
 };
 
+bool operator==(const Blob& lhs, const Blob& rhs);
+std::ostream& operator<<(std::ostream& os, const Blob& b);
+
 typedef SingleThreadedRCPtr<Blob> value_t;
 
 const uint64_t DEFAULT_REV_SEQ_NUM = 1;
@@ -345,6 +351,9 @@ public:
     time_t exptime;
 };
 
+bool operator==(const ItemMetaData& lhs, const ItemMetaData& rhs);
+std::ostream& operator<<(std::ostream& os, const ItemMetaData& md);
+
 /**
  * The Item structure we use to pass information between the memcached
  * core and the backend. Please note that the kvstore don't store these
@@ -766,8 +775,14 @@ private:
     static AtomicValue<uint64_t> casCounter;
     static const uint32_t metaDataSize;
     DISALLOW_ASSIGN(Item);
+
+    friend bool operator==(const Item& lhs, const Item& rhs);
+    friend std::ostream& operator<<(std::ostream& os, const Item& i);
 };
 
+bool operator==(const Item& lhs, const Item& rhs);
+std::ostream& operator<<(std::ostream& os, const Item& item);
+
 typedef SingleThreadedRCPtr<Item> queued_item;
 
 /**