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