From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/WTF/wtf/HashCountedSet.h | 104 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 8 deletions(-) (limited to 'Source/WTF/wtf/HashCountedSet.h') diff --git a/Source/WTF/wtf/HashCountedSet.h b/Source/WTF/wtf/HashCountedSet.h index 80cb6ff43..15ee14b47 100644 --- a/Source/WTF/wtf/HashCountedSet.h +++ b/Source/WTF/wtf/HashCountedSet.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005, 2006, 2008, 2013 Apple Inc. All rights reserved. + * Copyright (C) 2005, 2006, 2008, 2013, 2016 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -21,6 +21,7 @@ #ifndef WTF_HashCountedSet_h #define WTF_HashCountedSet_h +#include #include #include #include @@ -28,7 +29,7 @@ namespace WTF { template::Hash, typename Traits = HashTraits> - class HashCountedSet { + class HashCountedSet final { WTF_MAKE_FAST_ALLOCATED; private: typedef HashMap ImplType; @@ -37,11 +38,27 @@ namespace WTF { typedef typename ImplType::iterator iterator; typedef typename ImplType::const_iterator const_iterator; typedef typename ImplType::AddResult AddResult; + + HashCountedSet() + { + } + + HashCountedSet(std::initializer_list initializerList) + { + for (const auto& keyValuePair : initializerList) + add(keyValuePair.key, keyValuePair.value); + } + + HashCountedSet(std::initializer_list initializerList) + { + for (const auto& value : initializerList) + add(value); + } void swap(HashCountedSet&); - int size() const; - int capacity() const; + unsigned size() const; + unsigned capacity() const; bool isEmpty() const; // Iterators iterate over pairs of values and counts. @@ -59,7 +76,12 @@ namespace WTF { // The return value includes both an iterator to the value's location, // and an isNewEntry bool that indicates whether it is a new or existing entry. AddResult add(const ValueType&); - + AddResult add(ValueType&&); + + // Increments the count of a value by the passed amount. + AddResult add(const ValueType&, unsigned); + AddResult add(ValueType&&, unsigned); + // Decrements the count of the value, and removes it if count goes down to zero. // Returns true if the value is removed. bool remove(const ValueType&); @@ -73,10 +95,18 @@ namespace WTF { // Clears the whole set. void clear(); + // Overloads for smart pointer keys that take the raw pointer type as the parameter. + template typename std::enable_if::value, iterator>::type find(typename GetPtrHelper::PtrType); + template typename std::enable_if::value, const_iterator>::type find(typename GetPtrHelper::PtrType) const; + template typename std::enable_if::value, bool>::type contains(typename GetPtrHelper::PtrType) const; + template typename std::enable_if::value, unsigned>::type count(typename GetPtrHelper::PtrType) const; + template typename std::enable_if::value, bool>::type remove(typename GetPtrHelper::PtrType); + private: ImplType m_impl; }; + template inline void HashCountedSet::swap(HashCountedSet& other) { @@ -84,13 +114,13 @@ namespace WTF { } template - inline int HashCountedSet::size() const + inline unsigned HashCountedSet::size() const { return m_impl.size(); } template - inline int HashCountedSet::capacity() const + inline unsigned HashCountedSet::capacity() const { return m_impl.capacity(); } @@ -156,6 +186,30 @@ namespace WTF { ++result.iterator->value; return result; } + + template + inline typename HashCountedSet::AddResult HashCountedSet::add(ValueType&& value) + { + AddResult result = m_impl.add(std::forward(value), 0); + ++result.iterator->value; + return result; + } + + template + inline typename HashCountedSet::AddResult HashCountedSet::add(const ValueType& value, unsigned count) + { + AddResult result = m_impl.add(value, 0); + result.iterator->value += count; + return result; + } + + template + inline typename HashCountedSet::AddResult HashCountedSet::add(ValueType&& value, unsigned count) + { + AddResult result = m_impl.add(std::forward(value), 0); + result.iterator->value += count; + return result; + } template inline bool HashCountedSet::remove(const ValueType& value) @@ -229,8 +283,42 @@ namespace WTF { vector[i] = (*it).key; } + template + template + inline auto HashCountedSet::find(typename GetPtrHelper::PtrType value) -> typename std::enable_if::value, iterator>::type + { + return m_impl.find(value); + } + + template + template + inline auto HashCountedSet::find(typename GetPtrHelper::PtrType value) const -> typename std::enable_if::value, const_iterator>::type + { + return m_impl.find(value); + } + + template + template + inline auto HashCountedSet::contains(typename GetPtrHelper::PtrType value) const -> typename std::enable_if::value, bool>::type + { + return m_impl.contains(value); + } + + template + template + inline auto HashCountedSet::count(typename GetPtrHelper::PtrType value) const -> typename std::enable_if::value, unsigned>::type + { + return m_impl.get(value); + } + + template + template + inline auto HashCountedSet::remove(typename GetPtrHelper::PtrType value) -> typename std::enable_if::value, bool>::type + { + return remove(find(value)); + } -} // namespace khtml +} // namespace WTF using WTF::HashCountedSet; -- cgit v1.2.1