예제 #1
0
        public Id[] Split()
        {
            var i1 = new Id();
            var i2 = new Id();

            if (IsLeaf
                && Value == 0)
            {
                i1.SetAsLeaf(0);

                i2.SetAsLeaf(0);

                return new[]
                           {
                               i1, i2
                           };
            }

            if (IsLeaf
                && Value == 1)
            {
                // id = 1
                i1.SetAsNode(0, 1, 0, null);

                i2.SetAsNode(0, 0, 1, null);

                return new[]
                           {
                               i1, i2
                           };
            }

            if (!IsLeaf
                && (Left.IsLeaf && Left.Value == 0)
                && (!Right.IsLeaf || Right.Value == 1))
            {
                // id = (0, i)
                var ip = Right.Split();

                i1.SetAsNode(0, new Id(0), ip[0]);

                i2.SetAsNode(0, new Id(0), ip[1]);

                return new[]
                           {
                               i1, i2
                           };
            }

            if (!IsLeaf
                && (!Left.IsLeaf || Left.Value == 1)
                && (Right.IsLeaf && Right.Value == 0))
            {
                // id = (i, 0)
                var ip = Left.Split();

                i1.SetAsNode(0, ip[0], new Id(0));

                i2.SetAsNode(0, ip[1], new Id(0));

                return new[]
                           {
                               i1, i2
                           };
            }

            if (!IsLeaf
                && (!Left.IsLeaf || Left.Value == 1)
                && (!Right.IsLeaf || Right.Value == 1))
            {
                // id = (i1, i2)
                i1.SetAsNode(0, Clone(Left), new Id(0));

                i2.SetAsNode(0, new Id(0), Clone(Right));

                return new[]
                           {
                               i1, i2
                           };
            }

            throw new IdOperationException("Split failed", this, null);
        }