| 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 16 matching lines...) Expand all Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |