Title: [223061] trunk
Revision
223061
Author
[email protected]
Date
2017-10-09 13:01:15 -0700 (Mon, 09 Oct 2017)

Log Message

Make HashMap::keys() and HashMap::values() work with WTF::map/WTF::copyToVector
https://bugs.webkit.org/show_bug.cgi?id=178072

Patch by Sam Weinig <[email protected]> on 2017-10-09
Reviewed by Darin Adler.

Source/WebCore:

* platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.h:
(WebCore::MediaSelectionGroupAVFObjC::options):

    Update for type change for HashMap::values().

Source/WebKit:

* Shared/AsyncRequest.h:
(WebKit::AsyncRequestMap::values):
* UIProcess/WebProcessProxy.h:
(WebKit::WebProcessProxy::pages const):

    Update for type change for HashMap::values().

Source/WTF:

Introduce SizedIteratorRange, a variant of IteratorRange that includes
a reference to a backing container in order to get the size of container.
This is useful for algorithms like WTF::map and WTF::copyToVector, that
can use the size to efficiently allocate things of the correct size.

The main beneficiary are HashMap's keys() and values() functions which
used to return IteratorRanges and now return SizedIteratorRange. This
allows us to remove (in a future change) copyKeysToVector() and
copyValuesToVector() by replacing them with copyToVector(map.keys()) and
copyToVector(map.values()) respectively.

* wtf/HashMap.h:
* wtf/IteratorRange.h:
(WTF::SizedIteratorRange::SizedIteratorRange):
(WTF::SizedIteratorRange::size const):
(WTF::SizedIteratorRange::begin const):
(WTF::SizedIteratorRange::end const):
(WTF::makeSizedIteratorRange):

Tools:

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

    Add tests for HashMap::keys() and HashMap::values() working with copyToVector.

Modified Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (223060 => 223061)


--- trunk/Source/WTF/ChangeLog	2017-10-09 19:55:27 UTC (rev 223060)
+++ trunk/Source/WTF/ChangeLog	2017-10-09 20:01:15 UTC (rev 223061)
@@ -1,3 +1,29 @@
+2017-10-09  Sam Weinig  <[email protected]>
+
+        Make HashMap::keys() and HashMap::values() work with WTF::map/WTF::copyToVector
+        https://bugs.webkit.org/show_bug.cgi?id=178072
+
+        Reviewed by Darin Adler.
+
+        Introduce SizedIteratorRange, a variant of IteratorRange that includes
+        a reference to a backing container in order to get the size of container.
+        This is useful for algorithms like WTF::map and WTF::copyToVector, that
+        can use the size to efficiently allocate things of the correct size.
+
+        The main beneficiary are HashMap's keys() and values() functions which
+        used to return IteratorRanges and now return SizedIteratorRange. This
+        allows us to remove (in a future change) copyKeysToVector() and
+        copyValuesToVector() by replacing them with copyToVector(map.keys()) and
+        copyToVector(map.values()) respectively.
+
+        * wtf/HashMap.h:
+        * wtf/IteratorRange.h:
+        (WTF::SizedIteratorRange::SizedIteratorRange):
+        (WTF::SizedIteratorRange::size const):
+        (WTF::SizedIteratorRange::begin const):
+        (WTF::SizedIteratorRange::end const):
+        (WTF::makeSizedIteratorRange):
+
 2017-10-08  Sam Weinig  <[email protected]>
 
         It should be possible to create a ListHashSet with a std::initializer_list.

Modified: trunk/Source/WTF/wtf/HashMap.h (223060 => 223061)


