<div dir="ltr">Looks good! (optional unit tests - no doubt similar things don't bother with them - but could be nice)<br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 15, 2015 at 7:06 AM, Rafael Ávila de Espíndola <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">rafael created this revision.<br>
rafael added a reviewer: chandlerc.<br>
rafael added a subscriber: llvm-commits.<br>
rafael set the repository for this revision to rL LLVM.<br>
<br>
Sometimes it is more natural to use a ArrayRef<uint8_t> than a StringRef to represent a range of bytes that is not, semantically, a string.<br>
<br>
<br>
Repository:<br>
  rL LLVM<br>
<br>
<a href="http://reviews.llvm.org/D13770" rel="noreferrer" target="_blank">http://reviews.llvm.org/D13770</a><br>
<br>
Files:<br>
  include/llvm/ADT/ArrayRef.h<br>
  include/llvm/ADT/DenseMapInfo.h<br>
<br>
Index: include/llvm/ADT/DenseMapInfo.h<br>
===================================================================<br>
--- include/llvm/ADT/DenseMapInfo.h<br>
+++ include/llvm/ADT/DenseMapInfo.h<br>
@@ -14,6 +14,7 @@<br>
 #ifndef LLVM_ADT_DENSEMAPINFO_H<br>
 #define LLVM_ADT_DENSEMAPINFO_H<br>
<br>
+#include "llvm/ADT/ArrayRef.h"<br>
 #include "llvm/ADT/Hashing.h"<br>
 #include "llvm/ADT/StringRef.h"<br>
 #include "llvm/Support/PointerLikeTypeTraits.h"<br>
@@ -190,6 +191,31 @@<br>
   }<br>
 };<br>
<br>
+// Provide DenseMapInfo for ArrayRefs.<br>
+template <typename T> struct DenseMapInfo<ArrayRef<T>> {<br>
+  static inline ArrayRef<T> getEmptyKey() {<br>
+    return ArrayRef<T>(reinterpret_cast<const T *>(~static_cast<uintptr_t>(0)),<br>
+                       size_t(0));<br>
+  }<br>
+  static inline ArrayRef<T> getTombstoneKey() {<br>
+    return ArrayRef<T>(reinterpret_cast<const T *>(~static_cast<uintptr_t>(1)),<br>
+                       size_t(0));<br>
+  }<br>
+  static unsigned getHashValue(ArrayRef<T> Val) {<br>
+    assert(Val.data() != getEmptyKey().data() && "Cannot hash the empty key!");<br>
+    assert(Val.data() != getTombstoneKey().data() &&<br>
+           "Cannot hash the tombstone key!");<br>
+    return (unsigned)(hash_value(Val));<br>
+  }<br>
+  static bool isEqual(ArrayRef<T> LHS, ArrayRef<T> RHS) {<br>
+    if (RHS.data() == getEmptyKey().data())<br>
+      return LHS.data() == getEmptyKey().data();<br>
+    if (RHS.data() == getTombstoneKey().data())<br>
+      return LHS.data() == getTombstoneKey().data();<br>
+    return LHS == RHS; </blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  }<br>
+};<br>
+<br>
 } // end namespace llvm<br>
<br>
 #endif<br>
Index: include/llvm/ADT/ArrayRef.h<br>
===================================================================<br>
--- include/llvm/ADT/ArrayRef.h<br>
+++ include/llvm/ADT/ArrayRef.h<br>
@@ -10,6 +10,7 @@<br>
 #ifndef LLVM_ADT_ARRAYREF_H<br>
 #define LLVM_ADT_ARRAYREF_H<br>
<br>
+#include "llvm/ADT/Hashing.h"<br>
 #include "llvm/ADT/None.h"<br>
 #include "llvm/ADT/SmallVector.h"<br>
 #include <vector><br>
@@ -374,6 +375,10 @@<br>
   template <typename T> struct isPodLike<ArrayRef<T> > {<br>
     static const bool value = true;<br>
   };<br>
+<br>
+  template <typename T> hash_code hash_value(ArrayRef<T> S) {<br>
+    return hash_combine_range(S.begin(), S.end());<br>
+  }<br>
 }<br>
<br>
 #endif<br>
<br>
<br>
<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div></div>