private void Walk(Tree tree, Tree auxTree) { var mi = new TreeIterator(tree, TreeIterator.Order.POSTORDER); var ai = new TreeIterator(auxTree, TreeIterator.Order.POSTORDER); TreeEntry m = mi.hasNext() ? mi.next() : null; TreeEntry a = ai.hasNext() ? ai.next() : null; int curIndexPos = IndexCounter; GitIndex.Entry entry = (IndexCounter < _indexMembers.Length) ? _indexMembers[IndexCounter++] : null; while (((m != null) || (a != null)) || (entry != null)) { int cmpma = Compare(m, a); int cmpmi = Compare(m, entry); int cmpai = Compare(a, entry); TreeEntry pm = ((cmpma <= 0) && (cmpmi <= 0)) ? m : null; TreeEntry pa = ((cmpma >= 0) && (cmpai <= 0)) ? a : null; GitIndex.Entry pi = ((cmpmi >= 0) && (cmpai >= 0)) ? entry : null; if (pi != null) { VisitEntry(pm, pa, pi); } else { FinishVisitTree(pm, pa, curIndexPos); } if (pm != null) { m = mi.hasNext() ? mi.next() : null; } if (pa != null) { a = ai.hasNext() ? ai.next() : null; } if (pi != null) { entry = (IndexCounter < _indexMembers.Length) ? _indexMembers[IndexCounter++] : null; } } }
private bool Step() { if (_tree == null) return false; if (_sub != null) { if (_sub.Step()) return true; _sub = null; } if (_index < 0 && !_hasVisitedTree && _order == Order.PREORDER) { _hasVisitedTree = true; return true; } while (++_index < _tree.MemberCount) { TreeEntry e = _tree.Members[_index]; if (e is Tree) { _sub = new TreeIterator((Tree)e, _order, _visitTreeNodes); if (_sub.HasNextTreeEntry()) return true; _sub = null; continue; } return true; } if (_index == _tree.MemberCount && !_hasVisitedTree && _order == Order.POSTORDER) { _hasVisitedTree = true; return true; } return false; }