コード例 #1
0
ファイル: ValueNodeInternal.cs プロジェクト: phreed/GMac
        public ValueNodeInternal <TK> AddInternalNode(TK key)
        {
            var addedNode = new ValueNodeInternal <TK>(key);

            _chidNodesDictionary.Add(key, addedNode);

            return(addedNode);
        }
コード例 #2
0
        protected ValueNode(ValueNodeInternal <TK> parentNode, TK key)
        {
            if (ReferenceEquals(key, null))
            {
                throw new InvalidOperationException();
            }

            ParentNode = parentNode;
            Key        = key;
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: ValueNodeInternal.cs プロジェクト: phreed/GMac
        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);
        }
コード例 #5
0
ファイル: ValueNodeInternal.cs プロジェクト: phreed/GMac
        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);
        }
コード例 #6
0
ファイル: ValueNodeInternal.cs プロジェクト: phreed/GMac
        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);
        }
コード例 #7
0
ファイル: ValueNodeInternal.cs プロジェクト: phreed/GMac
        //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);
        }
コード例 #8
0
ファイル: ValueNodeInternal.cs プロジェクト: phreed/GMac
 private ValueNodeInternal(ValueNodeInternal <TK> parentNode, TK key)
     : base(parentNode, key)
 {
 }
コード例 #9
0
 internal abstract ValueNode <TK> DuplicateStructure(ValueNodeInternal <TK> parentNode, TK key);
コード例 #10
0
 private ValueNodeLeaf(ValueNodeInternal <TK> parentNode, TK key, TV value)
     : base(parentNode, key)
 {
     Value = value;
 }