--- trunk/Source/WTF/wtf/HashMap.h	2017-10-09 19:55:27 UTC (rev 223060)
+++ trunk/Source/WTF/wtf/HashMap.h	2017-10-09 20:01:15 UTC (rev 223061)
@@ -36,8 +36,8 @@
 class HashMap final {
     WTF_MAKE_FAST_ALLOCATED;
 private:
-    typedef KeyTraitsArg KeyTraits;
-    typedef MappedTraitsArg MappedTraits;
+    using KeyTraits = KeyTraitsArg;
+    using MappedTraits = MappedTraitsArg;
 
     struct KeyValuePairTraits : KeyValuePairHashTraits<KeyTraits, MappedTraits> {
         static const bool hasIsEmptyValueFunction = true;
@@ -48,18 +48,17 @@
     };
 
 public:
-    typedef typename KeyTraits::TraitType KeyType;
-    typedef typename MappedTraits::TraitType MappedType;
-    typedef typename KeyValuePairTraits::TraitType KeyValuePairType;
+    using KeyType = typename KeyTraits::TraitType;
+    using MappedType = typename MappedTraits::TraitType;
+    using KeyValuePairType = typename KeyValuePairTraits::TraitType;
 
 private:
-    typedef typename MappedTraits::PeekType MappedPeekType;
-    typedef typename MappedTraits::TakeType MappedTakeType;
+    using MappedPeekType = typename MappedTraits::PeekType;
+    using MappedTakeType = typename MappedTraits::TakeType;
 
-    typedef HashArg HashFunctions;
+    using HashFunctions = HashArg;
 
-    typedef HashTable<KeyType, KeyValuePairType, KeyValuePairKeyExtractor<KeyValuePairType>,
-        HashFunctions, KeyValuePairTraits, KeyTraits> HashTableType;
+    using HashTableType = HashTable<KeyType, KeyValuePairType, KeyValuePairKeyExtractor<KeyValuePairType>, HashFunctions, KeyValuePairTraits, KeyTraits>;
 
     class HashMapKeysProxy;
     class HashMapValuesProxy;
@@ -67,10 +66,16 @@
     using IdentityTranslatorType = typename HashTableType::IdentityTranslatorType;
 
 public:
-    typedef HashTableIteratorAdapter<HashTableType, KeyValuePairType> iterator;
-    typedef HashTableConstIteratorAdapter<HashTableType, KeyValuePairType> const_iterator;
-    typedef typename HashTableType::AddResult AddResult;
+    using iterator = HashTableIteratorAdapter<HashTableType, KeyValuePairType>;
+    using const_iterator = HashTableConstIteratorAdapter<HashTableType, KeyValuePairType>;
 
+    using KeysIteratorRange = SizedIteratorRange<HashMap, typename iterator::Keys>;
+    using KeysConstIteratorRange = SizedIteratorRange<HashMap, typename const_iterator::Keys>;
+    using ValuesIteratorRange = SizedIteratorRange<HashMap, typename iterator::Values>;
+    using ValuesConstIteratorRange = SizedIteratorRange<HashMap, typename const_iterator::Values>;
+
+    using AddResult = typename HashTableType::AddResult;
+
 public:
     HashMap()
     {
@@ -93,13 +98,13 @@
     iterator end();
     const_iterator begin() const;
     const_iterator end() const;
+    
+    KeysIteratorRange keys() { return makeSizedIteratorRange(*this, begin().keys(), end().keys()); }
+    const KeysConstIteratorRange keys() const { return makeSizedIteratorRange(*this, begin().keys(), end().keys()); }
 
-    IteratorRange<typename iterator::Keys> keys() { return makeIteratorRange(begin().keys(), end().keys()); }
-    const IteratorRange<typename const_iterator::Keys> keys() const { return makeIteratorRange(begin().keys(), end().keys()); }
+    ValuesIteratorRange values() { return makeSizedIteratorRange(*this, begin().values(), end().values()); }
+    const ValuesConstIteratorRange values() const { return makeSizedIteratorRange(*this, begin().values(), end().values()); }
 
-    IteratorRange<typename iterator::Values> values() { return makeIteratorRange(begin().values(), end().values()); }
-    const IteratorRange<typename const_iterator::Values> values() const { return makeIteratorRange(begin().values(), end().values()); }
-
     iterator find(const KeyType&);
     const_iterator find(const KeyType&) const;
     bool contains(const KeyType&) const;

Modified: trunk/Source/WTF/wtf/IteratorRange.h (223060 => 223061)


--- trunk/Source/WTF/wtf/IteratorRange.h	2017-10-09 19:55:27 UTC (rev 223060)
+++ trunk/Source/WTF/wtf/IteratorRange.h	2017-10-09 20:01:15 UTC (rev 223061)
@@ -51,6 +51,32 @@
     return IteratorRange<Iterator>(std::forward<Iterator>(begin), std::forward<Iterator>(end));
 }
 
+template<typename Container, typename Iterator>
+class SizedIteratorRange {
+public:
+    SizedIteratorRange(const Container& container, Iterator begin, Iterator end)
+        : m_container(container)
+        , m_begin(WTFMove(begin))
+        , m_end(WTFMove(end))
+    {
+    }
+
+    auto size() const -> decltype(std::declval<Container>().size()) { return m_container.size(); }
+    Iterator begin() const { return m_begin; }
+    Iterator end() const { return m_end; }
+
+private:
+    const Container& m_container;
+    Iterator m_begin;
+    Iterator m_end;
+};
+
+template<typename Container, typename Iterator>
+SizedIteratorRange<Container, Iterator> makeSizedIteratorRange(const Container& container, Iterator&& begin, Iterator&& end)
+{
+    return SizedIteratorRange<Container, Iterator>(container, std::forward<Iterator>(begin), std::forward<Iterator>(end));
+}
+
 } // namespace WTF
 
 #endif // WTF_IteratorRange_h

