Add HashSet::take
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 12 Sep 2013 00:30:48 +0000 (00:30 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 12 Sep 2013 00:30:48 +0000 (00:30 +0000)
https://bugs.webkit.org/show_bug.cgi?id=121192

Reviewed by Darin Adler.

Source/WTF:

This is mostly done to see if we can use the new C++11 function declaration syntax,
and for parity with HashMap::take.

* wtf/HashMap.h:
* wtf/HashSet.h:

Tools:

Add a test for HashSet::take.

* TestWebKitAPI/Tests/WTF/HashSet.cpp:
(TestWebKitAPI::TEST):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@155580 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/HashMap.h
Source/WTF/wtf/HashSet.h
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WTF/HashSet.cpp

index 83f5d79..d9af6d4 100644 (file)
@@ -1,5 +1,18 @@
 2013-09-11  Anders Carlsson  <andersca@apple.com>
 
+        Add HashSet::take
+        https://bugs.webkit.org/show_bug.cgi?id=121192
+
+        Reviewed by Darin Adler.
+
+        This is mostly done to see if we can use the new C++11 function declaration syntax,
+        and for parity with HashMap::take. 
+
+        * wtf/HashMap.h:
+        * wtf/HashSet.h:
+
+2013-09-11  Anders Carlsson  <andersca@apple.com>
+
         HashSet should work with move only types
         https://bugs.webkit.org/show_bug.cgi?id=121188
 
index 037baf1..e70d3bd 100644 (file)
@@ -402,8 +402,7 @@ namespace WTF {
     }
 
     template<typename T, typename U, typename V, typename W, typename MappedTraits>
-    typename HashMap<T, U, V, W, MappedTraits>::MappedPassOutType
-    HashMap<T, U, V, W, MappedTraits>::take(const KeyType& key)
+    auto HashMap<T, U, V, W, MappedTraits>::take(const KeyType& key) -> MappedPassOutType
     {
         iterator it = find(key);
         if (it == end())
index 884540c..8772126 100644 (file)
@@ -93,6 +93,8 @@ namespace WTF {
         bool remove(iterator);
         void clear();
 
+        ValueType take(const ValueType&);
+
         static bool isValidValue(const ValueType&);
         
         bool operator==(const HashSet&) const;
@@ -233,6 +235,18 @@ namespace WTF {
     }
 
     template<typename T, typename U, typename V>
+    auto HashSet<T, U, V>::take(const ValueType& value) -> ValueType
+    {
+        auto it = find(value);
+        if (it == end())
+            return ValueTraits::emptyValue();
+
+        ValueType result = std::move(const_cast<ValueType&>(*it));
+        remove(it);
+        return result;
+    }
+
+    template<typename T, typename U, typename V>
     inline bool HashSet<T, U, V>::isValidValue(const ValueType& value)
     {
         if (ValueTraits::isDeletedValue(value))
index d3a9de3..3c5d862 100644 (file)
@@ -1,5 +1,17 @@
 2013-09-11  Anders Carlsson  <andersca@apple.com>
 
+        Add HashSet::take
+        https://bugs.webkit.org/show_bug.cgi?id=121192
+
+        Reviewed by Darin Adler.
+
+        Add a test for HashSet::take.
+
+        * TestWebKitAPI/Tests/WTF/HashSet.cpp:
+        (TestWebKitAPI::TEST):
+
+2013-09-11  Anders Carlsson  <andersca@apple.com>
+
         HashSet should work with move only types
         https://bugs.webkit.org/show_bug.cgi?id=121188
 
index befb9a9..88e7d07 100644 (file)
@@ -94,6 +94,13 @@ TEST(WTF_HashSet, MoveOnly)
         EXPECT_TRUE(hashSet.remove(MoveOnly(i + 1)));
 
     EXPECT_TRUE(hashSet.isEmpty());
+
+    for (size_t i = 0; i < 100; ++i)
+        hashSet.add(std::move(MoveOnly(i + 1)));
+
+    for (size_t i = 0; i < 100; ++i)
+        EXPECT_TRUE(hashSet.take(MoveOnly(i + 1)) == MoveOnly(i + 1));
+
 }
 
 } // namespace TestWebKitAPI