Chromium Code Reviews| 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 TraversalAncestorsOrSelfIterator; | |
| 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<TraversalAncestorsOrSelfIterator<NodeTraversal>> ances torsOrSelfOf(const Node*); | |
|
fs
2016/04/28 08:18:52
Drive-by: ancestorsOrSelfOf is kind of a weird nam
yosin_UTC9
2016/04/28 08:59:05
Done.
| |
| 107 static TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>> ances torsOrSelfOf(const Node&); | |
| 103 static TraversalRange<TraversalChildrenIterator<NodeTraversal>> childrenOf(c onst Node&); | 108 static TraversalRange<TraversalChildrenIterator<NodeTraversal>> childrenOf(c onst Node&); |
| 104 static TraversalRange<TraversalDescendantIterator<NodeTraversal>> descendant sOf(const Node&); | 109 static TraversalRange<TraversalDescendantIterator<NodeTraversal>> descendant sOf(const Node&); |
| 105 static TraversalRange<TraversalInclusiveDescendantIterator<NodeTraversal>> i nclusiveDescendantsOf(const Node&); | 110 static TraversalRange<TraversalInclusiveDescendantIterator<NodeTraversal>> i nclusiveDescendantsOf(const Node&); |
| 106 static TraversalRange<TraversalNextIterator<NodeTraversal>> startsAt(const N ode*); | 111 static TraversalRange<TraversalNextIterator<NodeTraversal>> startsAt(const N ode*); |
| 107 static TraversalRange<TraversalNextIterator<NodeTraversal>> startsAfter(cons t Node&); | 112 static TraversalRange<TraversalNextIterator<NodeTraversal>> startsAfter(cons t Node&); |
| 108 | 113 |
| 109 private: | 114 private: |
| 110 template <class NodeType> | 115 template <class NodeType> |
| 111 static Node* traverseNextTemplate(NodeType&); | 116 static Node* traverseNextTemplate(NodeType&); |
| 112 template <class NodeType> | 117 template <class NodeType> |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 134 using NodeType = typename TraversalNext::TraversalNodeType; | 139 using NodeType = typename TraversalNext::TraversalNodeType; |
| 135 NodeType& operator*() { return *m_current; } | 140 NodeType& operator*() { return *m_current; } |
| 136 bool operator!=(const TraversalIteratorBase& rval) const { return m_current != rval.m_current ; } | 141 bool operator!=(const TraversalIteratorBase& rval) const { return m_current != rval.m_current ; } |
| 137 protected: | 142 protected: |
| 138 explicit TraversalIteratorBase(NodeType* current) : m_current(current) { } | 143 explicit TraversalIteratorBase(NodeType* current) : m_current(current) { } |
| 139 | 144 |
| 140 Member<NodeType> m_current; | 145 Member<NodeType> m_current; |
| 141 }; | 146 }; |
| 142 | 147 |
| 143 template <class TraversalNext> | 148 template <class TraversalNext> |
| 149 class TraversalAncestorsIterator : public TraversalIteratorBase<TraversalNext> { | |
| 150 STACK_ALLOCATED(); | |
| 151 public: | |
| 152 using StartNodeType = Node; | |
| 153 using TraversalIteratorBase<TraversalNext>::m_current; | |
| 154 explicit TraversalAncestorsIterator(const StartNodeType* start) : TraversalI teratorBase<TraversalNext>(TraversalNext::parent(*start)) { } | |
| 155 void operator++() { m_current = TraversalNext::parent(*m_current); } | |
| 156 static TraversalAncestorsIterator end() { return TraversalAncestorsIterator( ); } | |
| 157 private: | |
| 158 TraversalAncestorsIterator() : TraversalIteratorBase<TraversalNext>(nullptr) { } | |
| 159 }; | |
| 160 | |
| 161 template <class TraversalNext> | |
| 162 class TraversalAncestorsOrSelfIterator : public TraversalIteratorBase<TraversalN ext> { | |
| 163 STACK_ALLOCATED(); | |
| 164 public: | |
| 165 using StartNodeType = Node; | |
| 166 using TraversalIteratorBase<TraversalNext>::m_current; | |
| 167 explicit TraversalAncestorsOrSelfIterator(const StartNodeType* start) : Trav ersalIteratorBase<TraversalNext>(const_cast<StartNodeType*>(start)) { } | |
| 168 void operator++() { m_current = TraversalNext::parent(*m_current); } | |
| 169 static TraversalAncestorsOrSelfIterator end() { return TraversalAncestorsOrS elfIterator(); } | |
| 170 private: | |
| 171 TraversalAncestorsOrSelfIterator() : TraversalIteratorBase<TraversalNext>(nu llptr) { } | |
| 172 }; | |
| 173 | |
| 174 template <class TraversalNext> | |
| 144 class TraversalChildrenIterator : public TraversalIteratorBase<TraversalNext> { | 175 class TraversalChildrenIterator : public TraversalIteratorBase<TraversalNext> { |
| 145 STACK_ALLOCATED(); | 176 STACK_ALLOCATED(); |
| 146 public: | 177 public: |
| 147 using StartNodeType = Node; | 178 using StartNodeType = Node; |
| 148 using TraversalIteratorBase<TraversalNext>::m_current; | 179 using TraversalIteratorBase<TraversalNext>::m_current; |
| 149 explicit TraversalChildrenIterator(const StartNodeType* start) : TraversalIt eratorBase<TraversalNext>(TraversalNext::firstWithin(*start)) { } | 180 explicit TraversalChildrenIterator(const StartNodeType* start) : TraversalIt eratorBase<TraversalNext>(TraversalNext::firstWithin(*start)) { } |
| 150 void operator++() { m_current = TraversalNext::nextSibling(*m_current); } | 181 void operator++() { m_current = TraversalNext::nextSibling(*m_current); } |
| 151 static TraversalChildrenIterator end() { return TraversalChildrenIterator(); } | 182 static TraversalChildrenIterator end() { return TraversalChildrenIterator(); } |
| 152 private: | 183 private: |
| 153 TraversalChildrenIterator() : TraversalIteratorBase<TraversalNext>(nullptr) { } | 184 TraversalChildrenIterator() : TraversalIteratorBase<TraversalNext>(nullptr) { } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 185 using StartNodeType = typename TraversalNext::TraversalNodeType; | 216 using StartNodeType = typename TraversalNext::TraversalNodeType; |
| 186 using NodeType = typename TraversalNext::TraversalNodeType; | 217 using NodeType = typename TraversalNext::TraversalNodeType; |
| 187 using TraversalIteratorBase<TraversalNext>::m_current; | 218 using TraversalIteratorBase<TraversalNext>::m_current; |
| 188 explicit TraversalInclusiveDescendantIterator(const StartNodeType* start) : TraversalIteratorBase<TraversalNext>(const_cast<NodeType*>(start)), m_root(start ) { } | 219 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); } | 220 void operator++() { m_current = TraversalNext::next(*m_current, m_root); } |
| 190 static TraversalInclusiveDescendantIterator end() { return TraversalInclusiv eDescendantIterator(nullptr); } | 221 static TraversalInclusiveDescendantIterator end() { return TraversalInclusiv eDescendantIterator(nullptr); } |
| 191 private: | 222 private: |
| 192 Member<const StartNodeType> m_root; | 223 Member<const StartNodeType> m_root; |
| 193 }; | 224 }; |
| 194 | 225 |
| 226 inline TraversalRange<TraversalAncestorsIterator<NodeTraversal>> NodeTraversal:: ancestorsOf(const Node& node) | |
| 227 { | |
| 228 return TraversalRange<TraversalAncestorsIterator<NodeTraversal>>(&node); | |
| 229 } | |
| 230 | |
| 231 inline TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>> NodeTrave rsal::ancestorsOrSelfOf(const Node& node) | |
| 232 { | |
| 233 return TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>>(&node ); | |
| 234 } | |
| 235 | |
| 236 inline TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>> NodeTrave rsal::ancestorsOrSelfOf(const Node* node) | |
|
hayato
2016/04/28 08:38:20
It might be better that we do not provide a pointe
yosin_UTC9
2016/04/28 08:59:04
I don't agree, pointer version is useful and safe
yosin_UTC9
2016/04/28 09:01:29
Actually, I introduced reference version only then
| |
| 237 { | |
| 238 return TraversalRange<TraversalAncestorsOrSelfIterator<NodeTraversal>>(node) ; | |
| 239 } | |
| 240 | |
| 195 inline TraversalRange<TraversalChildrenIterator<NodeTraversal>> NodeTraversal::c hildrenOf(const Node& parent) | 241 inline TraversalRange<TraversalChildrenIterator<NodeTraversal>> NodeTraversal::c hildrenOf(const Node& parent) |
| 196 { | 242 { |
| 197 return TraversalRange<TraversalChildrenIterator<NodeTraversal>>(&parent); | 243 return TraversalRange<TraversalChildrenIterator<NodeTraversal>>(&parent); |
| 198 } | 244 } |
| 199 | 245 |
| 200 inline TraversalRange<TraversalDescendantIterator<NodeTraversal>> NodeTraversal: :descendantsOf(const Node& root) | 246 inline TraversalRange<TraversalDescendantIterator<NodeTraversal>> NodeTraversal: :descendantsOf(const Node& root) |
| 201 { | 247 { |
| 202 return TraversalRange<TraversalDescendantIterator<NodeTraversal>>(&root); | 248 return TraversalRange<TraversalDescendantIterator<NodeTraversal>>(&root); |
| 203 } | 249 } |
| 204 | 250 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 268 { | 314 { |
| 269 Node* child = parent.firstChild(); | 315 Node* child = parent.firstChild(); |
| 270 while (child && index--) | 316 while (child && index--) |
| 271 child = child->nextSibling(); | 317 child = child->nextSibling(); |
| 272 return child; | 318 return child; |
| 273 } | 319 } |
| 274 | 320 |
| 275 } // namespace blink | 321 } // namespace blink |
| 276 | 322 |
| 277 #endif | 323 #endif |
| OLD | NEW |