diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WTF/wtf/HashCountedSet.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WTF/wtf/HashCountedSet.h')
-rw-r--r-- | Source/WTF/wtf/HashCountedSet.h | 104 |
1 files changed, 96 insertions, 8 deletions
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 <initializer_list> #include <wtf/Assertions.h> #include <wtf/HashMap.h> #include <wtf/Vector.h> @@ -28,7 +29,7 @@ namespace WTF { template<typename Value, typename HashFunctions = typename DefaultHash<Value>::Hash, typename Traits = HashTraits<Value>> - class HashCountedSet { + class HashCountedSet final { WTF_MAKE_FAST_ALLOCATED; private: typedef HashMap<Value, unsigned, HashFunctions, Traits> 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<typename ImplType::KeyValuePairType> initializerList) + { + for (const auto& keyValuePair : initializerList) + add(keyValuePair.key, keyValuePair.value); + } + + HashCountedSet(std::initializer_list<typename ImplType::KeyType> 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 V = ValueType> typename std::enable_if<IsSmartPtr<V>::value, iterator>::type find(typename GetPtrHelper<V>::PtrType); + template<typename V = ValueType> typename std::enable_if<IsSmartPtr<V>::value, const_iterator>::type find(typename GetPtrHelper<V>::PtrType) const; + template<typename V = ValueType> typename std::enable_if<IsSmartPtr<V>::value, bool>::type contains(typename GetPtrHelper<V>::PtrType) const; + template<typename V = ValueType> typename std::enable_if<IsSmartPtr<V>::value, unsigned>::type count(typename GetPtrHelper<V>::PtrType) const; + template<typename V = ValueType> typename std::enable_if<IsSmartPtr<V>::value, bool>::type remove(typename GetPtrHelper<V>::PtrType); + private: ImplType m_impl; }; + template<typename Value, typename HashFunctions, typename Traits> inline void HashCountedSet<Value, HashFunctions, Traits>::swap(HashCountedSet& other) { @@ -84,13 +114,13 @@ namespace WTF { } template<typename Value, typename HashFunctions, typename Traits> - inline int HashCountedSet<Value, HashFunctions, Traits>::size() const + inline unsigned HashCountedSet<Value, HashFunctions, Traits>::size() const { return m_impl.size(); } template<typename Value, typename HashFunctions, typename Traits> - inline int HashCountedSet<Value, HashFunctions, Traits>::capacity() const + inline unsigned HashCountedSet<Value, HashFunctions, Traits>::capacity() const { return m_impl.capacity(); } @@ -156,6 +186,30 @@ namespace WTF { ++result.iterator->value; return result; } + + template<typename Value, typename HashFunctions, typename Traits> + inline typename HashCountedSet<Value, HashFunctions, Traits>::AddResult HashCountedSet<Value, HashFunctions, Traits>::add(ValueType&& value) + { + AddResult result = m_impl.add(std::forward<Value>(value), 0); + ++result.iterator->value; + return result; + } + + template<typename Value, typename HashFunctions, typename Traits> + inline typename HashCountedSet<Value, HashFunctions, Traits>::AddResult HashCountedSet<Value, HashFunctions, Traits>::add(const ValueType& value, unsigned count) + { + AddResult result = m_impl.add(value, 0); + result.iterator->value += count; + return result; + } + + template<typename Value, typename HashFunctions, typename Traits> + inline typename HashCountedSet<Value, HashFunctions, Traits>::AddResult HashCountedSet<Value, HashFunctions, Traits>::add(ValueType&& value, unsigned count) + { + AddResult result = m_impl.add(std::forward<Value>(value), 0); + result.iterator->value += count; + return result; + } template<typename Value, typename HashFunctions, typename Traits> inline bool HashCountedSet<Value, HashFunctions, Traits>::remove(const ValueType& value) @@ -229,8 +283,42 @@ namespace WTF { vector[i] = (*it).key; } + template<typename Value, typename HashFunctions, typename Traits> + template<typename V> + inline auto HashCountedSet<Value, HashFunctions, Traits>::find(typename GetPtrHelper<V>::PtrType value) -> typename std::enable_if<IsSmartPtr<V>::value, iterator>::type + { + return m_impl.find(value); + } + + template<typename Value, typename HashFunctions, typename Traits> + template<typename V> + inline auto HashCountedSet<Value, HashFunctions, Traits>::find(typename GetPtrHelper<V>::PtrType value) const -> typename std::enable_if<IsSmartPtr<V>::value, const_iterator>::type + { + return m_impl.find(value); + } + + template<typename Value, typename HashFunctions, typename Traits> + template<typename V> + inline auto HashCountedSet<Value, HashFunctions, Traits>::contains(typename GetPtrHelper<V>::PtrType value) const -> typename std::enable_if<IsSmartPtr<V>::value, bool>::type + { + return m_impl.contains(value); + } + + template<typename Value, typename HashFunctions, typename Traits> + template<typename V> + inline auto HashCountedSet<Value, HashFunctions, Traits>::count(typename GetPtrHelper<V>::PtrType value) const -> typename std::enable_if<IsSmartPtr<V>::value, unsigned>::type + { + return m_impl.get(value); + } + + template<typename Value, typename HashFunctions, typename Traits> + template<typename V> + inline auto HashCountedSet<Value, HashFunctions, Traits>::remove(typename GetPtrHelper<V>::PtrType value) -> typename std::enable_if<IsSmartPtr<V>::value, bool>::type + { + return remove(find(value)); + } -} // namespace khtml +} // namespace WTF using WTF::HashCountedSet; |