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>(); }