Title: [142924] trunk/Source/WTF
Revision
142924
Author
[email protected]
Date
2013-02-14 14:50:37 -0800 (Thu, 14 Feb 2013)

Log Message

No easy way to use a RetainPtr as a key in a HashMap using object (rather than pointer) equality
https://bugs.webkit.org/show_bug.cgi?id=109864

Reviewed by Sam Weinig and Benjamin Poulain.

Added RetainPtrObjectHashTraits and RetainPtrObjectHash, which use CFEqual
and CFHash.

* wtf/RetainPtr.h:
(RetainPtrObjectHashTraits):
(WTF::RetainPtrObjectHashTraits::emptyValue):
(WTF::RetainPtrObjectHashTraits::constructDeletedValue):
(WTF::RetainPtrObjectHashTraits::isDeletedValue):
(WTF):
(WTF::RetainPtrObjectHash::hash):
(WTF::RetainPtrObjectHash::equal):
(RetainPtrObjectHash):

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (142923 => 142924)


--- trunk/Source/WTF/ChangeLog	2013-02-14 22:46:57 UTC (rev 142923)
+++ trunk/Source/WTF/ChangeLog	2013-02-14 22:50:37 UTC (rev 142924)
@@ -1,3 +1,23 @@
+2013-02-14  Dan Bernstein  <[email protected]>
+
+        No easy way to use a RetainPtr as a key in a HashMap using object (rather than pointer) equality
+        https://bugs.webkit.org/show_bug.cgi?id=109864
+
+        Reviewed by Sam Weinig and Benjamin Poulain.
+
+        Added RetainPtrObjectHashTraits and RetainPtrObjectHash, which use CFEqual
+        and CFHash.
+
+        * wtf/RetainPtr.h:
+        (RetainPtrObjectHashTraits):
+        (WTF::RetainPtrObjectHashTraits::emptyValue):
+        (WTF::RetainPtrObjectHashTraits::constructDeletedValue):
+        (WTF::RetainPtrObjectHashTraits::isDeletedValue):
+        (WTF):
+        (WTF::RetainPtrObjectHash::hash):
+        (WTF::RetainPtrObjectHash::equal):
+        (RetainPtrObjectHash):
+
 2013-02-14  Tony Chang  <[email protected]>
 
         Unreviewed, set svn:eol-style native for .sln, .vcproj, and .vsprops files.

Modified: trunk/Source/WTF/wtf/RetainPtr.h (142923 => 142924)


--- trunk/Source/WTF/wtf/RetainPtr.h	2013-02-14 22:46:57 UTC (rev 142923)
+++ trunk/Source/WTF/wtf/RetainPtr.h	2013-02-14 22:50:37 UTC (rev 142924)
@@ -297,6 +297,32 @@
     
     template<typename P> struct DefaultHash<RetainPtr<P> > { typedef PtrHash<RetainPtr<P> > Hash; };
 
+    template <typename P>
+    struct RetainPtrObjectHashTraits : GenericHashTraits<RetainPtr<P> > {
+        static const bool emptyValueIsZero = true;
+        static const RetainPtr<P>& emptyValue()
+        {
+            static RetainPtr<P>& null = *(new RetainPtr<P>);
+            return null;
+        }
+        static const bool needsDestruction = true;
+        static void constructDeletedValue(RetainPtr<P>& slot) { new (&slot) RetainPtr<P>(HashTableDeletedValue); }
+        static bool isDeletedValue(const RetainPtr<P>& value) { return value.isHashTableDeletedValue(); }
+    };
+
+    template <typename P>
+    struct RetainPtrObjectHash {
+        static unsigned hash(const RetainPtr<P>& o)
+        {
+            ASSERT_WITH_MESSAGE(o.get(), "attempt to use null RetainPtr in HashTable");
+            return CFHash(o.get());
+        }
+        static bool equal(const RetainPtr<P>& a, const RetainPtr<P>& b)
+        {
+            return CFEqual(a.get(), b.get());
+        }
+        static const bool safeToCompareToEmptyOrDeleted = false;
+    };
 } // namespace WTF
 
 using WTF::AdoptCF;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to