コード例 #1
0
ファイル: KeyTree.cs プロジェクト: csharpyoudull/SquirrelDb
        /// <summary>
        /// Inserts the specified value.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <param name="pointer">The pointer.</param>
        public void Insert(long value, DataPointer pointer)
        {
            if (Root == null)
            {
                Count++;
                Root = new KeyNode {
                    Value = value, Pointer = pointer
                };
                return;
            }

            var freeNode = SeekFreeNode(value);

            if (freeNode.Value.Equals(value))
            {
                throw new DuplicateKeyException();
            }

            if (value < freeNode.Value)
            {
                Count++;
                freeNode.Left = new KeyNode {
                    Parent = freeNode, Pointer = pointer, Value = value
                };
                Save();
                return;
            }

            Count++;
            freeNode.Right = new KeyNode {
                Parent = freeNode, Pointer = pointer, Value = value
            };
            Save();
        }
コード例 #2
0
ファイル: KeyTree.cs プロジェクト: csharpyoudull/SquirrelDb
        /// <summary>
        /// Seeks the free node.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <param name="from">From.</param>
        /// <returns>KeyNode.</returns>
        private KeyNode SeekFreeNode(long value, KeyNode from = null)
        {
            var node = from ?? Root;

            if (node.Value.Equals(value))
            {
                return(node);
            }

            var seek = node;

            while (seek != null)
            {
                if (seek.Value.Equals(value))
                {
                    return(seek);
                }

                if (seek.Left == null && value < seek.Value)
                {
                    return(seek);
                }

                if (seek.Right == null && value > seek.Value)
                {
                    return(seek);
                }

                if (value < seek.Value)
                {
                    seek = seek.Left;
                    continue;
                }

                if (value > seek.Value)
                {
                    seek = seek.Right;
                }
            }

            return(null);
        }
コード例 #3
0
ファイル: KeyTree.cs プロジェクト: csharpyoudull/SquirrelDb
        /// <summary>
        /// Seeks the node.
        /// </summary>
        /// <param name="node">The node.</param>
        /// <param name="value">The value.</param>
        /// <returns>KeyNode.</returns>
        public KeyNode SeekNode(KeyNode node, long value)
        {
            if (Root == null)
            {
                return(null);
            }

            if (node == null)
            {
                node = Root;
            }

            if (node.Value.Equals(value))
            {
                return(node);
            }

            var seek = node;

            while (seek != null)
            {
                if (seek.Value.Equals(value))
                {
                    return(seek);
                }

                if (value < seek.Value)
                {
                    seek = seek.Left;
                    continue;
                }

                if (value > seek.Value)
                {
                    seek = seek.Right;
                }
            }

            return(null);
        }
コード例 #4
0
ファイル: KeyTree.cs プロジェクト: csharpyoudull/SquirrelDb
        /// <summary>
        /// Seeks the free node.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <param name="from">From.</param>
        /// <returns>KeyNode.</returns>
        private KeyNode SeekFreeNode(long value, KeyNode from = null)
        {
            var node = from ?? Root;

            if (node.Value.Equals(value))
                return node;

            var seek = node;

            while (seek != null)
            {
                if (seek.Value.Equals(value))
                    return seek;

                if (seek.Left == null && value < seek.Value)
                    return seek;

                if (seek.Right == null && value > seek.Value)
                    return seek;

                if (value < seek.Value)
                {
                    seek = seek.Left;
                    continue;
                }

                if (value > seek.Value)
                    seek = seek.Right;
            }

            return null;
        }
コード例 #5
0
ファイル: KeyTree.cs プロジェクト: csharpyoudull/SquirrelDb
        /// <summary>
        /// Seeks the node.
        /// </summary>
        /// <param name="node">The node.</param>
        /// <param name="value">The value.</param>
        /// <returns>KeyNode.</returns>
        public KeyNode SeekNode(KeyNode node, long value)
        {
            if (Root == null)
                return null;

            if (node == null)
                node = Root;

            if (node.Value.Equals(value))
                return node;

            var seek = node;

            while (seek != null)
            {
                if (seek.Value.Equals(value))
                    return seek;

                if (value < seek.Value)
                {
                    seek = seek.Left;
                    continue;
                }

                if (value > seek.Value)
                    seek = seek.Right;
            }

            return null;
        }
コード例 #6
0
ファイル: KeyTree.cs プロジェクト: csharpyoudull/SquirrelDb
        /// <summary>
        /// Inserts the specified value.
        /// </summary>
        /// <param name="value">The value.</param>
        /// <param name="pointer">The pointer.</param>
        public void Insert(long value, DataPointer pointer)
        {
            if (Root == null)
            {
                Count++;
                Root = new KeyNode {Value = value, Pointer = pointer};
                return;
            }

            var freeNode = SeekFreeNode(value);

            if (freeNode.Value.Equals(value))
            {
                throw new DuplicateKeyException();
            }

            if (value < freeNode.Value)
            {
                Count++;
                freeNode.Left = new KeyNode {Parent = freeNode, Pointer = pointer, Value = value};
                Save();
                return;
            }

            Count++;
            freeNode.Right = new KeyNode {Parent = freeNode, Pointer = pointer, Value = value};
            Save();
        }