/// <summary> /// Expand description /// </summary> /// <param name="levels">levels</param> /// <param name="expandUnanswered">expandUnanswered</param> public void Expand(int levels, bool expandUnanswered) { Debug.Assert(levels > 0); if (levels <= 0) { return; // nothing to do -- unexpected } if (!expandUnanswered && !IsAnswered && !HasChildren) { return; // don't waste memory by pushing down unanswered values to the next level unnecessarily } if (_children == null) { // we may be expanding an Answered node or an Unanswered node here if (IsAnswered) { _children = new ValueNodeList <T>(1); // push current value down to first child _children.PrepareForIndex(0); (_children[0] as ValueNode <T>).Value = _value; _value = default(T); // this node becomes unanswered } else // not answered { Debug.Assert(expandUnanswered); _children = new ValueNodeList <T>(); } --levels; } else { // children already exist Debug.Assert(!IsAnswered); } if (levels == 0) // we're done; { return; // drop out of recursion } // recurse into child nodes foreach (ValueNode <T> child in _children) { child.Expand(levels, expandUnanswered); } }
/// <summary> /// ValueNode constructor /// </summary> /// <param name="value">value</param> public ValueNode(T value) { _value = value; _children = null; }
/// <summary> /// ValueNode constructor /// </summary> public ValueNode() { _value = default(T); _children = null; }