private void PlaceElementsInOtherZones(DOL.GS.Collections.Hashtable elements) { DOL.GS.Collections.DictionaryEntry currentEntry = null; int currentType = 0; ArrayList currentList = null; Zone currentZone = null; SubNodeElement currentElement = null; IEnumerator entryEnumerator = elements.GetEntryEnumerator(); while (entryEnumerator.MoveNext()) { currentEntry = (DOL.GS.Collections.DictionaryEntry)entryEnumerator.Current; currentType = (int)currentEntry.key; currentList = (ArrayList)currentEntry.value; for (int i = 0; i < currentList.Count; i++) { currentElement = (SubNodeElement)currentList[i]; currentZone = ZoneRegion.GetZone(currentElement.data.Position); if (currentZone != null) { currentZone.ObjectEnterZone((eGameObjectType)currentType, currentElement); } } } }
private void PlaceElementsInZone(DOL.GS.Collections.Hashtable elements) { DOL.GS.Collections.DictionaryEntry currentEntry = null; ArrayList currentList = null; SubNodeElement currentStartElement = null; SubNodeElement currentElement = null; IEnumerator entryEnumerator = elements.GetEntryEnumerator(); while (entryEnumerator.MoveNext()) { currentEntry = (DOL.GS.Collections.DictionaryEntry)entryEnumerator.Current; currentStartElement = (SubNodeElement)currentEntry.key; currentList = (ArrayList)currentEntry.value; lock (currentStartElement) { for (int i = 0; i < currentList.Count; i++) { currentElement = (SubNodeElement)currentList[i]; currentStartElement.PushBack(currentElement); } } } }
public void Add(object key, object value) { int bucketNumber = (key.GetHashCode() & Int32.MaxValue) % BUCKET_NUMBER; for (int i = bucketListIndexes[bucketNumber]; i < nextInsertIndex[bucketNumber]; i++) { if (internalArray[i].key.Equals(key)) { // object found => replace associated value internalArray[i].value = value; return; } } // object not found // => add it DictionaryEntry entry = new DictionaryEntry(); entry.key = key; entry.value = value; if (nextInsertIndex[bucketNumber] >= bucketListIndexes[bucketNumber + 1]) { // current bucket list is full if (LoadFactor >= loadFactor) { //Console.WriteLine(this.GetType() + " LoadFactor exceeded - rehashing... (" + loadFactor + ", " + LoadFactor + ")"); Rehash(); ForceAdd(entry); return; } // try to get a slot from another bucket int usedBucket = GetForwardFreeSlot(bucketNumber); if (usedBucket == -1) { usedBucket = GetBackwardFreeSlot(bucketNumber); } if ((usedBucket == -1) || (FastMath.Abs(usedBucket - bucketNumber) >= 7)) { // no free slots left or getting one becomes too costly Rehash(); ForceAdd(entry); return; } } // normal add (a free slot has been granted by another bucket or there was enough space left in this bucket) internalArray[nextInsertIndex[bucketNumber]++] = entry; usedSlots++; }
public bool MoveNext() { while ((currentIndex < table.internalArray.Length) && (currentIndex >= table.nextInsertIndex[currentBucketNumber])) { currentIndex = table.bucketListIndexes[++currentBucketNumber]; } if (currentIndex >= table.internalArray.Length) { return(false); } else { currentEntry = table.internalArray[currentIndex++]; return(true); } }
/// <summary> /// IMPORTANT : /// 1) may ONLY called after a rehash has occured /// 2) internalArray MUST have enough space to store gameObject (ensured by rehash()) /// 3) gameObject may NOT be in internalArray already /// /// If for some reasons, the 3 statements above were not fulfilled, the structure may be corrupt !!!!! /// </summary> /// <param name="entry"></param> private void ForceAdd(DictionaryEntry entry) { int bucketNumber = (entry.key.GetHashCode() & Int32.MaxValue) % BUCKET_NUMBER; if (nextInsertIndex[bucketNumber] >= bucketListIndexes[bucketNumber + 1]) { // current bucket list is full // try to get a slot from another bucket int usedBucket = GetForwardFreeSlot(bucketNumber); if (usedBucket == -1) { usedBucket = GetBackwardFreeSlot(bucketNumber); } } // normal add (a free slot has been granted by another bucket or there was enough space left in this bucket) internalArray[nextInsertIndex[bucketNumber]++] = entry; usedSlots++; }
public bool MoveNext() { while ((currentIndex < table.internalArray.Length) && (currentIndex >= table.nextInsertIndex[currentBucketNumber])) { currentIndex = table.bucketListIndexes[++currentBucketNumber]; } if (currentIndex >= table.internalArray.Length) { return false; } else { currentEntry = table.internalArray[currentIndex++]; return true; } }