コード例 #1
0
 Seq(IPersistentMap meta, ISeq s, int i, BitmapIndexedNode node)
     : base(meta)
 {
     _s    = s;
     _i    = i;
     _node = node;
 }
コード例 #2
0
 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));
     }
 }
コード例 #3
0
            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);
            }
コード例 #4
0
 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));
 }
コード例 #5
0
 public static ISeq create(BitmapIndexedNode node, int i)
 {
     return i >= node._nodes.Length
         ? null
         : new Seq(node._nodes[i].nodeSeq(), i, node);
 }
コード例 #6
0
 Seq(IPersistentMap meta, ISeq s, int i, BitmapIndexedNode node)
     : base(meta)
 {
     _s = s;
     _i = i;
     _node = node;
 }
コード例 #7
0
 Seq(ISeq s, int i, BitmapIndexedNode node)
 {
     _s = s;
     _i = i;
     _node = node;
 }
コード例 #8
0
 public static ISeq create(BitmapIndexedNode node, int i)
 {
     return(i >= node._nodes.Length
         ? null
         : new Seq(node._nodes[i].nodeSeq(), i, node));
 }
コード例 #9
0
 Seq(ISeq s, int i, BitmapIndexedNode node)
 {
     _s    = s;
     _i    = i;
     _node = node;
 }