private bool RemoveHeap()

in csharp/src/Containers/HeapWithDictionary.cs [540:599]


		private bool RemoveHeap(TKey userKey)
		{
			int key = -1;
			if (!keys.TryGetValue(userKey, out key)) return false;
			int index = keysPosition[key];
			keys.Remove(userKey);
			int last = head;
			head = elements[index].key;
			keysPosition[head] = -last - 1;
			HeapEntry value = elements[count - 1];
			count--;
			int current = index;
			if (count == 0) return true;
			if (index == count) return true;
			while (current < count)
			{
				int left = (current << 1) + 1;
				int right = (current << 1) + 2;
				int swapIndex = current;
				if (left > count) swapIndex = current;
				else
				if (right > count)
				{
					if (comparer.Compare(elements[left].Value, value.Value) < 0) swapIndex = left;
				}
				else
				{
					if (comparer.Compare(elements[left].Value, elements[right].Value) < 0)
					{
						if (comparer.Compare(elements[left].Value, value.Value) < 0) swapIndex = left;
					}
					else if (comparer.Compare(elements[right].Value, value.Value) < 0) swapIndex = right;
				}
				if (swapIndex == current) break;
				elements[current] = elements[swapIndex];
				keysPosition[elements[current].key] = current;
				current = swapIndex;
			}
			elements[current] = value;
			keysPosition[elements[current].key] = current;
			current = index;
			value = elements[current];
			while (current != 0)
			{
				int swapIndex = (current - 1) >> 1;
				if (comparer.Compare(value.Value, elements[swapIndex].Value) < 0)
				{
					elements[current] = elements[swapIndex];
					keysPosition[elements[current].key] = current;
					current = swapIndex;
				}
				else break;
			}
			if (current != index)
			{
				elements[current] = value;
				keysPosition[elements[current].key] = current;
			}
			return true;
		}