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