f6f6d52f984b38fbe3951e95600b7e131d668104
[WebKit-https.git] / Source / WebCore / rendering / RenderChildIterator.h
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
31 namespace WebCore {
32
33 template <typename T>
34 class RenderChildIterator : public RenderIterator<T> {
35 public:
36     RenderChildIterator(const RenderElement& parent);
37     RenderChildIterator(const RenderElement& parent, T* current);
38     RenderChildIterator& operator++();
39 };
40
41 template <typename T>
42 class RenderChildConstIterator : public RenderConstIterator<T> {
43 public:
44     RenderChildConstIterator(const RenderElement& parent);
45     RenderChildConstIterator(const RenderElement& parent, const T* current);
46     RenderChildConstIterator& operator++();
47 };
48
49 template <typename T>
50 class RenderChildIteratorAdapter {
51 public:
52     RenderChildIteratorAdapter(RenderElement& parent);
53     RenderChildIterator<T> begin();
54     RenderChildIterator<T> end();
55     T* first();
56     T* last();
57
58 private:
59     RenderElement& m_parent;
60 };
61
62 template <typename T>
63 class RenderChildConstIteratorAdapter {
64 public:
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
71 private:
72     const RenderElement& m_parent;
73 };
74
75 RenderChildIteratorAdapter<RenderObject> elementChildren(RenderElement&);
76 RenderChildConstIteratorAdapter<RenderObject> elementChildren(const RenderElement&);
77 template <typename T> RenderChildIteratorAdapter<T> childrenOfType(RenderElement&);
78 template <typename T> RenderChildConstIteratorAdapter<T> childrenOfType(const RenderElement&);
79
80 // RenderChildIterator
81
82 template <typename T>
83 inline RenderChildIterator<T>::RenderChildIterator(const RenderElement& parent)
84     : RenderIterator<T>(&parent)
85 {
86 }
87
88 template <typename T>
89 inline RenderChildIterator<T>::RenderChildIterator(const RenderElement& parent, T* current)
90     : RenderIterator<T>(&parent, current)
91 {
92 }
93
94 template <typename T>
95 inline RenderChildIterator<T>& RenderChildIterator<T>::operator++()
96 {
97     return static_cast<RenderChildIterator<T>&>(RenderIterator<T>::traverseNextSibling());
98 }
99
100 // RenderChildConstIterator
101
102 template <typename T>
103 inline RenderChildConstIterator<T>::RenderChildConstIterator(const RenderElement& parent)
104     : RenderConstIterator<T>(&parent)
105 {
106 }
107
108 template <typename T>
109 inline RenderChildConstIterator<T>::RenderChildConstIterator(const RenderElement& parent, const T* current)
110     : RenderConstIterator<T>(&parent, current)
111 {
112 }
113
114 template <typename T>
115 inline RenderChildConstIterator<T>& RenderChildConstIterator<T>::operator++()
116 {
117     return static_cast<RenderChildConstIterator<T>&>(RenderConstIterator<T>::traverseNextSibling());
118 }
119
120 // RenderChildIteratorAdapter
121
122 template <typename T>
123 inline RenderChildIteratorAdapter<T>::RenderChildIteratorAdapter(RenderElement& parent)
124     : m_parent(parent)
125 {
126 }
127
128 template <typename T>
129 inline RenderChildIterator<T> RenderChildIteratorAdapter<T>::begin()
130 {
131     return RenderChildIterator<T>(m_parent, RenderTraversal::firstChild<T>(m_parent));
132 }
133
134 template <typename T>
135 inline RenderChildIterator<T> RenderChildIteratorAdapter<T>::end()
136 {
137     return RenderChildIterator<T>(m_parent);
138 }
139
140 template <typename T>
141 inline T* RenderChildIteratorAdapter<T>::first()
142 {
143     return RenderTraversal::firstChild<T>(&m_parent);
144 }
145
146 template <typename T>
147 inline T* RenderChildIteratorAdapter<T>::last()
148 {
149     return RenderTraversal::lastChild<T>(&m_parent);
150 }
151
152 // RenderChildConstIteratorAdapter
153
154 template <typename T>
155 inline RenderChildConstIteratorAdapter<T>::RenderChildConstIteratorAdapter(const RenderElement& parent)
156     : m_parent(parent)
157 {
158 }
159
160 template <typename T>
161 inline RenderChildConstIterator<T> RenderChildConstIteratorAdapter<T>::begin() const
162 {
163     return RenderChildConstIterator<T>(m_parent, RenderTraversal::firstChild<T>(m_parent));
164 }
165
166 template <typename T>
167 inline RenderChildConstIterator<T> RenderChildConstIteratorAdapter<T>::end() const
168 {
169     return RenderChildConstIterator<T>(m_parent);
170 }
171
172 template <typename T>
173 inline const T* RenderChildConstIteratorAdapter<T>::first() const
174 {
175     return RenderTraversal::firstChild<T>(m_parent);
176 }
177
178 template <typename T>
179 inline const T* RenderChildConstIteratorAdapter<T>::last() const
180 {
181     return RenderTraversal::lastChild<T>(m_parent);
182 }
183
184 // Standalone functions
185
186 template <typename T>
187 inline RenderChildIteratorAdapter<T> childrenOfType(RenderElement& parent)
188 {
189     return RenderChildIteratorAdapter<T>(parent);
190 }
191
192 template <typename T>
193 inline RenderChildConstIteratorAdapter<T> childrenOfType(const RenderElement& parent)
194 {
195     return RenderChildConstIteratorAdapter<T>(parent);
196 }
197
198 }
199
200 #endif