@@ -191,6 +191,46 @@ class TreeNode : public Weakable<T> {
191
191
return IterationDecision::Continue;
192
192
}
193
193
194
+ template <typename Callback>
195
+ IterationDecision for_each_in_subtree (Callback callback) const
196
+ {
197
+ for (auto * child = first_child (); child; child = child->next_sibling ()) {
198
+ if (child->for_each_in_inclusive_subtree (callback) == IterationDecision::Break)
199
+ return IterationDecision::Break;
200
+ }
201
+ return IterationDecision::Continue;
202
+ }
203
+
204
+ template <typename Callback>
205
+ IterationDecision for_each_in_subtree (Callback callback)
206
+ {
207
+ for (auto * child = first_child (); child; child = child->next_sibling ()) {
208
+ if (child->for_each_in_inclusive_subtree (callback) == IterationDecision::Break)
209
+ return IterationDecision::Break;
210
+ }
211
+ return IterationDecision::Continue;
212
+ }
213
+
214
+ template <typename U, typename Callback>
215
+ IterationDecision for_each_in_subtree_of_type (Callback callback)
216
+ {
217
+ for (auto * child = first_child (); child; child = child->next_sibling ()) {
218
+ if (child->template for_each_in_inclusive_subtree_of_type <U>(callback) == IterationDecision::Break)
219
+ return IterationDecision::Break;
220
+ }
221
+ return IterationDecision::Continue;
222
+ }
223
+
224
+ template <typename U, typename Callback>
225
+ IterationDecision for_each_in_subtree_of_type (Callback callback) const
226
+ {
227
+ for (auto * child = first_child (); child; child = child->next_sibling ()) {
228
+ if (child->template for_each_in_inclusive_subtree_of_type <U>(callback) == IterationDecision::Break)
229
+ return IterationDecision::Break;
230
+ }
231
+ return IterationDecision::Continue;
232
+ }
233
+
194
234
template <typename Callback>
195
235
void for_each_child (Callback callback) const
196
236
{
0 commit comments