| Index: storage/common/data_element.cc | 
| diff --git a/storage/common/data_element.cc b/storage/common/data_element.cc | 
| index c9bbf0e4b837aeb5380f7c23af403699b83cf3c3..fe003ebf89e788b9dbcf5c8312d99a95337b19c4 100644 | 
| --- a/storage/common/data_element.cc | 
| +++ b/storage/common/data_element.cc | 
| @@ -93,4 +93,35 @@ void PrintTo(const DataElement& x, std::ostream* os) { | 
| *os << ", length: " << x.length() << ", offset: " << x.offset() << "}"; | 
| } | 
|  | 
| +bool operator==(const DataElement& a, const DataElement& b) { | 
| +  if (a.type() != b.type() || a.offset() != b.offset() || | 
| +      a.length() != b.length()) | 
| +    return false; | 
| +  switch (a.type()) { | 
| +    case DataElement::TYPE_BYTES: | 
| +      return memcmp(a.bytes(), b.bytes(), b.length()) == 0; | 
| +    case DataElement::TYPE_FILE: | 
| +      return a.path() == b.path() && | 
| +             a.expected_modification_time() == b.expected_modification_time(); | 
| +    case DataElement::TYPE_BLOB: | 
| +      return a.blob_uuid() == b.blob_uuid(); | 
| +    case DataElement::TYPE_FILE_FILESYSTEM: | 
| +      return a.filesystem_url() == b.filesystem_url(); | 
| +    case DataElement::TYPE_DISK_CACHE_ENTRY: | 
| +      // We compare only length and offset; we trust the entry itself was | 
| +      // compared at some higher level such as in BlobDataItem. | 
| +      return true; | 
| +    case DataElement::TYPE_BYTES_DESCRIPTION: | 
| +      return true; | 
| +    case DataElement::TYPE_UNKNOWN: | 
| +      NOTREACHED(); | 
| +      return false; | 
| +  } | 
| +  return false; | 
| +} | 
| + | 
| +bool operator!=(const DataElement& a, const DataElement& b) { | 
| +  return !(a == b); | 
| +} | 
| + | 
| }  // namespace storage | 
|  |