Github user revans2 commented on a diff in the pull request:

    https://github.com/apache/storm/pull/2711#discussion_r196839436
  
    --- Diff: storm-client/src/jvm/org/apache/storm/utils/CustomIndexArray.java 
---
    @@ -0,0 +1,174 @@
    +/*
    + * Licensed to the Apache Software Foundation (ASF) under one
    + * or more contributor license agreements.  See the NOTICE file
    + * distributed with this work for additional information
    + * regarding copyright ownership.  The ASF licenses this file
    + * to you under the Apache License, Version 2.0 (the
    + * "License"); you may not use this file except in compliance
    + * with the License.  You may obtain a copy of the License at
    + *
    + * http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + */
    +
    +package org.apache.storm.utils;
    +
    +import java.util.ArrayList;
    +import java.util.HashMap;
    +import java.util.List;
    +import java.util.Map;
    +import java.util.Set;
    +import java.util.TreeSet;
    +
    +/***
    + *  A fixed size array with a customizable indexing range. The index range 
can have -ve lower / upper bound.
    + *  Intended to be a faster alternative to HashMap<Integer, .. >. Only 
applicable as a substitute if the
    + *  largest & smallest indices are known at time of creation.
    + *  This class does not inherit from :
    + *   - Map<Integer,T> : For performance reasons. The get(Object key) 
method requires key to be cast to Integer before use.
    + *   - ArrayList<T> : as this class supports negative indexes & cannot 
grow/shrink.
    + */
    +
    +public class CustomIndexArray<T>  {
    +
    +    public final int baseIndex;
    +    private final ArrayList<T> elements;
    +    private final int elemCount;
    +
    +    /**
    +     * Creates the array with (upperIndex-lowerIndex+1) elements, 
initialized to null.
    +     * @param lowerIndex Smallest (inclusive) valid index for the array. 
Can be +ve, -ve or 0.
    +     * @param upperIndex Largest  (inclusive) valid index for the array. 
Can be +ve, -ve or 0. Must be > lowerIndex
    +     */
    +    public CustomIndexArray(int lowerIndex, int upperIndex) {
    +        if (lowerIndex >= upperIndex) {
    +            throw new IllegalArgumentException("lowerIndex must be < 
upperIndex");
    +        }
    +
    +        this.baseIndex = lowerIndex;
    +        this.elemCount = upperIndex - lowerIndex + 1;
    +
    +        this.elements = makeNullInitializedArray(elemCount);
    +    }
    +
    +    private static <T> ArrayList<T> makeNullInitializedArray(int 
elemCount) {
    +        ArrayList<T> result = new ArrayList<T>(elemCount);
    +        for (int i = 0; i < elemCount; i++) {
    +            result.add(null);
    +        }
    +        return result;
    +    }
    +
    +    /**
    +     * Initializes the array with elements from a HashTable.
    +     *
    +     * @param src  the source map from which to initialize
    +     */
    +    public CustomIndexArray(Map<Integer, T> src) {
    +        Integer lowerIndex = Integer.MAX_VALUE;
    +        Integer upperIndex = Integer.MIN_VALUE;
    +
    +        for (Map.Entry<Integer, T> entry : src.entrySet()) { // calculate 
smallest & largest indexes
    +            Integer key =  entry.getKey();
    +            if (key < lowerIndex) {
    +                lowerIndex = key;
    +            }
    +            if (key > upperIndex) {
    +                upperIndex = key;
    +            }
    +        }
    +        this.baseIndex = lowerIndex;
    +        this.elemCount = upperIndex - lowerIndex + 1;
    +
    +        this.elements = makeNullInitializedArray(elemCount);
    +
    +        for (Map.Entry<Integer, T> entry : src.entrySet()) {
    +            elements.set(entry.getKey() - baseIndex, entry.getValue());
    +        }
    +    }
    +
    +    /**
    +     * Get the value at the index.
    +     * @throws IndexOutOfBoundsException if index is outside of bounds 
specified to constructor
    +     */
    +    public T get(int index) {
    +        return elements.get(index - baseIndex);
    +    }
    +
    +    /**
    +     * Set the value at the index.
    +     * @throws IndexOutOfBoundsException if index is outside of bounds 
specified to constructor
    +     */
    +    public T set(int index, T value) {
    +        return elements.set(index - baseIndex, value);
    +    }
    +
    +    /**
    +     * Returns the number of elements (including null elements).
    +     */
    +    public int size() {
    +        return elemCount;
    +    }
    +
    +    /**
    +     * Always returns true as this cannot be empty.
    +     */
    +    public boolean isEmpty() {
    --- End diff --
    
    Why have this at all.  It does not implement collection so we don't need it.


---

Reply via email to