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

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

Issue 789673005: Oilpan: make NodeTraversal iterators trace their references. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698