18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2005, 2006, 2008 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef WTF_HashCountedSet_h
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WTF_HashCountedSet_h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Assertions.h"
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HashMap.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Vector.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WTF {
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions = typename DefaultHash<Value>::Hash,
31ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        typename Traits = HashTraits<Value> > class HashCountedSet {
32ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        WTF_MAKE_FAST_ALLOCATED;
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        typedef HashMap<Value, unsigned, HashFunctions, Traits> ImplType;
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    public:
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        typedef Value ValueType;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        typedef typename ImplType::iterator iterator;
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        typedef typename ImplType::const_iterator const_iterator;
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        HashCountedSet() {}
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int size() const;
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int capacity() const;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool isEmpty() const;
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Iterators iterate over pairs of values and counts.
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        iterator begin();
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        iterator end();
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const_iterator begin() const;
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        const_iterator end() const;
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        iterator find(const ValueType&);
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        const_iterator find(const ValueType&) const;
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        bool contains(const ValueType&) const;
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        unsigned count(const ValueType&) const;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Increases the count if an equal value is already present
58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // the return value is a pair of an interator to the new value's
59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // location, and a bool that is true if an new entry was added.
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        std::pair<iterator, bool> add(const ValueType&);
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
62dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Reduces the count of the value, and removes it if count
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // goes down to zero, returns true if the value is removed.
64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bool remove(const ValueType&);
65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bool remove(iterator);
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Removes the value, regardless of its count.
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void removeAll(iterator);
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void removeAll(const ValueType&);
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        // Clears the whole set.
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void clear();
73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ImplType m_impl;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline int HashCountedSet<Value, HashFunctions, Traits>::size() const
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_impl.size();
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline int HashCountedSet<Value, HashFunctions, Traits>::capacity() const
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_impl.capacity();
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline bool HashCountedSet<Value, HashFunctions, Traits>::isEmpty() const
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return size() == 0;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline typename HashCountedSet<Value, HashFunctions, Traits>::iterator HashCountedSet<Value, HashFunctions, Traits>::begin()
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_impl.begin();
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline typename HashCountedSet<Value, HashFunctions, Traits>::iterator HashCountedSet<Value, HashFunctions, Traits>::end()
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_impl.end();
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator HashCountedSet<Value, HashFunctions, Traits>::begin() const
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_impl.begin();
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator HashCountedSet<Value, HashFunctions, Traits>::end() const
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_impl.end();
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline typename HashCountedSet<Value, HashFunctions, Traits>::iterator HashCountedSet<Value, HashFunctions, Traits>::find(const ValueType& value)
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_impl.find(value);
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator HashCountedSet<Value, HashFunctions, Traits>::find(const ValueType& value) const
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_impl.find(value);
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline bool HashCountedSet<Value, HashFunctions, Traits>::contains(const ValueType& value) const
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_impl.contains(value);
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline unsigned HashCountedSet<Value, HashFunctions, Traits>::count(const ValueType& value) const
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return m_impl.get(value);
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline std::pair<typename HashCountedSet<Value, HashFunctions, Traits>::iterator, bool> HashCountedSet<Value, HashFunctions, Traits>::add(const ValueType &value)
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        pair<iterator, bool> result = m_impl.add(value, 0);
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        ++result.first->second;
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return result;
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
153dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    inline bool HashCountedSet<Value, HashFunctions, Traits>::remove(const ValueType& value)
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
155dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return remove(find(value));
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
159dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    inline bool HashCountedSet<Value, HashFunctions, Traits>::remove(iterator it)
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (it == end())
162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned oldVal = it->second;
165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        ASSERT(oldVal);
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned newVal = oldVal - 1;
167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        if (newVal) {
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            it->second = newVal;
169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            return false;
170dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        }
171dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
172dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        m_impl.remove(it);
173dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        return true;
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
177231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    inline void HashCountedSet<Value, HashFunctions, Traits>::removeAll(const ValueType& value)
178231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
179231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        removeAll(find(value));
180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
181231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    template<typename Value, typename HashFunctions, typename Traits>
183231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    inline void HashCountedSet<Value, HashFunctions, Traits>::removeAll(iterator it)
184231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    {
185231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        if (it == end())
186231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block            return;
187231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
188231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        m_impl.remove(it);
189231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    }
190231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
191231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    template<typename Value, typename HashFunctions, typename Traits>
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline void HashCountedSet<Value, HashFunctions, Traits>::clear()
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_impl.clear();
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits, typename VectorType>
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline void copyToVector(const HashCountedSet<Value, HashFunctions, Traits>& collection, VectorType& vector)
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        typedef typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator iterator;
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vector.resize(collection.size());
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        iterator it = collection.begin();
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        iterator end = collection.end();
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; it != end; ++it, ++i)
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vector[i] = *it;
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename Value, typename HashFunctions, typename Traits>
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline void copyToVector(const HashCountedSet<Value, HashFunctions, Traits>& collection, Vector<Value>& vector)
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        typedef typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator iterator;
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        vector.resize(collection.size());
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        iterator it = collection.begin();
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        iterator end = collection.end();
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (unsigned i = 0; it != end; ++it, ++i)
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            vector[i] = (*it).first;
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace khtml
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing WTF::HashCountedSet;
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif /* WTF_HashCountedSet_h */
229