private ScalableDictionaryNodeReference BuildNode(int level, int capacity) { ScalableDictionaryNode scalableDictionaryNode = new ScalableDictionaryNode(capacity); if (m_useFixedReferences) { return((ScalableDictionaryNodeReference)m_scalabilityCache.GenerateFixedReference(scalableDictionaryNode)); } return((ScalableDictionaryNodeReference)m_scalabilityCache.Allocate(scalableDictionaryNode, m_priority, scalableDictionaryNode.EmptySize)); }
private void EnsureCapacity(int count) { if (count <= m_capacity) { return; } if (m_array == null && m_buckets == null) { StorableArray storableArray = new StorableArray(); storableArray.Array = new object[count]; int emptySize = storableArray.EmptySize; if (m_bucketPinState == BucketPinState.UntilBucketFull || m_bucketPinState == BucketPinState.UntilListEnd) { m_array = m_cache.AllocateAndPin(storableArray, m_priority, emptySize); } else { m_array = m_cache.Allocate(storableArray, m_priority, emptySize); } m_capacity = count; } if (m_array != null) { if (count <= m_bucketSize) { int num = Math.Min(Math.Max(count, m_capacity * 2), m_bucketSize); using (m_array.PinValue()) { Array.Resize(ref m_array.Value().Array, num); } m_capacity = num; } else { if (m_capacity < m_bucketSize) { using (m_array.PinValue()) { Array.Resize(ref m_array.Value().Array, m_bucketSize); } m_capacity = m_bucketSize; } m_buckets = new ScalableList <IReference <StorableArray> >(m_priority, m_cache, 100, 10, m_bucketPinState == BucketPinState.UntilListEnd); m_buckets.Add(m_array); m_array = null; } } if (m_buckets == null) { return; } while (GetBucketIndex(count - 1) >= m_buckets.Count) { StorableArray storableArray2 = new StorableArray(); storableArray2.Array = new object[m_bucketSize]; int emptySize2 = storableArray2.EmptySize; if (m_bucketPinState == BucketPinState.UntilListEnd) { IReference <StorableArray> item = m_cache.AllocateAndPin(storableArray2, m_priority, emptySize2); m_buckets.Add(item); } else if (m_bucketPinState == BucketPinState.UntilBucketFull) { IReference <StorableArray> item = m_cache.AllocateAndPin(storableArray2, m_priority, emptySize2); m_buckets.AddAndPin(item); } else { IReference <StorableArray> item = m_cache.Allocate(storableArray2, m_priority, emptySize2); m_buckets.Add(item); } m_capacity += m_bucketSize; } }