OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. | 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. |
6 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 6 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
7 * Copyright (C) 2014 Samsung Electronics. All rights reserved. | 7 * Copyright (C) 2014 Samsung Electronics. All rights reserved. |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 template <class NodeType> | 95 template <class NodeType> |
96 static Node* traverseNextTemplate(NodeType&); | 96 static Node* traverseNextTemplate(NodeType&); |
97 template <class NodeType> | 97 template <class NodeType> |
98 static Node* traverseNextTemplate(NodeType&, const Node* stayWithin); | 98 static Node* traverseNextTemplate(NodeType&, const Node* stayWithin); |
99 template <class NodeType> | 99 template <class NodeType> |
100 static Node* childAtTemplate(NodeType&, unsigned); | 100 static Node* childAtTemplate(NodeType&, unsigned); |
101 }; | 101 }; |
102 | 102 |
103 template <class Iterator> | 103 template <class Iterator> |
104 class TraversalRange { | 104 class TraversalRange { |
| 105 STACK_ALLOCATED(); |
105 public: | 106 public: |
106 using StartNodeType = typename Iterator::StartNodeType; | 107 using StartNodeType = typename Iterator::StartNodeType; |
107 explicit TraversalRange(const StartNodeType* start) : m_start(start) { } | 108 explicit TraversalRange(const StartNodeType* start) : m_start(start) { } |
108 Iterator begin() { return Iterator(m_start); } | 109 Iterator begin() { return Iterator(m_start); } |
109 Iterator end() { return Iterator::end(); } | 110 Iterator end() { return Iterator::end(); } |
110 private: | 111 private: |
111 const StartNodeType* m_start; | 112 RawPtrWillBeMember<const StartNodeType> m_start; |
112 }; | 113 }; |
113 | 114 |
114 template <class TraversalNext> | 115 template <class TraversalNext> |
115 class TraversalIteratorBase { | 116 class TraversalIteratorBase { |
| 117 STACK_ALLOCATED(); |
116 public: | 118 public: |
117 using NodeType = typename TraversalNext::TraversalNodeType; | 119 using NodeType = typename TraversalNext::TraversalNodeType; |
118 NodeType& operator*() { return *m_current; } | 120 NodeType& operator*() { return *m_current; } |
119 bool operator!=(const TraversalIteratorBase& rval) const { return m_current
!= rval.m_current ; } | 121 bool operator!=(const TraversalIteratorBase& rval) const { return m_current
!= rval.m_current ; } |
120 protected: | 122 protected: |
121 explicit TraversalIteratorBase(NodeType* current) : m_current(current) { }; | 123 explicit TraversalIteratorBase(NodeType* current) : m_current(current) { } |
122 NodeType* m_current; | 124 |
| 125 RawPtrWillBeMember<NodeType> m_current; |
123 }; | 126 }; |
124 | 127 |
125 template <class TraversalNext> | 128 template <class TraversalNext> |
126 class TraversalChildrenIterator : public TraversalIteratorBase<TraversalNext> { | 129 class TraversalChildrenIterator : public TraversalIteratorBase<TraversalNext> { |
| 130 STACK_ALLOCATED(); |
127 public: | 131 public: |
128 using StartNodeType = Node; | 132 using StartNodeType = Node; |
129 using TraversalIteratorBase<TraversalNext>::m_current; | 133 using TraversalIteratorBase<TraversalNext>::m_current; |
130 explicit TraversalChildrenIterator(const StartNodeType* start) : TraversalIt
eratorBase<TraversalNext>(TraversalNext::firstWithin(*start)) { }; | 134 explicit TraversalChildrenIterator(const StartNodeType* start) : TraversalIt
eratorBase<TraversalNext>(TraversalNext::firstWithin(*start)) { } |
131 void operator++() { m_current = TraversalNext::nextSibling(*m_current); }; | 135 void operator++() { m_current = TraversalNext::nextSibling(*m_current); } |
132 static TraversalChildrenIterator end() { return TraversalChildrenIterator();
}; | 136 static TraversalChildrenIterator end() { return TraversalChildrenIterator();
} |
133 private: | 137 private: |
134 TraversalChildrenIterator() : TraversalIteratorBase<TraversalNext>(nullptr)
{ }; | 138 TraversalChildrenIterator() : TraversalIteratorBase<TraversalNext>(nullptr)
{ } |
135 }; | 139 }; |
136 | 140 |
137 template <class TraversalNext> | 141 template <class TraversalNext> |
138 class TraversalNextIterator : public TraversalIteratorBase<TraversalNext> { | 142 class TraversalNextIterator : public TraversalIteratorBase<TraversalNext> { |
| 143 STACK_ALLOCATED(); |
139 public: | 144 public: |
140 using StartNodeType = typename TraversalNext::TraversalNodeType; | 145 using StartNodeType = typename TraversalNext::TraversalNodeType; |
141 using TraversalIteratorBase<TraversalNext>::m_current; | 146 using TraversalIteratorBase<TraversalNext>::m_current; |
142 explicit TraversalNextIterator(const StartNodeType* start) : TraversalIterat
orBase<TraversalNext>(const_cast<StartNodeType*>(start)) { }; | 147 explicit TraversalNextIterator(const StartNodeType* start) : TraversalIterat
orBase<TraversalNext>(const_cast<StartNodeType*>(start)) { } |
143 void operator++() { m_current = TraversalNext::next(*m_current); } | 148 void operator++() { m_current = TraversalNext::next(*m_current); } |
144 static TraversalNextIterator end() { return TraversalNextIterator(nullptr);
}; | 149 static TraversalNextIterator end() { return TraversalNextIterator(nullptr);
} |
145 }; | 150 }; |
146 | 151 |
147 template <class TraversalNext> | 152 template <class TraversalNext> |
148 class TraversalDescendantIterator : public TraversalIteratorBase<TraversalNext>
{ | 153 class TraversalDescendantIterator : public TraversalIteratorBase<TraversalNext>
{ |
| 154 STACK_ALLOCATED(); |
149 public: | 155 public: |
150 using StartNodeType = Node; | 156 using StartNodeType = Node; |
151 using TraversalIteratorBase<TraversalNext>::m_current; | 157 using TraversalIteratorBase<TraversalNext>::m_current; |
152 explicit TraversalDescendantIterator(const StartNodeType* start) : Traversal
IteratorBase<TraversalNext>(TraversalNext::firstWithin(*start)), m_root(start) {
}; | 158 explicit TraversalDescendantIterator(const StartNodeType* start) : Traversal
IteratorBase<TraversalNext>(TraversalNext::firstWithin(*start)), m_root(start) {
} |
153 void operator++() { m_current = TraversalNext::next(*m_current, m_root); } | 159 void operator++() { m_current = TraversalNext::next(*m_current, m_root); } |
154 static TraversalDescendantIterator end() { return TraversalDescendantIterato
r(); }; | 160 static TraversalDescendantIterator end() { return TraversalDescendantIterato
r(); } |
155 private: | 161 private: |
156 TraversalDescendantIterator() : TraversalIteratorBase<TraversalNext>(nullptr
), m_root(nullptr) { }; | 162 TraversalDescendantIterator() : TraversalIteratorBase<TraversalNext>(nullptr
), m_root(nullptr) { } |
157 const Node* m_root; | 163 RawPtrWillBeMember<const Node> m_root; |
158 }; | 164 }; |
159 | 165 |
160 template <class TraversalNext> | 166 template <class TraversalNext> |
161 class TraversalInclusiveDescendantIterator : public TraversalIteratorBase<Traver
salNext> { | 167 class TraversalInclusiveDescendantIterator : public TraversalIteratorBase<Traver
salNext> { |
| 168 STACK_ALLOCATED(); |
162 public: | 169 public: |
163 using StartNodeType = typename TraversalNext::TraversalNodeType; | 170 using StartNodeType = typename TraversalNext::TraversalNodeType; |
164 using NodeType = typename TraversalNext::TraversalNodeType; | 171 using NodeType = typename TraversalNext::TraversalNodeType; |
165 using TraversalIteratorBase<TraversalNext>::m_current; | 172 using TraversalIteratorBase<TraversalNext>::m_current; |
166 explicit TraversalInclusiveDescendantIterator(const StartNodeType* start) :
TraversalIteratorBase<TraversalNext>(const_cast<NodeType*>(start)), m_root(start
) { }; | 173 explicit TraversalInclusiveDescendantIterator(const StartNodeType* start) :
TraversalIteratorBase<TraversalNext>(const_cast<NodeType*>(start)), m_root(start
) { } |
167 void operator++() { m_current = TraversalNext::next(*m_current, m_root); } | 174 void operator++() { m_current = TraversalNext::next(*m_current, m_root); } |
168 static TraversalInclusiveDescendantIterator end() { return TraversalInclusiv
eDescendantIterator(nullptr); }; | 175 static TraversalInclusiveDescendantIterator end() { return TraversalInclusiv
eDescendantIterator(nullptr); } |
169 private: | 176 private: |
170 const StartNodeType* m_root; | 177 RawPtrWillBeMember<const StartNodeType> m_root; |
171 }; | 178 }; |
172 | 179 |
173 inline TraversalRange<TraversalChildrenIterator<NodeTraversal>> NodeTraversal::c
hildrenOf(const Node& parent) | 180 inline TraversalRange<TraversalChildrenIterator<NodeTraversal>> NodeTraversal::c
hildrenOf(const Node& parent) |
174 { | 181 { |
175 return TraversalRange<TraversalChildrenIterator<NodeTraversal>>(&parent); | 182 return TraversalRange<TraversalChildrenIterator<NodeTraversal>>(&parent); |
176 } | 183 } |
177 | 184 |
178 inline TraversalRange<TraversalDescendantIterator<NodeTraversal>> NodeTraversal:
:descendantsOf(const Node& root) | 185 inline TraversalRange<TraversalDescendantIterator<NodeTraversal>> NodeTraversal:
:descendantsOf(const Node& root) |
179 { | 186 { |
180 return TraversalRange<TraversalDescendantIterator<NodeTraversal>>(&root); | 187 return TraversalRange<TraversalDescendantIterator<NodeTraversal>>(&root); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 { | 253 { |
247 Node* child = parent.firstChild(); | 254 Node* child = parent.firstChild(); |
248 while (child && index--) | 255 while (child && index--) |
249 child = child->nextSibling(); | 256 child = child->nextSibling(); |
250 return child; | 257 return child; |
251 } | 258 } |
252 | 259 |
253 } // namespace blink | 260 } // namespace blink |
254 | 261 |
255 #endif | 262 #endif |
OLD | NEW |