Example #1
0
 public Branch(BuilderToken owner, uint bitMaskValues, uint bitMaskBranches, ValueNode[] nodes, Branch[] branches)
 {
     OwnerToken      = owner;
     BitMaskValues   = bitMaskValues;
     BitMaskBranches = bitMaskBranches;
     Values          = nodes;
     Branches        = branches;
 }
        private static Branch CreateFrom(IEqualityComparer <TKey> equalityComparer, ValueNode node, int level, int hash, TKey key, TValue value,
                                         BuilderToken builderToken)
        {
            var firstBitMask  = GetBitMask(equalityComparer.GetHashCode(node.Key) >> level);
            var secondBitMask = GetBitMask(hash);

            if (firstBitMask == secondBitMask)
            {
                // hash collision
                if (level >= Branch.MaxLevel)
                {
                    var newNodesInner = new ValueNode[2];
                    newNodesInner[0] = node;
                    newNodesInner[1] = new ValueNode(key, value);
                    return(new Branch(builderToken, 0, 0, newNodesInner, Array.Empty <Branch>()));
                }

                var nextBranch = CreateFrom(equalityComparer, node, level + Branch.BitWidth, hash >> 5, key, value, builderToken);
                return(new Branch(builderToken, 0, firstBitMask, Array.Empty <ValueNode>(), new[] { nextBranch }));
            }

            var resultBitBask = firstBitMask | secondBitMask;

            var newNodes = new ValueNode[2];

            if (firstBitMask < secondBitMask)
            {
                newNodes[0] = node;
                newNodes[1] = new ValueNode(key, value);
                return(new Branch(builderToken, resultBitBask, 0, newNodes, Array.Empty <Branch>()));
            }

            newNodes[0] = new ValueNode(key, value);
            newNodes[1] = node;
            return(new Branch(builderToken, resultBitBask, 0, newNodes, Array.Empty <Branch>()));
        }
 public void Freeze()
 {
     OwnerToken = new BuilderToken();
 }
 public bool IsFrozen(BuilderToken owner)
 {
     return(!ReferenceEquals(OwnerToken, owner));
 }
 public State()
 {
     OwnerToken = new BuilderToken();
     Values     = new ArrayPooler <ValueNode>();
     Branches   = new ArrayPooler <Branch>();
 }