private ImmutableIdDispenser(ImmutableIdDispenser left, ImmutableIdDispenser right, int used, int size, uint bitmap) { _left = left; _right = right; _used = used; _size = size; _bitmap = bitmap; CheckInvariants(); }
public ImmutableIdDispenser AllocateId(out int id) { if (_used == _size) { id = _size; return(new ImmutableIdDispenser(this, null, _size + 1, checked (2 * _size + BitsPerNode), 1)); } var bitmap = _bitmap; var left = _left; var right = _right; // Any free bits in current node? if (bitmap != uint.MaxValue) { int bit = 0; while ((bitmap & (uint)(1 << bit)) != 0) { bit++; } bitmap |= (uint)(1 << bit); id = ChildSize + bit; } else { Debug.Assert(ChildSize > 0); if (left == null) { left = new ImmutableIdDispenser(null, null, 1, ChildSize, 1); id = left.ChildSize; } else if (right == null) { right = new ImmutableIdDispenser(null, null, 1, ChildSize, 1); id = ChildSize + BitsPerNode + right.ChildSize; } else { if (left._used < right._used) { Debug.Assert(left._used < left._size); left = left.AllocateId(out id); } else { Debug.Assert(right._used < right._size); right = right.AllocateId(out id); id += (ChildSize + BitsPerNode); } } } return(new ImmutableIdDispenser(left, right, _used + 1, _size, bitmap)); }
public ImmutableIdDispenser AllocateId(out int id) { if (_used == _size) { id = _size; return new ImmutableIdDispenser(this, null, _size + 1, checked(2 * _size + BitsPerNode), 1); } var bitmap = _bitmap; var left = _left; var right = _right; // Any free bits in current node? if (bitmap != UInt32.MaxValue) { int bit = 0; while ((bitmap & (uint)(1 << bit)) != 0) bit++; bitmap |= (uint)(1 << bit); id = ChildSize + bit; } else { Debug.Assert(ChildSize > 0); if (left == null) { left = new ImmutableIdDispenser(null, null, 1, ChildSize, 1); id = left.ChildSize; } else if (right == null) { right = new ImmutableIdDispenser(null, null, 1, ChildSize, 1); id = ChildSize + BitsPerNode + right.ChildSize; } else { if (left._used < right._used) { Debug.Assert(left._used < left._size); left = left.AllocateId(out id); } else { Debug.Assert(right._used < right._size); right = right.AllocateId(out id); id += (ChildSize + BitsPerNode); } } } return new ImmutableIdDispenser(left, right, _used + 1, _size, bitmap); }