Modified: trunk/Source/WebCore/ChangeLog (223060 => 223061)


--- trunk/Source/WebCore/ChangeLog	2017-10-09 19:55:27 UTC (rev 223060)
+++ trunk/Source/WebCore/ChangeLog	2017-10-09 20:01:15 UTC (rev 223061)
@@ -1,3 +1,15 @@
+2017-10-09  Sam Weinig  <[email protected]>
+
+        Make HashMap::keys() and HashMap::values() work with WTF::map/WTF::copyToVector
+        https://bugs.webkit.org/show_bug.cgi?id=178072
+
+        Reviewed by Darin Adler.
+
+        * platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.h:
+        (WebCore::MediaSelectionGroupAVFObjC::options):
+        
+            Update for type change for HashMap::values().
+            
 2017-10-09  Wenson Hsieh  <[email protected]>
 
         Unreviewed, another build fix attempt after r223031

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.h (223060 => 223061)


--- trunk/Source/WebCore/platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.h	2017-10-09 19:55:27 UTC (rev 223060)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.h	2017-10-09 20:01:15 UTC (rev 223061)
@@ -76,8 +76,8 @@
 
     void updateOptions(const Vector<String>& characteristics);
 
-    typedef HashMap<AVMediaSelectionOption*, RefPtr<MediaSelectionOptionAVFObjC>> OptionContainer;
-    WTF::IteratorRange<OptionContainer::iterator::Values> options() { return m_options.values(); }
+    using OptionContainer = HashMap<AVMediaSelectionOption*, RefPtr<MediaSelectionOptionAVFObjC>>;
+    typename OptionContainer::ValuesIteratorRange options() { return m_options.values(); }
 
     AVMediaSelectionGroup *avMediaSelectionGroup() const { return m_mediaSelectionGroup.get(); }
 

Modified: trunk/Source/WebKit/ChangeLog (223060 => 223061)


--- trunk/Source/WebKit/ChangeLog	2017-10-09 19:55:27 UTC (rev 223060)
+++ trunk/Source/WebKit/ChangeLog	2017-10-09 20:01:15 UTC (rev 223061)
@@ -1,3 +1,17 @@
+2017-10-09  Sam Weinig  <[email protected]>
+
+        Make HashMap::keys() and HashMap::values() work with WTF::map/WTF::copyToVector
+        https://bugs.webkit.org/show_bug.cgi?id=178072
+
+        Reviewed by Darin Adler.
+
+        * Shared/AsyncRequest.h:
+        (WebKit::AsyncRequestMap::values):
+        * UIProcess/WebProcessProxy.h:
+        (WebKit::WebProcessProxy::pages const):
+
+            Update for type change for HashMap::values().
+
 2017-10-09  Jeremy Jones  <[email protected]>
 
         Incorrect fullscreen animation when element has a transform.

Modified: trunk/Source/WebKit/Shared/AsyncRequest.h (223060 => 223061)


