Exemple #1
0
        private TreeEvalItem <TTreeNode> GetLastLeafAtDepth(TTreeNode node, TreeNodePath path, int targetDepth)
        {
            if (path.Count == targetDepth)
            {
                return(new TreeEvalItem <TTreeNode>(node, path));
            }

            List <TTreeNode> children = m_traversalParameters.GetChildrenMethod(node).ToList();

            for (int childIndex = children.Count - 1; childIndex >= 0; --childIndex)
            {
                var result = GetLastLeafAtDepth(children[childIndex], path.CopyAndAddToPath(childIndex), targetDepth);
                if (result != null)
                {
                    return(result);
                }
            }

            return(null);
        }
Exemple #2
0
        public void SetupForArbitraryIteration(List <TreeEvalItem <TTreeNode> > nextEvals)
        {
            // It's possible we started this iteration arbitrarily
            TreeNodePath path   = this.TargetPath;
            TTreeNode    target = this.Target;

            while (nextEvals.Count == 0)
            {
                var parent = target != null?m_traversalParameters.GetParentMethod(target) : null;

                if (parent == null)
                {
                    break;
                }

                path = path.CopyAndRemoveEnd();
                var children = m_traversalParameters.GetChildrenMethod(parent).ToList();
                int index    = children.IndexOf(target);
                if (index + 1 < children.Count)
                {
                    for (int childIndex = index + 1; childIndex < children.Count; ++childIndex)
                    {
                        nextEvals.Add(new TreeEvalItem <TTreeNode>(children[childIndex], path.CopyAndAddToPath(index)));
                    }

                    return;
                }

                target = parent;
            }
        }