public ValueNodeInternal <TK> AddInternalNode(TK key) { var addedNode = new ValueNodeInternal <TK>(key); _chidNodesDictionary.Add(key, addedNode); return(addedNode); }
protected ValueNode(ValueNodeInternal <TK> parentNode, TK key) { if (ReferenceEquals(key, null)) { throw new InvalidOperationException(); } ParentNode = parentNode; Key = key; }
internal override ValueNode <TK> DuplicateStructure(ValueNodeInternal <TK> parentNode, TK key) { if (HasParent) { return(new ValueNodeLeaf <TK, TV>(parentNode, key, Value)); } Key = key; ParentNode = parentNode; return(this); }
public bool TryGetInternalNode(TK key, out ValueNodeInternal <TK> node) { ValueNode <TK> childNode; if (_chidNodesDictionary.TryGetValue(key, out childNode)) { if (childNode.IsInternalNode) { node = (ValueNodeInternal <TK>)childNode; return(true); } } node = null; return(false); }
public bool TryGetInternalNode(IEnumerable <TK> keysList, out ValueNodeInternal <TK> node) { ValueNodeInternal <TK> parentNode; ValueNode <TK> childNode; if (TrySeparateKeysList(keysList, out parentNode, out childNode)) { if (childNode.IsInternalNode) { node = (ValueNodeInternal <TK>)childNode; return(true); } } node = null; return(false); }
internal override ValueNode <TK> DuplicateStructure(ValueNodeInternal <TK> parentNode, TK key) { if (HasParent == false) { Key = key; ParentNode = parentNode; return(this); } var result = new ValueNodeInternal <TK>(parentNode, key); var srcStack = new Stack <ValueNodeInternal <TK> >(); var dstStack = new Stack <ValueNodeInternal <TK> >(); srcStack.Push(this); dstStack.Push(result); while (srcStack.Count > 0) { var srcNode = srcStack.Pop(); var dstNode = dstStack.Pop(); foreach (var pair in srcNode._chidNodesDictionary) { if (pair.Value.IsLeafNode) { dstNode._chidNodesDictionary.Add(pair.Key, pair.Value); } else { var srcChild = (ValueNodeInternal <TK>)pair.Value; var dstChild = dstNode.AddInternalNode(srcChild.Key); srcStack.Push(srcChild); dstStack.Push(dstChild); } } } return(result); }
//private ValueTreeInternalNode(K key, ValueTreeInternalNode<K> src_node) // : base(key) //{ // foreach (var pair in src_node._ChidNodesDictionary) // _ChidNodesDictionary.Add(pair.Key, pair.Value); //} public bool TrySeparateKeysList(IEnumerable <TK> keysList, out ValueNodeInternal <TK> parentNode, out ValueNode <TK> childNode) { childNode = null; parentNode = this; foreach (var key in keysList) { if (childNode != null) { if (childNode.IsInternalNode) { parentNode = (ValueNodeInternal <TK>)childNode; } else { parentNode = null; childNode = null; return(false); } } if (parentNode._chidNodesDictionary.TryGetValue(key, out childNode)) { continue; } parentNode = null; return(false); } if (childNode != null) { return(true); } parentNode = null; return(false); }
private ValueNodeInternal(ValueNodeInternal <TK> parentNode, TK key) : base(parentNode, key) { }
internal abstract ValueNode <TK> DuplicateStructure(ValueNodeInternal <TK> parentNode, TK key);
private ValueNodeLeaf(ValueNodeInternal <TK> parentNode, TK key, TV value) : base(parentNode, key) { Value = value; }