// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab

package org.mariadb.jdbc.util;

import java.util.Arrays;
import org.mariadb.jdbc.client.util.Parameter;
import org.mariadb.jdbc.client.util.Parameters;

public class ParameterList implements Parameters, Cloneable {
  Parameter[] elementData;
  int length;

  public ParameterList(int defaultSize) {
    elementData = new Parameter[defaultSize];
    length = 0;
  }

  public ParameterList() {
    elementData = new Parameter[10];
    length = 0;
  }

  public Parameter get(int index) {
    if (index >= length)
      throw new ArrayIndexOutOfBoundsException("wrong index " + index + " length:" + length);
    return elementData[index];
  }

  public boolean containsKey(int index) {
    if (index >= 0 && length > index) {
      return elementData[index] != null;
    }
    return false;
  }

  public void set(int index, Parameter element) {
    if (elementData.length <= index) grow(index + 1);
    elementData[index] = element;
    if (index >= length) length = index + 1;
  }

  public int size() {
    return length;
  }

  private void grow(int minLength) {
    int currLength = elementData.length;
    int newLength = Math.max(currLength + (currLength >> 1), minLength);
    elementData = Arrays.copyOf(elementData, newLength);
  }

  @Override
  public ParameterList clone() {
    ParameterList param = new ParameterList(length);
    if (length > 0) System.arraycopy(elementData, 0, param.elementData, 0, length);
    param.length = length;
    return param;
  }
}
