internal void SetInitial(TKey key, TElement element, ref IndexedItemContainer <TElement> elements) { Key = key; var firstIndex = elements.PlaceIn(element); UsedIndexes_SingleIndex = ((uint)firstIndex) + 1; }
public bool Add(T value, ref IndexedItemContainer <T> container) { var hash = CommonImplementation.GetHashCode(value); var posHash = (hash & 0x7FFFFFFF); tryAgain: var bucketIx = posHash % Buckets.Length; // three cases // #1 - bucket is empty // #2 - bucket isn't empty, and contains the value // #3 - bucket isn't empty, and doesn't contain the value if (Buckets[bucketIx].IsDefaultValue()) { // case #1 var valueIndex = container.PlaceIn(value); Buckets[bucketIx].SetInitial(valueIndex); return(true); } else { int _; if (Buckets[bucketIx].Contains(value, ref container.Items, out _)) { // case #2 return(false); } // case #3 if (TryGrow(ref container, ref Buckets)) { goto tryAgain; } var valueIndex = container.PlaceIn(value); Buckets[bucketIx].Append(valueIndex, null); return(true); } }
internal void Add(TElement element, ref IndexedItemContainer <TElement> elements) { var nextIndex = elements.PlaceIn(element); if (ElementIndexes == null) { ElementIndexes = Allocator.Current.GetArray <int>(2); ElementIndexes[0] = (int)(UsedIndexes_SingleIndex - 1); UsedIndexes_SingleIndex = 1; } else { if (ElementIndexes.Length == UsedIndexes_SingleIndex) { Allocator.Current.ResizeArray(ref ElementIndexes, CommonImplementation.NextSize(ElementIndexes.Length)); } } ElementIndexes[UsedIndexes_SingleIndex] = nextIndex; UsedIndexes_SingleIndex++; }