Commit Graph

7 Commits

Author SHA1 Message Date
Kevin Wern
0249c4fc96 Bug 1227233: Increase scope of TreeTraversal.h to by-value traversal r=botond
MozReview-Commit-ID: LOw1k792T10
2016-09-22 12:31:26 -04:00
Kevin Wern
4d07bc92ea Bug 1227231: Use generic tree traversal algorithms for loops over Layer trees. r=botond
Create an Iterator type with classes ForwardIterator and ReverseIterator,
having GetFirstChild/GetNextSibling and GetLastChild/GetPrevSibling
methods, respectively. Specify the iterator type for each call to
ForEachNode. With this, we can support trees with forward and reverse
sibling structures.

Additionally, apply these algorithms to all Layer recursive traversals,
where applicable. Update tests to ensure both directions yield expected
results.

MozReview-Commit-ID: iYpX22XHTa
2016-03-10 01:20:40 -08:00
Kevin Wern
ffc7f593d0 Bug 1227224 - Further improvements to generic tree traversal algorithms. r=botond
- Introduce a more general version of ForEachNode that takes two actions
  (pre-action and post-action).
- Express the one-action version of ForEachNode in terms of the two-action
  version.
- Add TraversalFlag::Abort, which stops traversal immediately.
- Express DepthFirstSearch in terms of ForEachNode.
- Add ForEachNodePostOrder and DepthFirstSearchPostOrder.
- The new functions are all recursive, and traverse children in the order
  provided by the node accessors. Adjust tests to reflect this.
- Refactor two APZCTreeManager functions, FindTargetNode and GetAPZCAtPoint,
  to use the algorithms.

MozReview-Commit-ID: 83Y7psjkUWG
2016-01-25 04:04:13 -08:00
Kevin Wern
23ebce6f9a Bug 1226920 - Allow calling ForEachNode() with an action returning void r=botond 2015-11-23 13:06:01 -05:00
Kevin Wern
f7441d7bca Bug 1199798 - Create tests for TreeTraversal.h r=botond
Move queue and stack includes outside of mozilla namespace.

Test the following for searches:
- Null root returns null.
- Needle is root returns root.
- No needle results in full traversal.
- Needle node in middle returns that needle, and stops traversing.

Test the following for ForEachNode:
- Null root still runs correctly.
- No skips results in traversal of entire tree.
- Root skip results in only changing the root.
- First skips are still included (whether leaf or parent).
2015-11-16 13:54:12 -05:00
Kevin Wern
2021438d43 Bug 1199798 - Use more generic tree traversal algorithms in APZCTreeManager. r=botond
Extend the tree traversal algorithms in TreeTraversal.h, and use them
instead of manual loops in APZCTreeManager.

- Create function ForEachNode(), which calls a function on each node
  of a tree. The function must return a TraversalFlag to indicate
  whether the node's children should be visited or skipped.
- Modify DepthFirstSearch() and BreadthFirstSearch() to operate on
  pointers that are not (necessarily) const. This makes them more
  general.
- Refactor functions in APZCTreeManager: Collect, FlushRepaints,
  FlushRepaintsRecursively, FlushPendingRepaint,
  FlushPendingRepaintRecursively, UpdateZoomConstraints,
  UpdateZoomConstraintsRecursively, ClearTree, FindScrollNode.
2015-11-06 12:31:36 -05:00
Tim Stullich
19f834806c Bug 1171312 - Add generic tree search algorithms for layers-related data structures. r=botond 2015-07-21 16:36:08 -07:00