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)); }
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)); }
private VectorLevel <T> AppendedNode(IVectorNode <T> item) { var children = _children.Append(item); return(new VectorLevel <T>(children, Level)); }
// Private methods private VectorLevel <T> ChangedNode(IVectorNode <T> item, int index) { var children = _children.Change(item, index); return(new VectorLevel <T>(children, Level)); }
private ImmutableVector(IVectorNode <T> root, int count) { Length = count; _root = root; }
// Constructors public ImmutableVector() { Length = 0; _root = EmptyVector; }