--- trunk/Source/WebKit/Shared/AsyncRequest.h	2017-10-09 19:55:27 UTC (rev 223060)
+++ trunk/Source/WebKit/Shared/AsyncRequest.h	2017-10-09 20:01:15 UTC (rev 223061)
@@ -107,6 +107,8 @@
 
 class AsyncRequestMap {
 public:
+    using RequestMap = HashMap<uint64_t, RefPtr<AsyncRequest>>;
+
     AsyncRequestMap()
 #ifndef NDEBUG
         : m_lastRequestIDTaken(std::numeric_limits<uint64_t>::max())
@@ -136,13 +138,13 @@
         m_requestMap.clear();
     }
 
-    WTF::IteratorRange<HashMap<uint64_t, RefPtr<AsyncRequest>>::iterator::Values> values()
+    typename RequestMap::ValuesIteratorRange values()
     {
         return m_requestMap.values();
     }
 
 private:
-    HashMap<uint64_t, RefPtr<AsyncRequest>> m_requestMap;
+    RequestMap m_requestMap;
 #ifndef NDEBUG
     uint64_t m_lastRequestIDTaken;
 #endif

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.h (223060 => 223061)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2017-10-09 19:55:27 UTC (rev 223060)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2017-10-09 20:01:15 UTC (rev 223061)
@@ -98,7 +98,7 @@
     void addExistingWebPage(WebPageProxy&, uint64_t pageID);
     void removeWebPage(WebPageProxy&, uint64_t pageID);
 
-    WTF::IteratorRange<WebPageProxyMap::const_iterator::Values> pages() const { return m_pageMap.values(); }
+    typename WebPageProxyMap::ValuesConstIteratorRange pages() const { return m_pageMap.values(); }
     unsigned pageCount() const { return m_pageMap.size(); }
     unsigned visiblePageCount() const { return m_visiblePageCounter.value(); }
 

Modified: trunk/Tools/ChangeLog (223060 => 223061)


--- trunk/Tools/ChangeLog	2017-10-09 19:55:27 UTC (rev 223060)
+++ trunk/Tools/ChangeLog	2017-10-09 20:01:15 UTC (rev 223061)
@@ -1,3 +1,15 @@
+2017-10-09  Sam Weinig  <[email protected]>
+
+        Make HashMap::keys() and HashMap::values() work with WTF::map/WTF::copyToVector
+        https://bugs.webkit.org/show_bug.cgi?id=178072
+
+        Reviewed by Darin Adler.
+
+        * TestWebKitAPI/Tests/WTF/Vector.cpp:
+        (TestWebKitAPI::TEST):
+        
+            Add tests for HashMap::keys() and HashMap::values() working with copyToVector.
+
 2017-10-05  Frederic Wang  <[email protected]>
 
         Remove WOFF2 from Source/ThirdParty.

Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/Vector.cpp (223060 => 223061)


--- trunk/Tools/TestWebKitAPI/Tests/WTF/Vector.cpp	2017-10-09 19:55:27 UTC (rev 223060)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/Vector.cpp	2017-10-09 20:01:15 UTC (rev 223061)
@@ -818,4 +818,29 @@
     EXPECT_FLOAT_EQ(3, vector[2]);
 }
 
+TEST(WTF_Vector, CopyToVectorSizeRangeIterator)
+{
+    HashMap<int, float> map {
+        { 1, 9 },
+        { 2, 8 },
+        { 3, 7 }
+    };
+
+    auto keysVector = copyToVector(map.keys());
+    EXPECT_EQ(3U, keysVector.size());
+
+    std::sort(keysVector.begin(), keysVector.end());
+    EXPECT_EQ(1, keysVector[0]);
+    EXPECT_EQ(2, keysVector[1]);
+    EXPECT_EQ(3, keysVector[2]);
+
+    auto valuesVector = copyToVector(map.values());
+    EXPECT_EQ(3U, valuesVector.size());
+
+    std::sort(valuesVector.begin(), valuesVector.end());
+    EXPECT_FLOAT_EQ(7, valuesVector[0]);
+    EXPECT_FLOAT_EQ(8, valuesVector[1]);
+    EXPECT_FLOAT_EQ(9, valuesVector[2]);
+}
+
 } // namespace TestWebKitAPI
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to