⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hashcountedset.h

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 H
字号:
/* * Copyright (C) 2005, 2006, 2008 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 * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB.  If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */#ifndef WTF_HashCountedSet_h#define WTF_HashCountedSet_h#include "Assertions.h"#include "HashMap.h"#include "Vector.h"namespace WTF {    template<typename Value, typename HashFunctions = typename DefaultHash<Value>::Hash,        typename Traits = HashTraits<Value> > class HashCountedSet {    private:        typedef HashMap<Value, unsigned, HashFunctions, Traits> ImplType;    public:        typedef Value ValueType;        typedef typename ImplType::iterator iterator;        typedef typename ImplType::const_iterator const_iterator;                HashCountedSet() {}                int size() const;        int capacity() const;        bool isEmpty() const;                // iterators iterate over pairs of values and counts        iterator begin();        iterator end();        const_iterator begin() const;        const_iterator end() const;                iterator find(const ValueType& value);        const_iterator find(const ValueType& value) const;        bool contains(const ValueType& value) const;        unsigned count(const ValueType& value) const;        // increases the count if an equal value is already present        // the return value is a pair of an interator to the new value's location,         // and a bool that is true if an new entry was added        std::pair<iterator, bool> add(const ValueType &value);                // reduces the count of the value, and removes it if count        // goes down to zero        void remove(const ValueType& value);        void remove(iterator it);        void clear();            private:        ImplType m_impl;    };        template<typename Value, typename HashFunctions, typename Traits>    inline int 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    {        return m_impl.capacity();     }        template<typename Value, typename HashFunctions, typename Traits>    inline bool HashCountedSet<Value, HashFunctions, Traits>::isEmpty() const    {        return size() == 0;     }        template<typename Value, typename HashFunctions, typename Traits>    inline typename HashCountedSet<Value, HashFunctions, Traits>::iterator HashCountedSet<Value, HashFunctions, Traits>::begin()    {        return m_impl.begin();     }    template<typename Value, typename HashFunctions, typename Traits>    inline typename HashCountedSet<Value, HashFunctions, Traits>::iterator HashCountedSet<Value, HashFunctions, Traits>::end()    {        return m_impl.end();     }        template<typename Value, typename HashFunctions, typename Traits>    inline typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator HashCountedSet<Value, HashFunctions, Traits>::begin() const    {        return m_impl.begin();     }        template<typename Value, typename HashFunctions, typename Traits>    inline typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator HashCountedSet<Value, HashFunctions, Traits>::end() const    {        return m_impl.end();     }        template<typename Value, typename HashFunctions, typename Traits>    inline typename HashCountedSet<Value, HashFunctions, Traits>::iterator HashCountedSet<Value, HashFunctions, Traits>::find(const ValueType& value)    {        return m_impl.find(value);     }        template<typename Value, typename HashFunctions, typename Traits>    inline typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator HashCountedSet<Value, HashFunctions, Traits>::find(const ValueType& value) const    {        return m_impl.find(value);     }        template<typename Value, typename HashFunctions, typename Traits>    inline bool HashCountedSet<Value, HashFunctions, Traits>::contains(const ValueType& value) const    {        return m_impl.contains(value);     }    template<typename Value, typename HashFunctions, typename Traits>    inline unsigned HashCountedSet<Value, HashFunctions, Traits>::count(const ValueType& value) const    {        return m_impl.get(value);    }        template<typename Value, typename HashFunctions, typename Traits>    inline std::pair<typename HashCountedSet<Value, HashFunctions, Traits>::iterator, bool> HashCountedSet<Value, HashFunctions, Traits>::add(const ValueType &value)    {        pair<iterator, bool> result = m_impl.add(value, 0);         ++result.first->second;        return result;    }        template<typename Value, typename HashFunctions, typename Traits>    inline void HashCountedSet<Value, HashFunctions, Traits>::remove(const ValueType& value)    {        remove(find(value));    }        template<typename Value, typename HashFunctions, typename Traits>    inline void HashCountedSet<Value, HashFunctions, Traits>::remove(iterator it)    {        if (it == end())            return;        unsigned oldVal = it->second;        ASSERT(oldVal != 0);        unsigned newVal = oldVal - 1;        if (newVal == 0)            m_impl.remove(it);        else            it->second = newVal;    }        template<typename Value, typename HashFunctions, typename Traits>    inline void HashCountedSet<Value, HashFunctions, Traits>::clear()    {        m_impl.clear();     }        template<typename Value, typename HashFunctions, typename Traits, typename VectorType>    inline void copyToVector(const HashCountedSet<Value, HashFunctions, Traits>& collection, VectorType& vector)    {        typedef typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator iterator;                vector.resize(collection.size());                iterator it = collection.begin();        iterator end = collection.end();        for (unsigned i = 0; it != end; ++it, ++i)            vector[i] = *it;    }    template<typename Value, typename HashFunctions, typename Traits>    inline void copyToVector(const HashCountedSet<Value, HashFunctions, Traits>& collection, Vector<Value>& vector)    {        typedef typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator iterator;                vector.resize(collection.size());                iterator it = collection.begin();        iterator end = collection.end();        for (unsigned i = 0; it != end; ++it, ++i)            vector[i] = (*it).first;    }} // namespace khtmlusing WTF::HashCountedSet;#endif /* WTF_HashCountedSet_h */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -