Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Side by Side Diff: third_party/WebKit/Source/core/dom/NodeTraversal.h

Issue 1932523003: Introduce NodeTraversal::ancestorsOf() and inclusiveAncestors() for range-based for loop (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 2016-04-28T18:38:12 Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 16 matching lines...) Expand all
27 #define NodeTraversal_h 27 #define NodeTraversal_h
28 28
29 #include "core/CoreExport.h" 29 #include "core/CoreExport.h"
30 #include "core/dom/ContainerNode.h" 30 #include "core/dom/ContainerNode.h"
31 #include "core/dom/Node.h" 31 #include "core/dom/Node.h"
32 #include "wtf/Allocator.h" 32 #include "wtf/Allocator.h"
33 33
34 namespace blink { 34 namespace blink {
35 35
36 template <class Iterator> class TraversalRange; 36 template <class Iterator> class TraversalRange;
37 template <class TraversalNext> class TraversalAncestorsIterator;
38 template <class TraversalNext> class TraversalInclusiveAncestorsIterator;
37 template <class TraversalNext> class TraversalChildrenIterator; 39 template <class TraversalNext> class TraversalChildrenIterator;
38 template <class TraversalNext> class TraversalDescendantIterator; 40 template <class TraversalNext> class TraversalDescendantIterator;
39 template <class TraversalNext> class TraversalInclusiveDescendantIterator; 41 template <class TraversalNext> class TraversalInclusiveDescendantIterator;
40 template <class TraversalNext> class TraversalNextIterator; 42 template <class TraversalNext> class TraversalNextIterator;
41 43
42 class NodeTraversal { 44 class NodeTraversal {
43 STATIC_ONLY(NodeTraversal); 45 STATIC_ONLY(NodeTraversal);
44 public: 46 public:
45 using TraversalNodeType = Node; 47 using TraversalNodeType = Node;
46 48
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 static Node* firstChild(const Node& parent) { return parent.firstChild(); } 95 static Node* firstChild(const Node& parent) { return parent.firstChild(); }
94 static Node* lastChild(const Node& parent) { return parent.lastChild(); } 96 static Node* lastChild(const Node& parent) { return parent.lastChild(); }
95 static Node* nextSibling(const Node& node) { return node.nextSibling(); } 97 static Node* nextSibling(const Node& node) { return node.nextSibling(); }
96 static Node* previousSibling(const Node& node) { return node.previousSibling (); } 98 static Node* previousSibling(const Node& node) { return node.previousSibling (); }
97 static ContainerNode* parent(const Node& node) { return node.parentNode(); } 99 static ContainerNode* parent(const Node& node) { return node.parentNode(); }
98 static Node* commonAncestor(const Node& nodeA, const Node& nodeB); 100 static Node* commonAncestor(const Node& nodeA, const Node& nodeB);
99 static unsigned index(const Node& node) { return node.nodeIndex(); } 101 static unsigned index(const Node& node) { return node.nodeIndex(); }
100 static unsigned countChildren(const Node& parent) { return parent.countChild ren(); } 102 static unsigned countChildren(const Node& parent) { return parent.countChild ren(); }
101 static ContainerNode* parentOrShadowHostNode(const Node& node) { return node .parentOrShadowHostNode(); } 103 static ContainerNode* parentOrShadowHostNode(const Node& node) { return node .parentOrShadowHostNode(); }
102 104
105 static TraversalRange<TraversalAncestorsIterator<NodeTraversal>> ancestorsOf (const Node&);
106 static TraversalRange<TraversalInclusiveAncestorsIterator<NodeTraversal>> in clusiveAncestorsOf(const Node&);
103 static TraversalRange<TraversalChildrenIterator<NodeTraversal>> childrenOf(c onst Node&); 107 static TraversalRange<TraversalChildrenIterator<NodeTraversal>> childrenOf(c onst Node&);
104 static TraversalRange<TraversalDescendantIterator<NodeTraversal>> descendant sOf(const Node&); 108 static TraversalRange<TraversalDescendantIterator<NodeTraversal>> descendant sOf(const Node&);
105 static TraversalRange<TraversalInclusiveDescendantIterator<NodeTraversal>> i nclusiveDescendantsOf(const Node&); 109 static TraversalRange<TraversalInclusiveDescendantIterator<NodeTraversal>> i nclusiveDescendantsOf(const Node&);
106 static TraversalRange<TraversalNextIterator<NodeTraversal>> startsAt(const N ode*); 110 static TraversalRange<TraversalNextIterator<NodeTraversal>> startsAt(const N ode*);
107 static TraversalRange<TraversalNextIterator<NodeTraversal>> startsAfter(cons t Node&); 111 static TraversalRange<TraversalNextIterator<NodeTraversal>> startsAfter(cons t Node&);
108 112
109 private: 113 private:
110 template <class NodeType> 114 template <class NodeType>
111 static Node* traverseNextTemplate(NodeType&); 115 static Node* traverseNextTemplate(NodeType&);
112 template <class NodeType> 116 template <class NodeType>
(...skipping 21 matching lines...) Expand all
134 using NodeType = typename TraversalNext::TraversalNodeType; 138 using NodeType = typename TraversalNext::TraversalNodeType;
135 NodeType& operator*() { return *m_current; } 139 NodeType& operator*() { return *m_current; }
136 bool operator!=(const TraversalIteratorBase& rval) const { return m_current != rval.m_current ; } 140 bool operator!=(const TraversalIteratorBase& rval) const { return m_current != rval.m_current ; }
137 protected: 141 protected:
138 explicit TraversalIteratorBase(NodeType* current) : m_current(current) { } 142 explicit TraversalIteratorBase(NodeType* current) : m_current(current) { }
139 143
140 Member<NodeType> m_current; 144 Member<NodeType> m_current;
141 }; 145 };
142 146
143 template <class TraversalNext> 147 template <class TraversalNext>
148 class TraversalAncestorsIterator : public TraversalIteratorBase<TraversalNext> {
149 STACK_ALLOCATED();
150 public:
151 using StartNodeType = Node;
152 using TraversalIteratorBase<TraversalNext>::m_current;
153 explicit TraversalAncestorsIterator(const StartNodeType* start) : TraversalI teratorBase<TraversalNext>(TraversalNext::parent(*start)) { }
154 void operator++() { m_current = TraversalNext::parent(*m_current); }
155 static TraversalAncestorsIterator end() { return TraversalAncestorsIterator( ); }
156 private:
157 TraversalAncestorsIterator() : TraversalIteratorBase<TraversalNext>(nullptr) { }
158 };
159
160 template <class TraversalNext>
161 class TraversalInclusiveAncestorsIterator : public TraversalIteratorBase<Travers alNext> {
162 STACK_ALLOCATED();
163 public:
164 using StartNodeType = Node;
165 using TraversalIteratorBase<TraversalNext>::m_current;
166 explicit TraversalInclusiveAncestorsIterator(const StartNodeType* start) : T raversalIteratorBase<TraversalNext>(const_cast<StartNodeType*>(start)) { }
167 void operator++() { m_current = TraversalNext::parent(*m_current); }
168 static TraversalInclusiveAncestorsIterator end() { return TraversalInclusive AncestorsIterator(); }
169 private:
170 TraversalInclusiveAncestorsIterator() : TraversalIteratorBase<TraversalNext> (nullptr) { }
171 };
172
173 template <class TraversalNext>
144 class TraversalChildrenIterator : public TraversalIteratorBase<TraversalNext> { 174 class TraversalChildrenIterator : public TraversalIteratorBase<TraversalNext> {
145 STACK_ALLOCATED(); 175 STACK_ALLOCATED();
146 public: 176 public:
147 using StartNodeType = Node; 177 using StartNodeType = Node;
148 using TraversalIteratorBase<TraversalNext>::m_current; 178 using TraversalIteratorBase<TraversalNext>::m_current;
149 explicit TraversalChildrenIterator(const StartNodeType* start) : TraversalIt eratorBase<TraversalNext>(TraversalNext::firstWithin(*start)) { } 179 explicit TraversalChildrenIterator(const StartNodeType* start) : TraversalIt eratorBase<TraversalNext>(TraversalNext::firstWithin(*start)) { }
150 void operator++() { m_current = TraversalNext::nextSibling(*m_current); } 180 void operator++() { m_current = TraversalNext::nextSibling(*m_current); }
151 static TraversalChildrenIterator end() { return TraversalChildrenIterator(); } 181 static TraversalChildrenIterator end() { return TraversalChildrenIterator(); }
152 private: 182 private:
153 TraversalChildrenIterator() : TraversalIteratorBase<TraversalNext>(nullptr) { } 183 TraversalChildrenIterator() : TraversalIteratorBase<TraversalNext>(nullptr) { }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 using StartNodeType = typename TraversalNext::TraversalNodeType; 215 using StartNodeType = typename TraversalNext::TraversalNodeType;
186 using NodeType = typename TraversalNext::TraversalNodeType; 216 using NodeType = typename TraversalNext::TraversalNodeType;
187 using TraversalIteratorBase<TraversalNext>::m_current; 217 using TraversalIteratorBase<TraversalNext>::m_current;
188 explicit TraversalInclusiveDescendantIterator(const StartNodeType* start) : TraversalIteratorBase<TraversalNext>(const_cast<NodeType*>(start)), m_root(start ) { } 218 explicit TraversalInclusiveDescendantIterator(const StartNodeType* start) : TraversalIteratorBase<TraversalNext>(const_cast<NodeType*>(start)), m_root(start ) { }
189 void operator++() { m_current = TraversalNext::next(*m_current, m_root); } 219 void operator++() { m_current = TraversalNext::next(*m_current, m_root); }
190 static TraversalInclusiveDescendantIterator end() { return TraversalInclusiv eDescendantIterator(nullptr); } 220 static TraversalInclusiveDescendantIterator end() { return TraversalInclusiv eDescendantIterator(nullptr); }
191 private: 221 private:
192 Member<const StartNodeType> m_root; 222 Member<const StartNodeType> m_root;
193 }; 223 };
194 224
225 inline TraversalRange<TraversalAncestorsIterator<NodeTraversal>> NodeTraversal:: ancestorsOf(const Node& node)
226 {
227 return TraversalRange<TraversalAncestorsIterator<NodeTraversal>>(&node);
228 }
229
230 inline TraversalRange<TraversalInclusiveAncestorsIterator<NodeTraversal>> NodeTr aversal::inclusiveAncestorsOf(const Node& node)
231 {
232 return TraversalRange<TraversalInclusiveAncestorsIterator<NodeTraversal>>(&n ode);
233 }
234
195 inline TraversalRange<TraversalChildrenIterator<NodeTraversal>> NodeTraversal::c hildrenOf(const Node& parent) 235 inline TraversalRange<TraversalChildrenIterator<NodeTraversal>> NodeTraversal::c hildrenOf(const Node& parent)
196 { 236 {
197 return TraversalRange<TraversalChildrenIterator<NodeTraversal>>(&parent); 237 return TraversalRange<TraversalChildrenIterator<NodeTraversal>>(&parent);
198 } 238 }
199 239
200 inline TraversalRange<TraversalDescendantIterator<NodeTraversal>> NodeTraversal: :descendantsOf(const Node& root) 240 inline TraversalRange<TraversalDescendantIterator<NodeTraversal>> NodeTraversal: :descendantsOf(const Node& root)
201 { 241 {
202 return TraversalRange<TraversalDescendantIterator<NodeTraversal>>(&root); 242 return TraversalRange<TraversalDescendantIterator<NodeTraversal>>(&root);
203 } 243 }
204 244
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 { 308 {
269 Node* child = parent.firstChild(); 309 Node* child = parent.firstChild();
270 while (child && index--) 310 while (child && index--)
271 child = child->nextSibling(); 311 child = child->nextSibling();
272 return child; 312 return child;
273 } 313 }
274 314
275 } // namespace blink 315 } // namespace blink
276 316
277 #endif 317 #endif
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/Node.cpp ('k') | third_party/WebKit/Source/core/dom/NodeTraversal.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698