Seq(IPersistentMap meta, ISeq s, int i, BitmapIndexedNode node) : base(meta) { _s = s; _i = i; _node = node; }
public INode assoc(int shift, int hash, object key, object val, Box addedLeaf) { if (hash == _hash) { if (Util.equals(key, _key)) { if (val == _val) { return(this); } // note - do not set AddedLeaf, since we are replacing else { return(new LeafNode(hash, key, val)); } } else { // hash collision, same hash, different keys LeafNode newLeaf = new LeafNode(hash, key, val); addedLeaf.Val = newLeaf; return(new HashCollisionNode(hash, this, newLeaf)); } } else { return(BitmapIndexedNode.create(shift, this, hash, key, val, addedLeaf)); } }
internal override NodeBase Remove(object owner, int shift, int hash, TKey key, Comparers comparers, out OperationResult result) { int bit = 1 << Mask(hash, shift); if ((_bitmap & bit) == 0) { // Not found noop result = OperationResult.NoChangeRequired; return(this); } int idx = GetIndex(bit); NodeBase n = _nodes[idx].Remove(owner, shift + BITS, hash, key, comparers, out result); if (n == _nodes[idx]) { return(this); } if (n != null) { var newNode = EnsureEditable(owner); newNode._nodes[idx] = n; return(newNode); } if (_bitmap == bit) { return(null); } // removed, so resize BitmapIndexedNode editable = EnsureEditable(owner); editable._bitmap ^= bit; Array.Copy(editable._nodes, idx + 1, editable._nodes, idx, editable._nodes.Length - (idx + 1)); editable._nodes[editable._nodes.Length - 1] = null; return(editable); }
public INode assoc(int shift, int hash, object key, object val, Box addedLeaf) { if (_hash == hash) { int idx = findIndex(hash, key); if (idx != -1) { if (_leaves[idx].val() == val) { return(this); } LeafNode[] newLeaves1 = (LeafNode[])_leaves.Clone(); // Note: do not set addedLeaf, since we are replacing newLeaves1[idx] = new LeafNode(hash, key, val); return(new HashCollisionNode(hash, newLeaves1)); } LeafNode[] newLeaves = new LeafNode[_leaves.Length + 1]; Array.Copy(_leaves, 0, newLeaves, 0, _leaves.Length); addedLeaf.Val = newLeaves[_leaves.Length] = new LeafNode(hash, key, val); return(new HashCollisionNode(hash, newLeaves)); } return(BitmapIndexedNode.create(shift, this, hash, key, val, addedLeaf)); }
public static ISeq create(BitmapIndexedNode node, int i) { return i >= node._nodes.Length ? null : new Seq(node._nodes[i].nodeSeq(), i, node); }
Seq(ISeq s, int i, BitmapIndexedNode node) { _s = s; _i = i; _node = node; }
public static ISeq create(BitmapIndexedNode node, int i) { return(i >= node._nodes.Length ? null : new Seq(node._nodes[i].nodeSeq(), i, node)); }