private boolean modifyHeap()

in java/src/main/java/com/epam/deltix/containers/HeapWithDictionary.java [319:367]


    private boolean modifyHeap(int key, TValue newValue, TKey userKey) {
        if (key < 0 || key >= keysPosition.length || keysPosition[key] < 0) return false;
        int index = keysPosition[key];
        int current = index;
        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 (comparator.compare((TValue) elementsValue[left], newValue) < 0) swapIndex = left;
            } else {
                if (comparator.compare((TValue) elementsValue[left], (TValue) elementsValue[right]) < 0) {
                    if (comparator.compare((TValue) elementsValue[left], newValue) < 0) swapIndex = left;
                } else if (comparator.compare((TValue) elementsValue[right], newValue) < 0) swapIndex = right;
            }
            if (swapIndex == current) break;
            elementsValue[current] = elementsValue[swapIndex];
            elementsKey[current] = elementsKey[swapIndex];
            elementsUserKey[current] = elementsUserKey[swapIndex];
            keysPosition[elementsKey[current]] = current;
            current = swapIndex;
        }
        elementsValue[current] = newValue;
        elementsUserKey[current] = userKey;
        elementsKey[current] = key;
        keysPosition[elementsKey[current]] = current;
        current = index;
        TValue tempValue = (TValue) elementsValue[current];
        int tempKey = elementsKey[current];
        TKey tempUserKey = (TKey) elementsUserKey[current];
        while (current != 0) {
            int swapIndex = (current - 1) >> 1;
            if (comparator.compare(tempValue, (TValue) elementsValue[swapIndex]) < 0) {
                elementsValue[current] = elementsValue[swapIndex];
                elementsKey[current] = elementsKey[swapIndex];
                elementsUserKey[current] = elementsUserKey[swapIndex];
                keysPosition[elementsKey[current]] = current;
                current = swapIndex;
            } else break;
        }
        if (current != index) {
            elementsValue[current] = tempValue;
            elementsKey[current] = tempKey;
            elementsUserKey[current] = tempUserKey;
            keysPosition[elementsKey[current]] = current;
        }
        return true;
    }