Ejemplo n.º 1
0
        public IVectorNode <T> Append(T elem, int count)
        {
            var length = _children.Length;

            // We need to create node with new child on given index.
            var index = CountIndex(count);

            // Maximum capacity reached, this can only occur on top-level (root) node.
            if (count == 1 << ImmutableVectorHelper.Shift * (Level + 1))
            {
                // Create new top-level node and propagate it.
                var children = new IVectorNode <T>[] { this, new VectorLevel <T>(elem, Level) };
                return(new VectorLevel <T>(children, Level + 1));
            }

            // Extend current children array.
            if (index == length)
            {
                return(AppendedNode(elem));
            }

            // Or change it.
            var result = _children[index].Append(elem, count);

            return(ChangedNode(result, index));
        }
Ejemplo n.º 2
0
        public IVectorNode <T> Append(T elem, int count)
        {
            if (_elements.Length == ImmutableVectorHelper.Fragmentation)
            {
                var children = new IVectorNode <T>[] { this, new VectorLeaf <T>(elem) };

                return(new VectorLevel <T>(children, Level + 1));
            }

            var elements = _elements.Append(elem);

            return(new VectorLeaf <T>(elements));
        }
Ejemplo n.º 3
0
        private VectorLevel <T> AppendedNode(IVectorNode <T> item)
        {
            var children = _children.Append(item);

            return(new VectorLevel <T>(children, Level));
        }
Ejemplo n.º 4
0
        // Private methods

        private VectorLevel <T> ChangedNode(IVectorNode <T> item, int index)
        {
            var children = _children.Change(item, index);

            return(new VectorLevel <T>(children, Level));
        }
Ejemplo n.º 5
0
        private ImmutableVector(IVectorNode <T> root, int count)
        {
            Length = count;

            _root = root;
        }
Ejemplo n.º 6
0
        // Constructors

        public ImmutableVector()
        {
            Length = 0;

            _root = EmptyVector;
        }