1/*
2    Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
3    Copyright (C) 2001 Dirk Mueller <mueller@kde.org>
4    Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.
5
6    This library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Library General Public
8    License as published by the Free Software Foundation; either
9    version 2 of the License, or (at your option) any later version.
10
11    This library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Library General Public License for more details.
15
16    You should have received a copy of the GNU Library General Public License
17    along with this library; see the file COPYING.LIB.  If not, write to
18    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19    Boston, MA 02110-1301, USA.
20
21    This class provides all functionality needed for loading images, style sheets and html
22    pages from the web. It has a memory cache for these objects.
23*/
24
25#ifndef ResourceClientWalker_h
26#define ResourceClientWalker_h
27
28#include "core/fetch/ResourceClient.h"
29#include "wtf/HashCountedSet.h"
30#include "wtf/Vector.h"
31
32namespace blink {
33
34// Call this "walker" instead of iterator so people won't expect Qt or STL-style iterator interface.
35// Just keep calling next() on this. It's safe from deletions of items.
36template<typename T> class ResourceClientWalker {
37public:
38    ResourceClientWalker(const HashCountedSet<ResourceClient*>& set)
39        : m_clientSet(set), m_clientVector(set.size()), m_index(0)
40    {
41        typedef HashCountedSet<ResourceClient*>::const_iterator Iterator;
42        Iterator end = set.end();
43        size_t clientIndex = 0;
44        for (Iterator current = set.begin(); current != end; ++current)
45            m_clientVector[clientIndex++] = current->key;
46    }
47
48    T* next()
49    {
50        size_t size = m_clientVector.size();
51        while (m_index < size) {
52            ResourceClient* next = m_clientVector[m_index++];
53            if (m_clientSet.contains(next)) {
54                ASSERT(T::expectedType() == ResourceClient::expectedType() || next->resourceClientType() == T::expectedType());
55                return static_cast<T*>(next);
56            }
57        }
58
59        return 0;
60    }
61private:
62    const HashCountedSet<ResourceClient*>& m_clientSet;
63    Vector<ResourceClient*> m_clientVector;
64    size_t m_index;
65};
66
67}
68
69#endif
70