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

Unified 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, 8 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 side-by-side diff with in-line comments
Download patch
« 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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/dom/NodeTraversal.h
diff --git a/third_party/WebKit/Source/core/dom/NodeTraversal.h b/third_party/WebKit/Source/core/dom/NodeTraversal.h
index 99bf817d9564a3b74b1ad6eb9e3039a38ae2f8b9..1e458bf820a251fa1ebb1beea374cea513075254 100644
--- a/third_party/WebKit/Source/core/dom/NodeTraversal.h
+++ b/third_party/WebKit/Source/core/dom/NodeTraversal.h
@@ -34,6 +34,8 @@
namespace blink {
template <class Iterator> class TraversalRange;
+template <class TraversalNext> class TraversalAncestorsIterator;
+template <class TraversalNext> class TraversalInclusiveAncestorsIterator;
template <class TraversalNext> class TraversalChildrenIterator;
template <class TraversalNext> class TraversalDescendantIterator;
template <class TraversalNext> class TraversalInclusiveDescendantIterator;
@@ -100,6 +102,8 @@ public:
static unsigned countChildren(const Node& parent) { return parent.countChildren(); }
static ContainerNode* parentOrShadowHostNode(const Node& node) { return node.parentOrShadowHostNode(); }
+ static TraversalRange<TraversalAncestorsIterator<NodeTraversal>> ancestorsOf(const Node&);
+ static TraversalRange<TraversalInclusiveAncestorsIterator<NodeTraversal>> inclusiveAncestorsOf(const Node&);
static TraversalRange<TraversalChildrenIterator<NodeTraversal>> childrenOf(const Node&);
static TraversalRange<TraversalDescendantIterator<NodeTraversal>> descendantsOf(const Node&);
static TraversalRange<TraversalInclusiveDescendantIterator<NodeTraversal>> inclusiveDescendantsOf(const Node&);
@@ -141,6 +145,32 @@ protected:
};
template <class TraversalNext>
+class TraversalAncestorsIterator : public TraversalIteratorBase<TraversalNext> {
+ STACK_ALLOCATED();
+public:
+ using StartNodeType = Node;
+ using TraversalIteratorBase<TraversalNext>::m_current;
+ explicit TraversalAncestorsIterator(const StartNodeType* start) : TraversalIteratorBase<TraversalNext>(TraversalNext::parent(*start)) { }
+ void operator++() { m_current = TraversalNext::parent(*m_current); }
+ static TraversalAncestorsIterator end() { return TraversalAncestorsIterator(); }
+private:
+ TraversalAncestorsIterator() : TraversalIteratorBase<TraversalNext>(nullptr) { }
+};
+
+template <class TraversalNext>
+class TraversalInclusiveAncestorsIterator : public TraversalIteratorBase<TraversalNext> {
+ STACK_ALLOCATED();
+public:
+ using StartNodeType = Node;
+ using TraversalIteratorBase<TraversalNext>::m_current;
+ explicit TraversalInclusiveAncestorsIterator(const StartNodeType* start) : TraversalIteratorBase<TraversalNext>(const_cast<StartNodeType*>(start)) { }
+ void operator++() { m_current = TraversalNext::parent(*m_current); }
+ static TraversalInclusiveAncestorsIterator end() { return TraversalInclusiveAncestorsIterator(); }
+private:
+ TraversalInclusiveAncestorsIterator() : TraversalIteratorBase<TraversalNext>(nullptr) { }
+};
+
+template <class TraversalNext>
class TraversalChildrenIterator : public TraversalIteratorBase<TraversalNext> {
STACK_ALLOCATED();
public:
@@ -192,6 +222,16 @@ private:
Member<const StartNodeType> m_root;
};
+inline TraversalRange<TraversalAncestorsIterator<NodeTraversal>> NodeTraversal::ancestorsOf(const Node& node)
+{
+ return TraversalRange<TraversalAncestorsIterator<NodeTraversal>>(&node);
+}
+
+inline TraversalRange<TraversalInclusiveAncestorsIterator<NodeTraversal>> NodeTraversal::inclusiveAncestorsOf(const Node& node)
+{
+ return TraversalRange<TraversalInclusiveAncestorsIterator<NodeTraversal>>(&node);
+}
+
inline TraversalRange<TraversalChildrenIterator<NodeTraversal>> NodeTraversal::childrenOf(const Node& parent)
{
return TraversalRange<TraversalChildrenIterator<NodeTraversal>>(&parent);
« 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