1/*
2 * Copyright (C) 2013 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#ifndef RenderChildIterator_h
27#define RenderChildIterator_h
28
29#include "RenderIterator.h"
30
31namespace WebCore {
32
33template <typename T>
34class RenderChildIterator : public RenderIterator<T> {
35public:
36    RenderChildIterator(const RenderElement& parent);
37    RenderChildIterator(const RenderElement& parent, T* current);
38    RenderChildIterator& operator++();
39};
40
41template <typename T>
42class RenderChildConstIterator : public RenderConstIterator<T> {
43public:
44    RenderChildConstIterator(const RenderElement& parent);
45    RenderChildConstIterator(const RenderElement& parent, const T* current);
46    RenderChildConstIterator& operator++();
47};
48
49template <typename T>
50class RenderChildIteratorAdapter {
51public:
52    RenderChildIteratorAdapter(RenderElement& parent);
53    RenderChildIterator<T> begin();
54    RenderChildIterator<T> end();
55    T* first();
56    T* last();
57
58private:
59    RenderElement& m_parent;
60};
61
62template <typename T>
63class RenderChildConstIteratorAdapter {
64public:
65    RenderChildConstIteratorAdapter(const RenderElement& parent);
66    RenderChildConstIterator<T> begin() const;
67    RenderChildConstIterator<T> end() const;
68    const T* first() const;
69    const T* last() const;
70
71private:
72    const RenderElement& m_parent;
73};
74
75template <typename T> RenderChildIteratorAdapter<T> childrenOfType(RenderElement&);
76template <typename T> RenderChildConstIteratorAdapter<T> childrenOfType(const RenderElement&);
77
78// RenderChildIterator
79
80template <typename T>
81inline RenderChildIterator<T>::RenderChildIterator(const RenderElement& parent)
82    : RenderIterator<T>(&parent)
83{
84}
85
86template <typename T>
87inline RenderChildIterator<T>::RenderChildIterator(const RenderElement& parent, T* current)
88    : RenderIterator<T>(&parent, current)
89{
90}
91
92template <typename T>
93inline RenderChildIterator<T>& RenderChildIterator<T>::operator++()
94{
95    return static_cast<RenderChildIterator<T>&>(RenderIterator<T>::traverseNextSibling());
96}
97
98// RenderChildConstIterator
99
100template <typename T>
101inline RenderChildConstIterator<T>::RenderChildConstIterator(const RenderElement& parent)
102    : RenderConstIterator<T>(&parent)
103{
104}
105
106template <typename T>
107inline RenderChildConstIterator<T>::RenderChildConstIterator(const RenderElement& parent, const T* current)
108    : RenderConstIterator<T>(&parent, current)
109{
110}
111
112template <typename T>
113inline RenderChildConstIterator<T>& RenderChildConstIterator<T>::operator++()
114{
115    return static_cast<RenderChildConstIterator<T>&>(RenderConstIterator<T>::traverseNextSibling());
116}
117
118// RenderChildIteratorAdapter
119
120template <typename T>
121inline RenderChildIteratorAdapter<T>::RenderChildIteratorAdapter(RenderElement& parent)
122    : m_parent(parent)
123{
124}
125
126template <typename T>
127inline RenderChildIterator<T> RenderChildIteratorAdapter<T>::begin()
128{
129    return RenderChildIterator<T>(m_parent, RenderTraversal::firstChild<T>(m_parent));
130}
131
132template <typename T>
133inline RenderChildIterator<T> RenderChildIteratorAdapter<T>::end()
134{
135    return RenderChildIterator<T>(m_parent);
136}
137
138template <typename T>
139inline T* RenderChildIteratorAdapter<T>::first()
140{
141    return RenderTraversal::firstChild<T>(m_parent);
142}
143
144template <typename T>
145inline T* RenderChildIteratorAdapter<T>::last()
146{
147    return RenderTraversal::lastChild<T>(m_parent);
148}
149
150// RenderChildConstIteratorAdapter
151
152template <typename T>
153inline RenderChildConstIteratorAdapter<T>::RenderChildConstIteratorAdapter(const RenderElement& parent)
154    : m_parent(parent)
155{
156}
157
158template <typename T>
159inline RenderChildConstIterator<T> RenderChildConstIteratorAdapter<T>::begin() const
160{
161    return RenderChildConstIterator<T>(m_parent, RenderTraversal::firstChild<T>(m_parent));
162}
163
164template <typename T>
165inline RenderChildConstIterator<T> RenderChildConstIteratorAdapter<T>::end() const
166{
167    return RenderChildConstIterator<T>(m_parent);
168}
169
170template <typename T>
171inline const T* RenderChildConstIteratorAdapter<T>::first() const
172{
173    return RenderTraversal::firstChild<T>(m_parent);
174}
175
176template <typename T>
177inline const T* RenderChildConstIteratorAdapter<T>::last() const
178{
179    return RenderTraversal::lastChild<T>(m_parent);
180}
181
182// Standalone functions
183
184template <typename T>
185inline RenderChildIteratorAdapter<T> childrenOfType(RenderElement& parent)
186{
187    return RenderChildIteratorAdapter<T>(parent);
188}
189
190template <typename T>
191inline RenderChildConstIteratorAdapter<T> childrenOfType(const RenderElement& parent)
192{
193    return RenderChildConstIteratorAdapter<T>(parent);
194}
195
196}
197
198#endif
199