コード例 #1
0
ファイル: Zone.cs プロジェクト: JVirant/DOLSharp
        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);
                    }
                }
            }
        }
コード例 #2
0
ファイル: Zone.cs プロジェクト: JVirant/DOLSharp
        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);
                    }
                }
            }
        }
コード例 #3
0
        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++;
        }
コード例 #4
0
            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);
                }
            }
コード例 #5
0
        /// <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++;
        }
コード例 #6
0
ファイル: Hashtable.cs プロジェクト: mynew4/DAoC
			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;
				}
			}
コード例 #7
0
ファイル: Hashtable.cs プロジェクト: mynew4/DAoC
		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++;
		}
コード例 #8
0
ファイル: Hashtable.cs プロジェクト: mynew4/DAoC
		/// <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++;
		}